基于 Matlab(含 EEGLab / BioSig / Statistics Toolbox)。
一、EEG + SVM 标准流程
原始 EEG
↓
预处理(滤波 / 去伪迹)
↓
分段 Epoch(试次)
↓
特征提取(CSP / 功率谱 / 时域)
↓
标准化(Z-score)
↓
SVM 训练 / 测试
↓
准确率 / 混淆矩阵 / Kappa
SVM 对特征尺度极其敏感,一定要标准化!
二、最简可用示例(Matlab)
二分类 SVM(线性核)
matlab
%% 假设:
% X: [N_trials × N_features]
% y: [N_trials × 1] (-1 / +1)
% 标准化
X = zscore(X);
% 训练 SVM
svmModel = fitcsvm( ...
X, y, ...
'KernelFunction', 'linear', ...
'BoxConstraint', 1, ...
'Standardize', false); % 已手动标准化
% 预测
y_pred = predict(svmModel, X_test);
% 准确率
acc = mean(y_pred == y_test);
fprintf('Accuracy = %.2f%%\n', acc * 100);
三、BCI 黄金组合:CSP + SVM
运动想象(MI)EEG 的标准解法
1、CSP 特征提取(Matlab)
matlab
%% 输入
% X1: [通道 × 时间 × 试次] 类别1
% X2: [通道 × 时间 × 试次] 类别2
[cspW, ~] = csp(X1, X2, 4); % 取前4个 + 后4个成分
%% 提取特征
features = zeros(size(X1,3)+size(X2,3), 8);
idx = 1;
for i = 1:size(X1,3)
proj = cspW' * squeeze(X1(:,:,i));
features(idx,:) = log(var(proj));
idx = idx + 1;
end
for i = 1:size(X2,3)
proj = cspW' * squeeze(X2(:,:,i));
features(idx,:) = log(var(proj));
idx = idx + 1;
end
2、CSP + SVM 训练
matlab
features = zscore(features);
svmModel = fitcsvm( ...
features, labels, ...
'KernelFunction', 'linear', ...
'BoxConstraint', 0.5);
y_pred = predict(svmModel, zscore(test_features));
acc = mean(y_pred == test_labels);
BCI Competition IV 2a 数据集:75%~85%
四、多分类 SVM(MI 四类)
matlab
svmModel = fitcecoc( ...
features, labels, ...
'Learners','svm', ...
'Coding','onevsone');
y_pred = predict(svmModel, test_features);
五、EEG 常用特征
频带能量
matlab
fs = 250;
band = [8 13]; % Alpha
[f, pxx] = pwelch(eeg, [], [], [], fs);
idx = f >= band(1) & f <= band(2);
feature = log(sum(pxx(idx)));
Hjorth 参数
matlab
dx = diff(eeg);
ddx = diff(dx);
activity = var(eeg);
mobility = sqrt(var(dx)/var(eeg));
complexity = mobility/dx;
参考代码 用于脑电信号分类的SVM分类器 www.youwenfan.com/contentcsu/63400.html
六、交叉验证
matlab
cv = cvpartition(labels, 'KFold', 5);
acc = zeros(cv.NumTestSets,1);
for i = 1:cv.NumTestSets
trainIdx = training(cv,i);
testIdx = test(cv,i);
svm = fitcsvm(features(trainIdx,:), labels(trainIdx), ...
'KernelFunction','linear');
pred = predict(svm, features(testIdx,:));
acc(i) = mean(pred == labels(testIdx));
end
fprintf('5-fold CV Accuracy: %.2f ± %.2f\n', ...
mean(acc)*100, std(acc)*100);
七、SVM 参数调优
matlab
opts = struct( ...
'OptimizeHyperparameters','auto', ...
'HyperparameterOptimizationOptions', ...
struct('AcquisitionFunctionName','expected-improvement'));
svm = fitcsvm(features, labels, 'KernelFunction','rbf', opts);
八、EEG 预处理推荐
matlab
eeglab
EEG = pop_loadset('filename.set');
EEG = pop_chanedit(EEG);
EEG = pop_ica(EEG);
EEG = pop_epoch(EEG, {'stim'}, [-1 3]);