用于脑电信号(EEG)分类的 SVM 分类器 Matlab 实现

基于 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]);
相关推荐
m沐沐2 天前
【自然语言处理】词向量转换与中文文本情感分类——从CountVectorizer到朴素贝叶斯
人工智能·算法·机器学习·自然语言处理·分类·中文分词·词向量转换
chhttty3 天前
MAB建模规范:Simulink外观规范
matlab·simulink
段一凡-华北理工大学3 天前
AI推动工业智能化转型~系列文章07:分类与诊断算法体系:故障识别的完整工具箱
数据库·人工智能·算法·机器学习·分类·数据挖掘·高炉炼铁智能化
机器学习之心3 天前
CCD实验设计+SVM代理建模+改进NSGA-II工艺参数多目标优化,MATLAB代码
算法·支持向量机·matlab·多目标优化
泛泛7辈3 天前
通过matlab训练和验证深度学习的目标检测
深度学习·目标检测·matlab
hhzz3 天前
机器学习-算法模型系列文章:07-SVM 一巴掌拍出来的超平面:SVM核函数选错,再干净的数据也救不了你
算法·机器学习·支持向量机
酷在前行3 天前
【R模型】R语言随机森林分类进阶:交叉验证、调参与独立测试(保姆级教程)
随机森林·分类·r语言
daad7774 天前
记录matlab状态机demo
java·网络·matlab
吃好睡好便好4 天前
MATLAB中图像的线性变换
开发语言·图像处理·学习·计算机视觉·matlab