2017-09-15 31 views
0

EEGデータ分類であなたの助けを求めます。matlabを使用したSWLDAによる脳波データ分類

私はEEGデータを分析しようとする大学院生です。

は、今私はMatlabの

を使用してSWLDAで分類するERPのスペルチェック(P300)に苦しんでいますたぶん私のコードで間違った何かがあります。

私はいくつかの記事を読んでいますが、詳細はあまり詳しく述べていません。

私のデータサイズは以下の通りです。

サイズ(ターゲット)= [300 1856] サイズ(非標的)= [998 1856]

行が試行の数を示し、列はスパン機能 を示す(Iは[64 29]データを延伸(ビジュアル用表現私は

私は

コードを以下に添付された非標的対対象を分類するためにMATLABでstepwisefit機能を使用)ROIを選択しなかった。

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スペルラーの分類子を実装するためのヒントとヒントをお伝えします。

またはSWLDAをMatlabコードで実装する方法はありますか?

答えて

0

SWLDAという名前は、Brain Computer Interfacesのコンテキストでのみ使用されていますが、より一般的な文脈で別の名前があると思います。

SWLDAのレシピを追跡すると、Krusienski 2006の論文( "比較..."と "強化されたP300へ向かって")とそこから段階的な対数回帰が説明されている本「Draper Smith、Applied Regression Analysis、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倍クロスvalidatonのアプローチを使用することができます。

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