用于脑电信号(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]);
相关推荐
我爱C编程9 小时前
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
网络·matlab·ecc·密钥管理·无线传感器网络·簇内分组
guygg8810 小时前
二维电子气在三角形势阱中的量子特性计算
matlab
KWTXX12 小时前
使用matlab官网的skills调用claude-待完成
开发语言·matlab
彬鸿科技15 小时前
bhSDR Studio/Matlab入门指南(十二):AI神经网络训练(Resnet-SE) 实验界面全解析
人工智能·神经网络·matlab·软件无线电·sdr
词元Max15 小时前
4.1 监督学习入门:线性回归与分类
学习·分类·线性回归
rit843249916 小时前
链路预测(Link Prediction)MATLAB 实现
开发语言·matlab
yugi98783816 小时前
MATLAB CNN道路特征提取实现
人工智能·matlab·cnn
yongui4783417 小时前
基于稀疏低秩分解的图像去噪MATLAB实现
开发语言·matlab
gihigo199817 小时前
MATLAB实现光谱特征波长提取
开发语言·matlab
fie888917 小时前
matlab打靶法求解两点边值优化问题
开发语言·算法·matlab