信号处理--基于EEG脑电信号的深度学习情绪分类

这篇具有很好参考价值的文章主要介绍了信号处理--基于EEG脑电信号的深度学习情绪分类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文为一个信号处理专题的课程项目,主要是基于人体脑电信号,通过使用深度学习,来快速精准的识别被试的情绪。实验数据为私有数据集。情绪分为积极,中性,消极三种类别。该方法最后和传统朴素贝叶斯,支持向量机,logistic回归,决策树和随机森林分类器进行比较。

 

目录

1 加载主要库函数

2 检查eeg脑电信号和数据预处理

2.1 绘制不同种类数据大小比例分布图

2.2 显示积极情绪的脑电信号

2.3 显示消极情绪的脑电信号

2.4 显示中性情绪的脑电信号

2.5 数据的预处理

3 搭建LSTM深度学习模型

3.1 定义模型的构建函数

3.2 构建模型

3.3 模型训练和测试

3.4 使用confusion matrix 评估模型

4 和其他传统模型性能比较

5 绘制模型训练loss和准确率


1 加载主要库函数

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
import tensorflow 
from sklearn.model_selection import train_test_split
from tensorflow.keras.utils import to_categorical
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.optimizers import SGD

from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.layers import Embedding
from tensorflow.keras.layers import LSTM
tf.keras.backend.clear_session()
from sklearn.metrics import plot_confusion_matrix
from sklearn import datasets, tree, linear_model, svm
from sklearn.metrics import confusion_matrix,classification_report
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB

from sklearn.metrics import confusion_matrix,classification_report
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import confusion_matrix

import seaborn as sns

2 检查eeg脑电信号和数据预处理

data = pd.read_csv("../input/eeg-brainwave-dataset-feeling-emotions/emotions.csv")

#Seprarting Positive,Neagtive and Neutral dataframes for plortting
pos = data.loc[data["label"]=="POSITIVE"]
sample_pos = pos.loc[2, 'fft_0_b':'fft_749_b']
neg = data.loc[data["label"]=="NEGATIVE"]
sample_neg = neg.loc[0, 'fft_0_b':'fft_749_b']
neu = data.loc[data["label"]=="NEUTRAL"]
sample_neu = neu.loc[1, 'fft_0_b':'fft_749_b']

2.1 绘制不同种类数据大小比例分布图

#plottintg Dataframe distribution
plt.figure(figsize=(25,7))
plt.title("Data distribution of Emotions")
plt.style.use('fivethirtyeight')
sns.countplot(x='label', data=data)
plt.show()

eeg信号处理,深度学习知识点浅析,信号处理,计算机视觉,人工智能,分类

2.2 显示积极情绪的脑电信号

#Plotting Positive DataFrame
plt.figure(figsize=(16, 10))
plt.plot(range(len(sample_pos)), sample_pos)
plt.title("Graph of Positive Columns")
plt.show()
'''As we can noticed the most of the Negative Signals are from greater than 600 to and less than than -600'''

 eeg信号处理,深度学习知识点浅析,信号处理,计算机视觉,人工智能,分类

2.3 显示消极情绪的脑电信号

#Plotting Negative DataFrame
plt.figure(figsize=(16, 10))
plt.plot(range(len(sample_neg)), sample_neg)
plt.title("Graph of Negative Columns")
plt.show()

 eeg信号处理,深度学习知识点浅析,信号处理,计算机视觉,人工智能,分类

 2.4 显示中性情绪的脑电信号

#Plotting Neutral DataFrame
plt.figure(figsize=(16, 10))
plt.plot(range(len(sample_neu)), sample_neu)
plt.title("Graph of Neutral Columns")
plt.show()

 eeg信号处理,深度学习知识点浅析,信号处理,计算机视觉,人工智能,分类

 2.5 数据的预处理

