首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于matlab的SWLDA脑电数据分类

基于matlab的SWLDA脑电数据分类
EN

Stack Overflow用户
提问于 2017-09-15 04:47:02
回答 1查看 678关注 0票数 0

我想在脑电图数据分类方面寻求你的帮助。

我是一个研究生,试着分析脑电图数据。

现在我很难用Matlab对ERP拼写器(P300)进行分类。

也许我的代码有问题。

我读过几篇文章,但没有详细说明。

我的数据大小描述如下。

尺寸(目标)= 300 1856大小(非目标)= 998 1856

行表示试验次数,列表示跨功能(我扩展了数据64 29 )。

利用Matlab中的分步函数对目标和非目标进行了分类。

代码附在下面。

代码语言:javascript
运行
复制
ingredients = [targets; nontargets];
heat = [class_targets; class_nontargets]; % target: 1, non-target: -1
randomized_set = shuffle([ingredients heat]);

for k=1:10 % 10-fold cross validation

   parition_factor = ceil(size(randomized_set,1) / 10);
   cv_test_idx = (k-1)*parition_factor + 1:min(k * parition_factor, size(randomized_set,1));
   total_idx = 1:size(randomized_set,1);
   cv_train_idx = total_idx(~ismember(total_idx, cv_test_idx));

   ingredients = randomized_set(cv_train_idx, 1:end-1);
   heat = randomized_set(cv_train_idx, end);

   [W,SE,PVAL,INMODEL,STATS,NEXTSTEP,HISTORY]= stepwisefit(ingredients, heat, 'penter', .1);

   valid_id = find(INMODEL==1);
   v_weights = W(valid_id)';

   t_ingredients = randomized_set(cv_test_idx, 1:end-1);
   t_heat = randomized_set(cv_test_idx, end); % true labels for test set

   v_features = t_ingredients(:, valid_id);

   v_weights = repmat(v_weights, size(v_features, 1), 1);
   predictor = sum(v_weights .* v_features, 2);

   m_result = predictor > 0; % class A: +1, B: 0
   t_heat(t_heat==-1) = 0;
   acc(k) = sum(m_result==t_heat) / length(m_result);

end

附注:我的代码目前效率很低,可能很糟糕。

在我的假设中,逐步计算每个步骤的重要系数,并保留有效的列。

虽然它不是LDA,但是对于二进制分类,LDA和线性回归没有区别。

然而,结果几乎是随机的机会。(对于互联网上的其他二进制数据,它起了作用。)

我想我做错了什么,你的帮助可以纠正我。

我将感谢任何建议和技巧,以实施分类器的ERP拼写。

或者在Matlab代码中实现SWLDA?

EN

回答 1

Stack Overflow用户

发布于 2017-12-13 03:03:52

SWLDA这个名字只在大脑计算机接口的上下文中使用,但我敢打赌它在更一般的上下文中有另一个名称。

如果你跟踪SWLDA的配方,你将在Krusienski 2006的论文中结束(“比较.”)以及“迈向增强的P300..")并由此解释了“逐步对数回归”一书:"Draper Smith,应用回归分析,1981“。然而,据我所知,没有一篇论文实际上给出了如何实现它的完整配方(以及它们的细节和秘密)。

我的方法是使用逐步的智慧:

代码语言:javascript
运行
复制
H=predictors;
TH=variables;
lbs=labels % (1,2)
if (stepwiseflag)
    mdl = stepwiseglm(H', lbs'-1,'constant','upper','linear','distr','binomial');
    if (mdl.NumEstimatedCoefficients>1)
       inmodel = [];
       for i=2:mdl.NumEstimatedCoefficients
           inmodel = [inmodel str2num(mdl.CoefficientNames{i}(2:end))];
       end
       H = H(inmodel,:);
       TH = TH(inmodel,:);
    end
end

lbls = classify(TH',H',lbs','linear');

您也可以使用k折叠交叉验证方法使用matlab cv分区.

代码语言:javascript
运行
复制
c = cvpartition(lbs,'k',10);
opts = statset('display','iter');
fun = @(XT,yT,Xt,yt)...
      (sum(~strcmp(yt,classify(Xt,XT,yT,'linear'))));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46231861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档