我想请你帮忙进行脑电数据分类。
我是一名试图分析脑电图数据的研究生。
现在我正在努力使用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的任何想法?
答案 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'))));