def Transform_data(data):
    #Encoding Lables into numbers
    encoding_data = ({'NEUTRAL': 0, 'POSITIVE': 1, 'NEGATIVE': 2} )
    data_encoded = data.replace(encoding_data)
    #getting brain signals into x variable
    x=data_encoded.drop(["label"]  ,axis=1)
    #getting labels into y variable
    y = data_encoded.loc[:,'label'].values
    scaler = StandardScaler()
    #scaling Brain Signals
    scaler.fit(x)
    X = scaler.transform(x)
    #One hot encoding Labels 
    Y = to_categorical(y)
    return X,Y
#Calling above function and splitting dataset into train and test
X,Y = Transform_data(data)
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size = 0.2, random_state = 4)

3 搭建LSTM深度学习模型

3.1 定义模型的构建函数

def create_model():
    #input layer of model for brain signals
    inputs = tf.keras.Input(shape=(x_train.shape[1],))
    #Hidden Layer for Brain signal using LSTM(GRU)
    expand_dims = tf.expand_dims(inputs, axis=2)

    gru = tf.keras.layers.GRU(256, return_sequences=True)(expand_dims)
    #Flatten Gru layer into vector form (one Dimensional array)
    flatten = tf.keras.layers.Flatten()(gru)
    #output latyer of Model
    outputs = tf.keras.layers.Dense(3, activation='softmax')(flatten)


    model = tf.keras.Model(inputs=inputs, outputs=outputs)
    print(model.summary())
    return model

3.2 构建模型

#cretaing model
lstmmodel = create_model()
#Compiling model 
lstmmodel.compile(
    optimizer='adam',
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

eeg信号处理,深度学习知识点浅析,信号处理,计算机视觉,人工智能,分类

3.3 模型训练和测试

#Training and Evaluting model
history = lstmmodel.fit(x_train, y_train, epochs = 10, validation_split=0.1)
loss, acc = lstmmodel.evaluate(x_test, y_test)
#Loss and Accuracy of model on Testiong Dataset 
print(f"Loss on testing: {loss*100}",f"\nAccuracy on Training: {acc*100}")
#predicting model on test set for plotting Confusion Matrix
pred  = lstmmodel.predict(x_test)

 3.4 使用confusion matrix 评估模型

#Creation of Function of Confusion Matrix
def plot_confusion_matrix(cm, names, title='Confusion matrix', cmap=plt.cm.Blues):
    plt.imshow(cm, interpolation='nearest', cmap=cmap)
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(data.label.unique()))
    plt.xticks(tick_marks, names, rotation=90)
    plt.yticks(tick_marks, names)
    plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')


#after getting prediction checking maximum score prediction to claim which emotion this brain signal belongs to
pred1 = np.argmax(pred,axis=1)


#inversing the one hot encoding
y_test1 =   np.argmax(y_test,axis=1)



#printing first 10 Actual and predicted outputs of Test brain signals 
print("Predicted:  ",pred1[:10])
print("\n")
print("Actual: ",y_test1[:10])



#Plotting Confusion matrix of Lstm Model
cm = confusion_matrix(y_test1, pred1)
np.set_printoptions(precision=2)
print('Confusion matrix, without normalization')
print(cm)
plt.rcParams["figure.figsize"]=(20,5)
plt.figure()
plot_confusion_matrix(cm,["Neutral","Positive","Negative"])

eeg信号处理,深度学习知识点浅析,信号处理,计算机视觉,人工智能,分类

 

4 和其他传统模型性能比较

names1 = ["Neutral","Positive","Negative"]
#Training our dataset on different Classifiers to check the results and creating their classification reports
#NAves Bayes Clssifier
Classifier_gnb = GaussianNB().fit(x_train, np.argmax(y_train,axis=1))
pred_gnb = Classifier_gnb.predict(x_test)
print ('\n*\t\tClassification Report GNB:\n', classification_report(np.argmax(y_test,axis=1), pred_gnb))
confusion_matrix_graph = confusion_matrix(np.argmax(y_test,axis=1), pred_gnb)
### Support Vector Machine

Classifier_svm = svm.SVC(kernel='linear').fit(x_train, np.argmax(y_train,axis=1))
pred_svm = Classifier_svm.predict(x_test)
print ('\n*\t\tClassification Report SVM:\n', classification_report(np.argmax(y_test,axis=1), pred_svm))
confusion_matrix_graph = confusion_matrix(np.argmax(y_test,axis=1), pred_svm)
### Logistic Regression

