【问题标题】:EEG data classification with SWLDA using matlab使用matlab使用SWLDA进行EEG数据分类
【发布时间】:2017-12-13 11:03:52
【问题描述】:

我想在 EEG 数据分类方面寻求您的帮助。

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

现在我正在努力使用 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

附言我的代码目前效率很低,可能很糟糕..

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

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

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

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

对于为 ERP 拼写器实施分类器的任何建议和技巧,我将不胜感激。

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

【问题讨论】:

  • 我认为线性回归不同于线性分类。有几个原因:(1) 响应的预测值可能大于 1 或小于 0。(2) 响应的方差在所有变量中不是恒定的。不太可能使用与回归器相同的算法来训练分类器。

标签: matlab regression lda


【解决方案1】:

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 折交叉验证方法。

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

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2014-09-01
    • 1970-01-01
    • 2014-08-07
    • 2014-04-29
    相关资源
    最近更新 更多