数据下载
相关数据下载
提取码请私信本人。
数据说明
关于数据的详细说明,请参考文件中数据说明PDF文件。
数据存储在mat格式文件夹中,其中A01E为一号被试的测试集、A01T为一号被试的训练集,以此类推,数据共包含9个被试。
计算代码
其中CSP特征是利用CSP方法进行特征提取得到的(6维),具体理论知识,这里不进行赘述,想要了解的小伙伴还请自己查阅资料;POWER特征是计算C3、C4、Cz三个通道的Alpha波和Beta波能量得到的特征(6维);CSP+POWER特征是前两个特征的组合(12维)。
基于CSP特征的BP网络分类函数
function Y = classify_CSP(train_x, train_y, test_x, test_y, num)
% 输入参数train_x:训练集特征矩阵
% train_y:训练集标签矩阵
% test_x:测试集特征矩阵
% test_y:测试集标签矩阵
% num:BP网络隐含层节点数
%BP神经网络模型
TF1 = 'tansig';TF2 = 'tansig'; TF3 = 'tansig'; TF4 = 'tansig';%传递函数
trainFcn1 = 'traingd';%trainFcn2 = 'traincgf'; %训练函数
rand('state',0); %固定初始值
net = newff(train_x',train_y',num, {TF1,TF2,TF3,TF4},trainFcn1,'learngdm','mse');
net.trainparam.epochs = 1000; % 最大迭代次数
net.trainparam.goal = 1e-5; % 网络性能函数训练目标值
net.trainParam.lr = 0.01; % 学习率
net.trainparam.mc = 0.95; % 动量因子
net.trainparam.show = 10; % 显示训练迭代过程
net.trainParam.max_fail = 100; % 最大确认失败次数
net = train(net,train_x',train_y');% BP神经网络训练
BP_Output = sim(net,test_x');% BP神经网络训练数据预测
%利用阈值0进行分类
BP_Output(find(BP_Output<0)) = -1;
BP_Output(find(BP_Output>=0)) = 1;
Y = length(find(BP_Output'-test_y == 0))/length(BP_Output); %计算准确率
基于POWER特征的BP网络分类函数
function Y = classify_POWER(train_x, train_y, test_x, test_y, num)
% 输入参数train_x:训练集特征矩阵
% train_y:训练集标签矩阵
% test_x:测试集特征矩阵
% test_y:测试集标签矩阵
% num:BP网络隐含层节点数
% BP神经网络模型
TF1 = 'tansig';TF2 = 'tansig'; TF3 = 'tansig'; TF4 = 'tansig';%传递函数
trainFcn1 = 'traingd';%trainFcn2 = 'traincgf'; %训练函数
rand('state',0);%固定初始值
net = newff(train_x',train_y',num, {TF1,TF2,TF3,TF4},trainFcn1,'learngdm','mse');
net.trainparam.epochs = 1000; % 最大迭代次数
net.trainparam.goal = 1e-5; % 网络性能函数训练目标值
net.trainParam.lr = 0.01; % 学习率
net.trainparam.mc = 0.95; % 动量因子
net.trainparam.show = 10; % 显示训练迭代过程
net.trainParam.max_fail = 100; % 最大确认失败次数
net = train(net,train_x',train_y');% BP神经网络训练
BP_Output = sim(net,test_x');% BP神经网络训练数据预测
%利用阈值0进行分类
BP_Output(find(BP_Output<0)) = -1;
BP_Output(find(BP_Output>=0)) = 1;
Y = length(find(BP_Output'-test_y == 0))/length(BP_Output); %计算准确率
基于CSP+POWER组合特征的BP网络分类函数
function Y = classify_CSP_POWER(train_x, train_y, test_x, test_y, num)
% 输入参数train_x:训练集特征矩阵
% train_y:训练集标签矩阵
% test_x:测试集特征矩阵
% test_y:测试集标签矩阵
% num:BP网络隐含层节点数
% BP神经网络模型
TF1 = 'tansig';TF2 = 'tansig'; TF3 = 'tansig'; TF4 = 'tansig';%传递函数
trainFcn1 = 'traingd';%trainFcn2 = 'traincgf'; %训练函数
rand('state',0);%固定初始值
net = newff(train_x',train_y',num, {TF1,TF2,TF3,TF4},trainFcn1,'learngdm','mse');
net.trainparam.epochs = 1000; % 最大迭代次数
net.trainparam.goal = 1e-5; % 网络性能函数训练目标值
net.trainParam.lr = 0.01; % 学习率
net.trainparam.mc = 0.95; % 动量因子
net.trainparam.show = 10; % 显示训练迭代过程
net.trainParam.max_fail = 100; % 最大确认失败次数
net = train(net,train_x',train_y');% BP神经网络训练
BP_Output = sim(net,test_x');% BP神经网络训练数据预测
%利用阈值0进行分类
BP_Output(find(BP_Output<0)) = -1;
BP_Output(find(BP_Output>=0)) = 1;
Y = length(find(BP_Output'-test_y == 0))/length(BP_Output); %计算准确率
分类准确率计算主函数
代码分为两部分,第一部分是针对每个被试的分类结果统计,
第二部分为所有被试的综合分类结果统计。其中可以进行样本选择,具体见
第二部分代码中:x = [1,3,6,7,8,9]; %人为去掉分类不准确的被试数据,
这里去掉了A02、A04、A05三个被试的数据
clc;
clear;
path = '.....\多类运动想象\mat格式\'; %文件存放目录
filename1 = 'CSP特征及标签(左右手)\'; %特征数据文件名
filename2 = 'POWER特征及标签(左右手)\'; %特征数据文件名
%% 分别对每个被试数据进行分类,统计不同模型下的分类准确率
for k = 1:9
name = ['A0',num2str(k)];
%创建空矩阵用于存放分类模型的准确率
Accuracy_CSP = []; Accuracy_POWER = []; Accuracy_CSP_POWER = [];
%% 基于CSP特征导入
load([path,filename1,'CSP_',name,'T_x.mat']); train_CSP_x = eval(['CSP_',name,'T_x']);
load([path,filename1,'CSP_',name,'T_y.mat']); train_CSP_y = eval(['CSP_',name,'T_y']);
load([path,filename1,'CSP_',name,'E_x.mat']); test_CSP_x = eval(['CSP_',name,'E_x']);
load([path,filename1,'CSP_',name,'E_y.mat']); test_CSP_y = eval(['CSP_',name,'E_y']);
%% 基于POWER特征导入
load([path,filename2,'POWER_',name,'T_x.mat']); train_POWER_x = eval(['POWER_',name,'T_x']);
load([path,filename2,'POWER_',name,'T_y.mat']); train_POWER_y = eval(['POWER_',name,'T_y']);
load([path,filename2,'POWER_',name,'E_x.mat']); test_POWER_x = eval(['POWER_',name,'E_x']);
load([path,filename2,'POWER_',name,'E_y.mat']); test_POWER_y = eval(['POWER_',name,'E_y']);
%% 基于CSP+POWER特征导入
train_CSP_POWER_x = [train_CSP_x, train_POWER_x(1:size(train_CSP_x,1),:)];
train_CSP_POWER_y = train_CSP_y;
test_CSP_POWER_x = [test_CSP_x, test_POWER_x(1:size(test_CSP_x,1),:)];
test_CSP_POWER_y = test_CSP_y;
for j = 1:3 %隐含层层数,从1层递增至3层
for i = 3:8 %隐含层节点数,从3个递增至8个
A = ones(1,j)*i; %存放隐含层节点
%% 基于CSP特征的分类模型
Accuracy_CSP(j,i-2) = classify_CSP(train_CSP_x, train_CSP_y, test_CSP_x, test_CSP_y, A);
%% 基于POWER特征的分类模型
Accuracy_POWER(j,i-2) = classify_POWER(train_POWER_x, train_POWER_y, test_POWER_x, test_POWER_y, A);
%% 基于CSP+POWER特征的分类模型
Accuracy_CSP_POWER(j,i-2) = classify_CSP_POWER(train_CSP_POWER_x, train_CSP_POWER_y, test_CSP_POWER_x, test_CSP_POWER_y,A);
end
end
%% 基于CSP特征的分类准确率输出
disp(' ');
disp([name,'_Accuracy_CSP = ']);
disp(Accuracy_CSP);
disp(['MaxAccuracy = ',num2str(max(max(Accuracy_CSP)))]); %输出最大准确率
%求解其最大准确率对应的BP网络隐含层数及隐含层节点数并输出
[u,v] = find(Accuracy_CSP == max(max(Accuracy_CSP)));
for l = 1:length(u)
disp(['隐含层层数 = ',num2str(u(l))]);
disp(['隐含层节点数 = ',num2str((v(l)+2)*ones(1,u(l)))]);
end
%% 基于POWER特征的分类准确率输出
disp(' ');
disp([name,'_Accuracy_POWER =']);
disp(Accuracy_POWER);
disp(['MaxAccuracy =',num2str(max(max(Accuracy_POWER)))]); %输出最大准确率
%求解其最大准确率对应的BP网络隐含层数及隐含层节点数并输出
[u,v] = find(Accuracy_POWER == max(max(Accuracy_POWER)));
for l = 1:length(u)
disp(['隐含层层数 = ',num2str(u(l))]);
disp(['隐含层节点数 = ',num2str((v(l)+2)*ones(1,u(l)))]);
end
%% 基于CSP+POWER特征的分类准确率输出
disp(' ');
disp([name,'_Accuracy_CSP_POWER = ']);
disp(Accuracy_CSP_POWER);
disp(['MaxAccuracy = ',num2str(max(max(Accuracy_CSP_POWER)))]); %输出最大准确率
%求解其最大准确率对应的BP网络隐含层数及隐含层节点数并输出
[u,v] = find(Accuracy_CSP_POWER == max(max(Accuracy_CSP_POWER)));
for l = 1:length(u)
disp(['隐含层层数 = ',num2str(u(l))]);
disp(['隐含层节点数 = ',num2str((v(l)+2)*ones(1,u(l)))]);
end
end
%% 对所有被试数据(或去掉分类不准确的被试数据后)进行分类,统计不同模型下的分类准确率
%创建空矩阵用于存放所有被试的不同特征矩阵和对应的标签矩阵
train_CSP_x = []; train_CSP_y = []; test_CSP_x = []; test_CSP_y = [];
train_POWER_x = []; train_POWER_y = []; test_POWER_x = []; test_POWER_y = [];
x = [1,3,6,7,8,9]; %人为去掉分类不准确的被试数据,这里去掉了A02、A04、A05三个被试的数据
for k = 1:length(x)
name = ['A0',num2str(x(k))];
%% 基于CSP特征导入
load([path,filename1,'CSP_',name,'T_x.mat']); train_CSP_x = [train_CSP_x; eval(['CSP_',name,'T_x'])];
load([path,filename1,'CSP_',name,'T_y.mat']); train_CSP_y = [train_CSP_y; eval(['CSP_',name,'T_y'])];
load([path,filename1,'CSP_',name,'E_x.mat']); test_CSP_x = [test_CSP_x; eval(['CSP_',name,'E_x'])];
load([path,filename1,'CSP_',name,'E_y.mat']); test_CSP_y = [test_CSP_y; eval(['CSP_',name,'E_y'])];
%% 基于POWER特征导入
load([path,filename2,'POWER_',name,'T_x.mat']); train_POWER_x = [train_POWER_x; eval(['POWER_',name,'T_x'])];
load([path,filename2,'POWER_',name,'T_y.mat']); train_POWER_y = [train_POWER_y; eval(['POWER_',name,'T_y'])];
load([path,filename2,'POWER_',name,'E_x.mat']); test_POWER_x = [test_POWER_x; eval(['POWER_',name,'E_x'])];
load([path,filename2,'POWER_',name,'E_y.mat']); test_POWER_y = [test_POWER_y; eval(['POWER_',name,'E_y'])];
end
%% 基于CSP+POWER特征导入
train_CSP_POWER_x = [train_CSP_x, train_POWER_x(1:size(train_CSP_x,1),:)];
train_CSP_POWER_y = train_CSP_y;
test_CSP_POWER_x = [test_CSP_x, test_POWER_x(1:size(test_CSP_x,1),:)];
test_CSP_POWER_y = test_CSP_y;
%% 基于不用特征的分类准确率计算
%创建空矩阵用于存放分类模型的准确率
Accuracy_CSP = []; Accuracy_POWER = []; Accuracy_CSP_POWER = [];
for j = 1:3 %隐含层层数,从1层递增至3层
for i = 3:8 %隐含层节点数,从3个递增至8个
A = ones(1,j)*i; %存放隐含层节点
%% 基于CSP特征的分类模型
Accuracy_CSP(j,i-2) = classify_CSP(train_CSP_x, train_CSP_y, test_CSP_x, test_CSP_y, A);
%% 基于POWER特征的分类模型
Accuracy_POWER(j,i-2) = classify_POWER(train_POWER_x, train_POWER_y, test_POWER_x, test_POWER_y, A);
%% 基于CSP+POWER特征的分类模型
Accuracy_CSP_POWER(j,i-2) = classify_CSP_POWER(train_CSP_POWER_x, train_CSP_POWER_y, test_CSP_POWER_x, test_CSP_POWER_y,A);
end
end
%% 基于CSP特征的分类准确率输出
disp(' ');
disp('Accuracy_CSP = ');
disp(Accuracy_CSP);
disp(['MaxAccuracy = ',num2str(max(max(Accuracy_CSP)))]); %输出最大准确率
%求解其最大准确率对应的BP网络隐含层数及隐含层节点数并输出
[u,v] = find(Accuracy_CSP == max(max(Accuracy_CSP)));
for l = 1:length(u)
disp(['隐含层层数 = ',num2str(u(l))]);
disp(['隐含层节点数 = ',num2str((v(l)+2)*ones(1,u(l)))]);
end
%% 基于POWER特征的分类准确率输出
disp(' ');
disp('Accuracy_POWER =');
disp(Accuracy_POWER);
disp(['MaxAccuracy =',num2str(max(max(Accuracy_POWER)))]); %输出最大准确率
%求解其最大准确率对应的BP网络隐含层数及隐含层节点数并输出
[u,v] = find(Accuracy_POWER == max(max(Accuracy_POWER)));
for l = 1:length(u)
disp(['隐含层层数 = ',num2str(u(l))]);
disp(['隐含层节点数 = ',num2str((v(l)+2)*ones(1,u(l)))]);
end
%% 基于CSP+POWER特征的分类准确率输出
disp(' ');
disp('Accuracy_CSP_POWER = ');
disp(Accuracy_CSP_POWER);
disp(['MaxAccuracy = ',num2str(max(max(Accuracy_CSP_POWER)))]); %输出最大准确率
%求解其最大准确率对应的BP网络隐含层数及隐含层节点数并输出
[u,v] = find(Accuracy_CSP_POWER == max(max(Accuracy_CSP_POWER)));
for l = 1:length(u)
disp(['隐含层层数 = ',num2str(u(l))]);
disp(['隐含层节点数 = ',num2str((v(l)+2)*ones(1,u(l)))]);
end