多类运动想象---左右手分类(基于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

  • 14
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
K最近邻算法(K-nearest neighbors algorithm)是一种常用的机器学习算法,主要用于分类和回归问题。这种算法的基本思想是:对于一个给定的测试样本,找出与该样本最接近的K个训练样本,然后根据这K个样本的标签来判断该测试样本的分类。 要实现左右手运动想象分类的K最近邻算法的Matlab代码,可以按照以下步骤进行: 1. 准备数据集:收集一组包含左右手运动想象数据的样本集,每个样本应包括特征和标签。特征是用于描述样本的属性,如脑电波信号;标签表示样本的类别,如左手或右手。 2. 数据预处理:对于特征数据,可以进行一些预处理步骤,如归一化或标准化,以提高算法的性能。 3. 分割数据:将数据集划分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。 4. 训练模型:使用训练集中的样本来训练K最近邻分类器。可以使用Matlab的机器学习相关函数来实现,如fitcknn函数。 5. 预测分类:使用训练好的K最近邻分类器对测试集中的样本进行分类预测。可以使用Matlab的predict函数来实现。 6. 评估性能:根据预测结果,通过计算准确率、召回率、F1分数等指标来评估分类器的性能。 总结来说,K最近邻算法实现左右手运动想象分类Matlab代码包括数据准备、预处理、数据分割、模型训练、分类预测和性能评估等步骤。这些步骤可以使用Matlab的机器学习相关函数和算法来完成。具体实现的代码可以根据具体的数据集和需求进行调整和优化。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值