數據下載
相關數據下載
提取碼請私信本人。
數據說明
關於數據的詳細說明,請參考文件中數據說明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