4

私のオリジナルdataは、195x22パーキンソン病患者とそうでない人の声の測定値を含むレコード セットです。ベクトル には195x1、1/0 のstatusがあります。

今、私は PCA を実行し、biplotうまくいきました。問題は、散布図の原点からどのドットが病気の人か健康な人かがわからないことです (それを と関連付けることはできませんstatus)。散布図に、健康 (status=0) の場合は赤い点、病気 (status=1) の場合は緑の点を表示したいと考えています。

どうすればいいですか?私のバイプロットコードは次のとおりです。

biplot(coeff(:,1:2), ...
    'Scores', score(:,1:2), ...
    'VarLabels', Labels, ...
    'markersize', 15 ...
);
xlabel('Bi-Plot: Standardized Data');
xlabel('PCA1');
ylabel('PCA2');

クリックして画像を表示

更新 (解決策):

ソリューションは@Maglaに触発され、コードはここで見ることができます: http://pastebin.com/KHUj3DnA

この美しいグラフで:

ここに画像の説明を入力

4

1 に答える 1

4

a の主成分スコア (赤い点) はbiplot、関数によって返されるものではありませんpca。ヘルプにあるように、

biplot は、プロットに収まるようにスコアをスケーリングします。各スコアをすべてのスコアの最大絶対値で割り、coef の最大係数長を掛けます。次に、biplot は coef の符号規則に従ってスコア座標の符号を変更します。

したがって、この(X,Y)情報を使用して、どのポイントがカテゴリに属しているかを簡単に見つけることはできません。

ObsLabelsのオプションを使用した回避策を次に示しますbiplotObsLabelsユーザー定義データを各観測に割り当てます。各ポイントに対して、status変数 (単純な増分値) に対応するインデックスを割り当てます。これにより、a の赤い点を簡単に変更できます。biplotここでmarkerは、正方形と赤/緑の色に設定されています。

次の図

ここに画像の説明を入力

このコードによって生成されます

%some data
load carsmall
x = [Acceleration Displacement Horsepower MPG Weight]; x = x(all(~isnan(x),2),:);
[coefs,score] = pca(zscore(x));

%the status vector (here zero or one)
class_pt = round(rand(size(score,1),1));

vbls = {'Accel','Disp','HP','MPG','Wgt'};

figure('Color', 'w');
hbi = biplot(coefs(:,1:2),'scores',score(:,1:2),'varlabels',vbls,...
    'ObsLabels',num2str((1:size(score,1))'));

for ii = 1:length(hbi)
    userdata = get(hbi(ii), 'UserData');
    if ~isempty(userdata)
        if class_pt(userdata) == 0
            set(hbi(ii), 'Color', 'g', 'Marker', 's');

        elseif class_pt(userdata) == 1
            set(hbi(ii), 'Color', 'r', 'Marker', 's');
        end

    end
end
于 2013-09-27T15:14:15.993 に答える