使用matlab进行SWLDA的脑电图数据分类

时间:2017-09-15 04:47:02

标签: matlab regression lda

我想请你帮忙进行脑电数据分类。

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

现在我正在努力使用Matlab将ERP拼写器(P300)与SWLDA分类

我的代码可能有问题。

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

我的数据大小描述如下。

尺寸(目标)= [300 1856] size(非目标)= [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

P.S。我的代码目前效率很低,可能很糟糕。

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

即使它不是LDA,但对于二进制分类,LDA和线性回归并没有不同。

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

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

我将非常感谢为ERP拼写器实施分类器的任何建议和提示。

或者在Matlab代码中实现SWLDA的任何想法?

1 个答案:

答案 0 :(得分:0)

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

如果您追踪SWLDA的食谱,您将最终获得Krusienski 2006年的论文(“A comparison ...”和“Toward enhanced 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-fold交叉验证方法。

c = cvpartition(lbs,'k',10);
opts = statset('display','iter');
fun = @(XT,yT,Xt,yt)...
      (sum(~strcmp(yt,classify(Xt,XT,yT,'linear'))));