多類運動想象---左右手分類(基於MATLAB)

數據下載

相關數據下載
提取碼請私信本人。

數據說明

關於數據的詳細說明,請參考文件中數據說明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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章