脑电情绪识别是一个复杂的任务,通常需要使用深度学习模型来提高准确性。以下是一个简单的脑电情绪识别的示例代码,使用卷积神经网络(CNN)进行特征提取和分类。
首先,我们需要加载数据集。这里我们使用DEAP(Database for Emotion Analysis using Physiological signals)数据集。
```
import numpy as np
import pandas as pd
# load data
data = pd.read_csv('data/deap/data_preprocessed_python/data.csv')
labels = pd.read_csv('data/deap/data_preprocessed_python/labels.csv')
```
接下来,我们需要对数据进行预处理。在这个例子中,我们将使用前 30 秒的脑电图(EEG)数据,并将其重新采样为 128 Hz。我们还将标签处理为二进制值(高兴/不高兴)。
```
from scipy import signal
# preprocess data
def preprocess(data, labels):
# select first 30 seconds
data = data[:, :, :128*30]
# resample to 128 Hz
data = signal.resample(data, num=128*30, axis=2)
# convert labels to binary (happy/sad)
labels = labels.mean(axis=1)
labels[labels >= 5] = 1
labels[labels < 5] = 0
return data, labels
data, labels = preprocess(data, labels)
```
接下来,我们可以将数据集划分为训练集和测试集,并使用 CNN 进行特征提取和分类。
```
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from sklearn.model_selection import train_test_split
# split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2)
# build CNN model
model = tf.keras.models.Sequential([
Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=X_train.shape[1:]),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.25),
Conv2D(64, kernel_size=(3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Dropout(0.25),
Flatten(),
Dense(128, activation='relu'),
Dropout(0.5),
Dense(1, activation='sigmoid')
])
# compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# train model
model.fit(X_train, y_train, batch_size=32, epochs=10, validation_data=(X_test, y_test))
```
最后,我们可以使用测试集来评估模型的准确性。
```
# evaluate model
score = model.evaluate(X_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
```