用于脑电信号(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]);
相关推荐
运维行者_13 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
chhttty19 小时前
Simulink电机控制框架
matlab·simulink
开开心心就好19 小时前
本地文件搜索工具,双击Ctrl就能呼出搜索
java·服务器·前端·支持向量机·ffmpeg·音视频·模拟退火算法
IT研究室20 小时前
最新计算机毕业设计选题推荐-基于深度学习的塑料类型图像分类研究-运行部署-文档指导-深度学习-YOLO
深度学习·分类·课程设计
星夜离尘561 天前
MATLAB 工程实验:不等间隔流量积分,先把缺口与覆盖率说清楚
开发语言·matlab·时间戳·数据质量·数值积分
大江东去浪淘尽千古风流人物2 天前
【HIMO】跨模态图像匹配算法:IMO方向场提取与PolarP描述符源码精讲
matlab·跨模态·遥感·图像匹配·1024程序员节·特征描述符
星夜离尘562 天前
MATLAB 因果采样保持:用历史匹配和数据年龄防止未来信息泄漏
数据结构·算法·matlab
这张生成的图像能检测吗2 天前
(论文速读)ClassBD:让盲反卷积与故障分类器协同学习的抗噪轴承诊断方法
分类·信号处理·故障诊断·去噪
星夜离尘563 天前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
风巽·剑染春水4 天前
【数据处理】Matlab 环境下安装 SPM 与 CAT 工具并进行脑核磁数据预处理
matlab·spm·cat·脑部核磁·t1w图像