Classifier_LR = linear_model.LogisticRegression(solver = 'liblinear', C = 75).fit(x_train, np.argmax(y_train,axis=1))
pred_LR = Classifier_LR.predict(x_test)
print ('\n*\t\tClassification Report LR:\n', classification_report(np.argmax(y_test,axis=1), pred_LR))
confusion_matrix_graph = confusion_matrix(np.argmax(y_test,axis=1), pred_LR)
### Decision Tree Regressor

Classifier_dt = tree.DecisionTreeClassifier().fit(x_train, np.argmax(y_train,axis=1))
pred_dt = Classifier_dt.predict(x_test)
print ('\n*\t\tClassification Report Deccsion Tree:\n', classification_report(np.argmax(y_test,axis=1), pred_dt))
confusion_matrix_graph = confusion_matrix(np.argmax(y_test,axis=1), pred_dt)
### Random Forest

Classifier_forest = RandomForestClassifier(n_estimators = 50, random_state = 0).fit(x_train,np.argmax(y_train,axis=1))
pred_fr = Classifier_dt.predict(x_test)


print ('\n*\t\tClassification Report Random Forest:\n', classification_report(np.argmax(y_test,axis=1), pred_fr))
confusion_matrix_graph = confusion_matrix(np.argmax(y_test,axis=1), pred_fr)
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(15,10))
classifiers = [GaussianNB(),svm.SVC(kernel='linear'),
               linear_model.LogisticRegression(solver = 'liblinear', C = 75),
               RandomForestClassifier(n_estimators = 50, random_state = 0)]
from sklearn.metrics import plot_confusion_matrix
for cls in classifiers:
    cls.fit(x_train,np.argmax(y_train,axis=1))
    
colors = [ 'YlOrBr', 'GnBu', 'Pastel2', 'PuRd']
for cls, ax,c in zip(classifiers, axes.flatten(),colors):
    plot_confusion_matrix(cls, 
                          x_test, 
                          np.argmax(y_test,axis=1), 
                          ax=ax, 
                          cmap=c,
                         display_labels= names1)
    ax.title.set_text(type(cls).__name__)
plt.tight_layout()  
plt.show()

eeg信号处理,深度学习知识点浅析,信号处理,计算机视觉,人工智能,分类

 

eeg信号处理,深度学习知识点浅析,信号处理,计算机视觉,人工智能,分类

 eeg信号处理,深度学习知识点浅析,信号处理,计算机视觉,人工智能,分类

 

#Classification Report of Lstm model
print('\n*\t\tClassification Report OF Brain Waves LSTM:\n', classification_report(np.argmax(y_test,axis=1), np.argmax(lstmmodel.predict(x_test),axis=1) ))

eeg信号处理,深度学习知识点浅析,信号处理,计算机视觉,人工智能,分类

  

5 绘制模型训练loss和准确率

#Plotting Graph of Lstm model Training, Loss and Accuracy
plt.style.use("fivethirtyeight")
plt.figure(figsize = (20,6))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title("Model Loss",fontsize=20)
plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(['train loss', 'validation loss'], loc ='best')

plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title("Model Accuracy",fontsize=20)
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend(['training accuracy', 'validation accuracy'], loc ='best')
plt.show()

 文章来源地址https://www.toymoban.com/news/detail-739254.html

