用于脑电信号(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]);
相关推荐
2601_9507607916 小时前
树突状细胞亚群的分类、标志物与功能特征
人工智能·分类·数据挖掘·蛋白
Funing717 小时前
STM32 电机动态 PI 控制:从编码器反馈、增量式 PI 到 Matlab 参数拟合与 PWM 输出
stm32·嵌入式硬件·matlab·pi控制算法
zq_638919 小时前
利用 MATLAB 调用 STK Object Model COM 显示雷达受干扰前后探测范围的变化
开发语言·matlab
zq_638921 小时前
ObjectModel_diagram.pdf 文档详细总结
开发语言·matlab
88号技师1 天前
2026年SCI-分数牛顿衍生优化算法Fractional Newton-derived optimizer-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
民乐团扒谱机1 天前
【读论文】2005 一种旋律转录的分类方法A classification approach to melody transcription[C]
人工智能·分类·数据挖掘
机器学习之心1 天前
LSTM神经网络+SHAP可解释性分析+NSGA-II工艺参数优化,从预测到可解释性再到多目标优化的全流程实战,MATLAB代码
神经网络·matlab·lstm·shap可解释性分析·nsga-ii工艺参数优化
Logintern092 天前
[Matlab] 遗传算法求解TSP入门
开发语言·matlab
我爱C编程2 天前
基于BP译码和用户RMA解码的LT码实现及度分布设计matlab实现和误码仿真
matlab·bp译码·rma解码·lt码·度分布
民乐团扒谱机3 天前
【微实验】物理启发神经网络(PINN):当AI学会遵守物理定律(附matlab代码))
人工智能·神经网络·matlab