用于脑电信号(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]);
相关推荐
jghhh0135 分钟前
燃料电池电源 Matlab 仿真方案
开发语言·matlab
zhangfeng11333 小时前
openclaw skills 小龙虾技能 通讯仿真 matlab skill Simulink Agentic Toolkit,通过kimi找到,mcp通讯
开发语言·matlab·openclaw·通讯仿真
chao18984410 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
沪漂阿龙10 小时前
AI大模型面试题:支持向量机是什么?间隔最大化、软间隔、核函数、LinearSVC 全面拆解
人工智能·算法·支持向量机
yongui4783416 小时前
基于 GA 优化的 BP 神经网络算法分析与 MATLAB 实现
神经网络·算法·matlab
rit843249917 小时前
基于 MATLAB 的坐标变换程序
开发语言·matlab
listhi52018 小时前
LTE标准下Turbo码编译码仿真
算法·matlab
fie888918 小时前
城市环境下车辆目标跟踪算法 MATLAB 实现
算法·matlab·目标跟踪
机器学习之心19 小时前
轴承剩余寿命预测 | 基于BP神经网络的轴承剩余寿命预测MATLAB实现!
人工智能·神经网络·matlab·轴承剩余寿命预测