到了这里,关于信号处理--基于EEG脑电信号的深度学习情绪分类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 脑电信号处理与特征提取——5.频谱分析和时频分析(张治国)

    目录 五、频谱分析和时频分析 5.1 频谱估计 5.1.1 基本概念 5.1.2 频谱估计方法:周期图 5.1.3 频谱估计方法:Welch法 5.1.4 频谱估计方法的比较 5.1.5 频谱特征提取  5.2 时频分析 5.2.1 短时傅里叶变换 5.2.2 连续小波变换 5.3 事件相关同步化/去同步化 静息态脑电: 没有刺激的情况下

    2024年02月15日
    浏览(40)
  • 脑电图(EEG)信号去噪方法简述

    前言 脑电图作为目前研究最为广泛的认知大脑的方式之一,其无创性、便携性、廉价等优点都表明该方式具有巨大的发展空间。但是由于颅骨和头皮对于电信号的传输影响,从头皮采集的电信号往往混杂着非常多的噪声,并且有效信息又非常少,所以对于去处噪声的算法的要

    2023年04月24日
    浏览(36)
  • 深度学习在物理层信号处理中的应用研究

    随着移动流量呈现的爆发式增长、高可靠性和低时延的通信场景给当前网络带来了更大的复杂性和计算挑战。据IBM报道,移动数据量到2020年将超过40万亿Gbits,比2009年增加44倍,连接总设备量将达到500亿。为了满足这一需求,需要新的通信理论和创新技术来满足5G系统的需求。

    2024年01月25日
    浏览(42)
  • 【数字信号处理课程设计】基于MATLAB实现语音信号的采集与处理(偏重滤波)

    目录 一、目标与任务 二、原理介绍 2.1 录音原理 2.2 滤波器的设计原理及设计方法 2.3 IIR 数字滤波器设计原理 2.4 双线性变换法 三、GUI界面设计与实现 四、基于MATLAB仿真 4.1实验过程 4.2 结果分析 五、总结 5.1 函数用法总结 5.2 心得体会 六、参考文献 这个项目在我的B站上有专

    2024年01月18日
    浏览(52)
  • 基于matlab的语音信号处理

    摘要 利用所学习的数字信号处理知识,设计了一个有趣的音效处理系统,首先设计了几种不同的滤波器对声音进行滤波处理,分析了时域和频域的变化,比较了经过滤波处理后的声音与原来的声音有何变化。同时设计实现了语音的倒放,变速播放,回响,音调转换等处理效果

    2024年02月08日
    浏览(44)
  • 数字信号处理学习1

    基本上算是没怎么学过数字信号处理这门课,因为本科的时候,专业方向用不上,现在没法子了,专业使然,只能自己自学了,但是我又不知道该从何学起,就买了一本现代数字信号处理,结果发现人家把第一章基础知识给删了,这我就斯巴达了。。。所以就又搞了本绿皮的

    2024年02月02日
    浏览(50)
  • 【Linux学习】信号——信号保存 | 信号处理 | 不可重入函数,volatile,SIGCHLD信号

    🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言: 你只管努力,剩下的交给时间! 信号的产生以及详细讲解了,有兴趣的小伙伴可以去看看,传送门。接下来介绍信号的保存和信号处理。 首先介绍几个新的概念: 信号递达(Delivery):实际执行信号的处理动作。 信号

    2023年04月14日
    浏览(41)
  • 【信号处理】基于CNN自编码器的心电信号异常检测识别(tensorflow)

    本项目主要实现卷积自编码器对于异常心电ECG信号的检测和识别,属于无监督学习中的生理信号检测的典型方法之一。   读取心电信号 信号可视化    信号均值计算及可视化  训练/测试数据划分 搭建自编码器 模型训练 训练可视化   信号重建可视化 计算重建MAE误差  异常

    2024年04月23日
    浏览(40)
  • 【matalab】基于Octave的信号处理与滤波分析案例

    GNU Octave是一款开源软件,类似于MATLAB,广泛用于数值计算和信号处理。 一个简单的信号处理与滤波分析案例,说明如何在Octave中生成一个有噪声的信号,并设计一个滤波器来去除噪声。 首先,确保安装了Octave。可以从Octave官网下载并安装:GNU Octave 案例步骤如下: 1. 生成一

    2024年02月19日
    浏览(34)
  • 学习系统编程No.27【深入信号处理】

    北京时间:2023/6/27/21:43,刚刚更新完这个星期的第一篇博客,现在刚好趁热打铁,看看写到11点左右,该篇博客能完成多少,并且今天和我预想的一样,通过早睡,成功在7点起床,但是由于一些列原因,导致我们起床洗漱,吃完饭之后,又睡过去了,并且一睡就睡到了10点,

    2024年02月13日
    浏览(98)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包