运动想象丨特征分类 MATLAB例程(二)
像开源致敬!此篇介绍个人SVM分类和开源提供的分类器。
1 SVM 分类器
本文使用的上篇特征信息。
个人上传软件包:运动想象特征提取与分类MATLAB
使用libsvm软件包:MATLAB 安装 libsvm-3.23 教程
1.1 代码
%% 使用libsvm 运动想象分类
clc;
clear all;
run_FeatureExtract
disp('####### Training The SVM Classsifier ##########')
load dataCSP.mat
load labels_data_set_iii.mat
%% X为训练集, T测试集, Y训练标签
%% SVM网络训练
model = svmtrain(Y, X, '-c 2 -g 1');
%% SVM网络预测
[predict_label, accuracy,decision_values] = svmpredict(y_test, T, model);
1.2 分类结果
####### Training The SVM Classsifier ##########
optimization finished, #iter = 70
nu = 1.000000
obj = -279.745629, rho = -0.000787
nSV = 140, nBSV = 140
Total nSV = 140
Accuracy = 69.2857% (97/140) (classification)
正确率稍微低一些,大家可自行选择分类器。
2 开源软件分类
第二阶段是使用Bagging,Boosting和AdaBoost方法对提取的特征进行分类。
像开源致敬!M-MohammadPour/EEGClassification
2.1 代码
例如运行:AdaBoost/app1.m
close all; clear; clc;
load dataDWT.mat;
%load dataCSP.mat;
%load dataAR.mat;
%load dataPSD.mat;
Y(Y==2) = -1;
N=size(X,1);
trnX = X(1:N, :);
trnY = Y(1:N);
iter = 30;
abClassifier = initAdaBoost(iter);
N = size(trnX, 1); % Number of training samples
sampleWeight = repmat(1/N, N, 1);
for t = 1:iter
weakClassifier = buildStump(trnX, trnY, sampleWeight);
abClassifier.WeakClas{t} = weakClassifier;
abClassifier.nWC = t;
% Compute the weight of this classifier
abClassifier.Weight(t) = 0.5*log((1-weakClassifier.error)/weakClassifier.error);
weakClassifier.error
% Update sample weight
label = predStump(trnX, weakClassifier);
tmpSampleWeight = -1*abClassifier.Weight(t)*(trnY.*label); % N x 1
tmpSampleWeight = sampleWeight.*exp(tmpSampleWeight); % N x 1
sampleWeight = tmpSampleWeight./sum(tmpSampleWeight); % Normalized
% Predict on training data
[ttt, abClassifier.trnErr(t)] = predAdaBoost(abClassifier, trnX, trnY);
fprintf('\tIteration %d, Training error %f\n', t, abClassifier.trnErr(t));
end
trnError = abClassifier.trnErr;
plot(1:iter, trnError);