【EASRC分类】基于EASRC和ELM算法实现音频脑电图 (EEG) 数据分类附matlab代码

 1 内容介绍

最近的研究表明,在图像分类领域,极限学习机(ELM)的速度优势和稀疏表示分类(SRC)的准确率优势。然而,这两种方法都有各自的缺点,例如,通常已知 ELM 对噪声的鲁棒性较差,而 SRC 则很耗时。因此,ELM 和 SRC 在计算复杂度和分类精度上相得益彰。为了统一这种互补性,从而进一步提高分类性能,我们提出了一种高效的混合分类器,以利用本文中 ELM 和 SRC 的优势。更准确地说,所提出的分类器由两个阶段组成:首先,通过监督学习训练 ELM 网络。其次,采用关于获得的 ELM 输出的可靠性的判别标准来决定查询图像是否可以正确分类。如果输出可靠,则由 ELM 进行分类;否则查询图像将被提供给 SRC。同时,在 SRC 阶段,通过 ELM 输出提取与查询图像而不是整个字典相适应的子字典。因此可以减少 SRC 的计算负担。手写数字分类、地标识别和人脸识别的大量实验表明,所提出的混合分类器在分类精度上优于 ELM 和 SRC,具有出色的计算效率。​

2 仿真代码

function nn = elm_initialization(nn)

% biases and input weights
scale = 1;


nn.b = 2*scale*rand(nn.hiddensize,1,'single')-scale;
nn.W = 2*scale*rand(nn.hiddensize, nn.inputsize,'single')-scale;

% nn.b = randn(nn.hiddensize,1);
% nn.W = randn(nn.hiddensize, nn.inputsize);

% if nn.orthogonal
%     if nn.hiddensize > nn.inputsize
%         nn.W = orth(nn.W);
%     else
%         nn.W = orth(nn.W')';
%     end
%     nn.b=orth(nn.b);
% end

end

% =========================================================================
-------------------------------------------------------------


clear;clc;
addpath(genpath('./.'));
rng('default');

%%%%%%%%%-----Load data--------------------------------------------------

load(fullfile('data','AR.mat'));

traindata  =  traindata./( repmat(sqrt(sum(traindata.*traindata)), [size(traindata,1),1]) );
testdata   =  testdata./(repmat(sqrt(sum(testdata.*testdata)), [size(testdata,1),1]) );

% [traindata,PS] = mapminmax(traindata,-1,1);%
% testdata = mapminmax('apply',testdata,PS);

% [traindata,PS] = mapstd(traindata);%
% testdata = mapstd('apply',testdata,PS);


[trainlabel1, testlabel1] = label_convert(trainlabel, testlabel,'2');

%-----------Setting----------------------------------------------------
alpha             = 0.1;
kclass            = length(unique(trainlabel))/2;  % for adaptive class domain selection
nn.hiddensize     = 1000;       % hidden nodes number

method            = {'ELM','RELM'};
nn.activefunction = 's';
nn.inputsize      = size(traindata,1);
nn.method         = method{2};
nn.type           = 'classification';
%-----------Initializzation-----------

nn                = elm_initialization(nn);

%--------RELM-LOO--------------------
nn.method         = method{2};
nn.C              = exp(-4:0.2:4);
[nn, acc_train]   = elm_train(traindata, trainlabel1, nn);
%[nn, acc_test]   = elm_test(testdata, testlabel, nn);

ID      = [];
IDe     = [];
lamda   = 5e-4;
tol     = 1e-2;
tic;
f = 0;
j=1;

%--------RELM-LOO---SRC--------------------
for i = 1 : size(testdata,2)
    
    [nn, acc_test]   = elm_test(testdata(:,i), [], nn);
    O = nn.testlabel;
    [Tf, id] = max(O);
    O(id) = -inf;
    [Ts, id2] = max(O);
    Tdiff = Tf-Ts;
    IDe   = [IDe, id];
    
    if Tdiff > alpha
        ID      =   [ID, id];
%         if id ~= testlabel(i)
%             fprintf('Wrong classification for %1.0f th testing sample by ELM criterion (|T_first - T_second| = %1.2f)   \n ', i, Tdiff);
%         end
    else
        f = f + 1;
        [sim, slabel] = sort(nn.testlabel, 'descend');
        newtrainlabel = trainlabel(ismember(trainlabel,slabel(1:kclass)));
        newtraindata  = traindata(:,ismember(trainlabel,slabel(1:kclass)));
        y = testdata(:,i);
        s = l1_ls(newtraindata, y, lamda, tol, 1);
        newlabel = unique(newtrainlabel);
        
%         if ~ismember(testlabel(i), newlabel)
%             fprintf('Wrong classification for %1.0f th testing sample by ELM criterion (|Adaptive class domain|) \n ', i);
%         end
        
        gap = [];
        
        for indClass  =  1 : length(newlabel)
            coef_c    =  s(newtrainlabel==newlabel(indClass));
            Dc        =  newtraindata(:,newtrainlabel==newlabel(indClass));
            gap(indClass) = norm(y-Dc*coef_c)^2;
        end
        
        wgap3  = gap ;
        index3 = find(wgap3==min(wgap3));
        id3    = index3(1);
        id     = newlabel(id3);
        
        fprintf('%1.0f / %1.0f  %1.0f   %1.3f    %1.0f    %1.2f    %1.0f \n', i, size(testdata,2), f, sum(s), find(slabel==testlabel(i)), Tdiff, id==testlabel(i));
        
        ID      =   [ID, id];
    end
end

Rec_ELM      =   sum(IDe==testlabel)/length(testlabel);
Rec_EASRC    =   sum(ID==testlabel)/length(testlabel); % recognition rate


disp(['RELM_LOO     recogniton rate is    ' num2str(Rec_ELM)]);

disp(['EASRC       recogniton rate is     ' num2str(Rec_EASRC)]);

figure
plot(testlabel,'bo');
hold on
plot(IDe,'g+');
plot(ID,'r*');
legend('真实值','RELM','EASRC')
title(['RELM_LOO     recogniton rate is    ' num2str(Rec_ELM),',EASRC       recogniton rate is     ' num2str(Rec_EASRC)])

 

3 运行结果

4 参考文献

[1]徐欣, 周运, 马千里. EEG数据信号的Matlab滤波仿真设计分析研究[J]. 南京邮电大学学报(自然科学版), 2011, 031(006):37-43.

[2]李冲. 视频脑电图(Video-EEG)的临床应用[J]. 现代电生理学杂志, 2005, 12(2):4.

[3]徐敏, 佟德纯, 史习智. 脑电图(EEG)的数字谱分析[J]. 上海交通大学学报, 1981(03):4-16.

[4] Cao J ,  Zhang K ,  Luo M , et al. Extreme learning machine and adaptive sparse representation for image classification[J]. Neural Networks, 2016.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值