基于支持向量机(SVM)的P300检测分类MATLAB实现,包含数据预处理、特征提取和分类评估流程:
%% P300检测分类完整流程(SVM实现)
clc; clear; close all;
%% 1. 数据加载与模拟生成(实际应用需替换为真实数据)
% 生成模拟EEG数据(实际应加载真实数据)
[sampleRate, numChannels, numTrials, trialLength] = deal(250, 32, 200, 500); % 参数设置
data = randn(numChannels, trialLength, numTrials); % 模拟EEG数据
labels = randi([0 1], 1, numTrials); % 0=非目标,1=目标刺激
%% 2. 数据预处理
% 2.1 滤波处理(带通滤波0.1-30Hz)
[b,a] = butter(4, [0.1 30]/(sampleRate/2)); % 4阶巴特沃斯滤波器
filteredData = zeros(size(data));
for i = 1:numChannels
filteredData(i,:,:) = filtfilt(b,a,squeeze(data(i,:,:)));
end
% 2.2 分段处理(基于事件时间窗口)
windowStart = 300; % 刺激后300ms开始
windowEnd = 600; % 窗口长度300ms
timePoints = windowStart:windowEnd;
preprocessedData = zeros(numChannels, numel(timePoints), numTrials);
for trial = 1:numTrials
% 找到对应时间窗口的样本索引
startIdx = round((windowStart/sampleRate)*sampleRate) + 1;
endIdx = round((windowEnd/sampleRate)*sampleRate);
preprocessedData(:,:,trial) = filteredData(:,startIdx:endIdx);
end
%% 3. 特征提取
% 3.1 时域特征提取
features = [];
for trial = 1:numTrials
trialData = squeeze(preprocessedData(:,:,trial));
% 计算各通道的时域特征
meanVal = mean(trialData, 2);
stdVal = std(trialData, 0, 2);
skewnessVal = skewness(trialData, 0, 2);
kurtosisVal = kurtosis(trialData, 0, 2);
% 合并特征(通道×特征)
trialFeatures = [meanVal, stdVal, skewnessVal, kurtosisVal];
features(end+1,:) = trialFeatures(:)';
end
% 3.2 特征标准化
mu = mean(features);
sigma = std(features);
normalizedFeatures = (features - mu)./sigma;
%% 4. 数据集划分
cv = cvpartition(numTrials,'HoldOut',0.3);
trainIdx = training(cv);
testIdx = test(cv);
trainData = normalizedFeatures(trainIdx,:);
testData = normalizedFeatures(testIdx,:);
trainLabels = labels(trainIdx);
testLabels = labels(testIdx);
%% 5. SVM分类模型训练
% 参数设置
svmOptions = statset('Display','final');
kernelType = 'rbf'; % 核函数类型
C = 1; % 惩罚因子
gamma = 0.1; % RBF核参数
% 训练SVM模型
svmModel = fitcsvm(trainData, trainLabels, ...
'KernelFunction', kernelType, ...
'BoxConstraint', C, ...
'KernelScale', gamma, ...
'Standardize', false, ...
'OptimizeHyperparameters', 'auto');
%% 6. 分类评估
% 预测测试集
predictedLabels = predict(svmModel, testData);
% 计算评估指标
[accuracy, cm] = calculateMetrics(testLabels, predictedLabels);
%% 7. 结果可视化
% 混淆矩阵
figure;
confusionchart(cm);
title('Confusion Matrix');
% ROC曲线
figure;
[~,~,~,auc] = perfcurve(testLabels, predictedLabels, 1);
plot(1-specificity, sensitivity);
xlabel('False Positive Rate');
ylabel('True Positive Rate');
title(['ROC Curve (AUC = ', num2str(auc), ')']);
%% 辅助函数:计算评估指标
function [accuracy, cm] = calculateMetrics(trueLabels, predLabels)
cm = confusionmat(trueLabels, predLabels);
accuracy = sum(diag(cm))/sum(cm(:));
end
支持向量机 进行P300检测分类,数据预处理以及分类代码
数据增强:
% 添加噪声鲁棒性训练
noisyTrainData = trainData + 0.1*randn(size(trainData));
svmModel = fitcsvm([trainData; noisyTrainData], [trainLabels; trainLabels]);
特征选择:
% 使用递归特征消除(RFE)
rfe = fscchi2();
svmModel = fitcsvm(trainData, trainLabels, 'FeatureSelection', rfe);
参数优化:
% 网格搜索优化参数
optimVars = [
optimizableVariable('C', [0.1, 100], 'Transform', 'log'),
optimizableVariable('gamma', [1e-3, 1], 'Transform', 'log')
];
svmModel = bayesopt(@(params)svmTraining(params,trainData,trainLabels), ...
optimVars, 'IsObjectiveDeterministic', false, ...
'AcquisitionFunctionName', 'expected-improvement-plus');
跨被试适应:
% 使用CSP空间滤波增强特征
[filters, ~] = csp(trainData);
filteredTrain = filters * trainData;
filteredTest = filters * testData;
对于实际应用,建议处理流程:
原始EEG数据 → ICA去噪 → 特征提取(时频域结合) → SVM分类 → 模型优化 → 在线测试
可根据具体实验设置调整以下参数: