我想在脑电图数据分类方面寻求你的帮助。
我是一个研究生,试着分析脑电图数据。
现在我很难用Matlab对ERP拼写器(P300)进行分类。
也许我的代码有问题。
我读过几篇文章,但没有详细说明。
我的数据大小描述如下。
尺寸(目标)= 300 1856大小(非目标)= 998 1856
行表示试验次数,列表示跨功能(我扩展了数据64 29 )。
利用Matlab中的分步函数对目标和非目标进行了分类。
代码附在下面。
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?
发布于 2017-12-13 03:03:52
SWLDA这个名字只在大脑计算机接口的上下文中使用,但我敢打赌它在更一般的上下文中有另一个名称。
如果你跟踪SWLDA的配方,你将在Krusienski 2006的论文中结束(“比较.”)以及“迈向增强的P300..")并由此解释了“逐步对数回归”一书:"Draper Smith,应用回归分析,1981“。然而,据我所知,没有一篇论文实际上给出了如何实现它的完整配方(以及它们的细节和秘密)。
我的方法是使用逐步的智慧:
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分区.
c = cvpartition(lbs,'k',10);
opts = statset('display','iter');
fun = @(XT,yT,Xt,yt)...
(sum(~strcmp(yt,classify(Xt,XT,yT,'linear'))));
https://stackoverflow.com/questions/46231861
复制相似问题