使用Matlab使用SWLDA进行脑电数据分类

matlab regression lda

333 观看

1回复

1 作者的声誉

我想请教您有关脑电数据分类的帮助。

我是一名试图分析脑电数据的研究生。

现在,我正在努力使用Matlab使用SWLDA对ERP拼写器(P300)进行分类

也许我的代码有问题。

我已经阅读了几篇文章,但是没有涵盖很多细节。

我的数据大小描述如下。

大小(目标)= [300 1856]大小(非目标)= [998 1856]

行表示试验次数,列表示跨越特征(我拉伸了数据[64 29](对于视觉表示,我未选择ROI)

我在Matlab中使用stepwisefit函数对目标与非目标进行了分类

代码附在下面。

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

ps我的代码目前效率很低,可能不好。

以我的假设,stepwisefit计算每一步的有效系数,并且将保留有效列。

即使不是LDA,但对于二进制分类,LDA和线性回归也没有区别。

但是,结果几乎是随机的机会..(对于互联网上的其他二进制数据,它是有效的..)

我认为我做错了,您的帮助可以纠正我。

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

还是在Matlab代码中实现SWLDA的任何想法?

作者: Kyungho Won 的来源 发布者: 2017 年 9 月 15 日

回应 1


0

80 作者的声誉

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

如果您跟踪SWLDA的配方,您将最终获得Krusienski 2006的论文(“比较...”和“迈向增强型P300 ..”),并在那本书中解释了逐步对数回归:“ Draper Smith,应用回归分析,1981年”。但是,据我所知,没有任何一篇论文给出了如何实施的完整方案(以及它们的细节和秘密)。

我的方法是使用stepwiseglm:

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');

您还可以通过matlab cvpartition使用k折交叉验证方法。

c = cvpartition(lbs,'k',10);
opts = statset('display','iter');
fun = @(XT,yT,Xt,yt)...
      (sum(~strcmp(yt,classify(Xt,XT,yT,'linear'))));
作者: faturita 发布者: 2017 年 12 月 13 日
32x32