-3

Matlab の「princomp」関数を使用したいのですが、この関数はソートされた配列で固有値を返します。この方法では、どの列がどの固有値に対応するかわかりません。マトラブの場合、

m = [1,2,3;4,5,6;7,8,9];
[pc,score,latent] = princomp(m);

と同じです

m = [2,1,3;5,4,6;8,7,9];
[pc,score,latent] = princomp(m);

つまり、最初の 2 つの列を交換しても何も変わりません。結果 (固有値) は次のようになります: (27,0,0) 情報 (どの固有値が元の (入力) 列に対応するか) が失われます。固有値をソートしないようにmatlabに指示する方法はありますか?

4

2 に答える 2

16

PCA を使用すると、返される各主成分は、元の列/ディメンションの線形結合になります。おそらく、例があなたの誤解を解くかもしれません。

150 個のインスタンスと 4 つの次元で構成される Fisher-Iris データセットを考えて、データに PCA を適用してみましょう。理解しやすくするために、PCA 関数を呼び出す前に、まずデータをゼロセンタリングします。

load fisheriris
X = bsxfun(@minus, meas, mean(meas));    %# so that mean(X) is the zero vector

[PC score latent] = princomp(X);

最初に返された主成分 (PC行列の 1 列目)を見てみましょう。

>> PC(:,1)
      0.36139
    -0.084523
      0.85667
      0.35829

これは、元の次元の線形結合として表されます。つまり、次のようになります。

PC1 =  0.36139*dim1 + -0.084523*dim2 + 0.85667*dim3 + 0.35829*dim4

したがって、主成分によって形成される新しい座標系で同じデータを表現するには、新しい最初の次元は、上記の式による元の次元の線形結合でなければなりません。

X*PCこれは、PRINCOMP ( ) の 2 番目の出力で正確に返されるものとして簡単に計算できます。これscoreにより、この試みを確認できます。

>> all(all( abs(X*PC - score) < 1e-10 ))
    1

最後に、各主成分の重要性は、それが説明するデータの分散の程度によって決定できます。これは、PRINCOMP ( latent) の 3 番目の出力によって返されます。


PRINCOMP を使用せずに、データの PCA を自分で計算できます。

[V E] = eig( cov(X) );
[E order] = sort(diag(E), 'descend');
V = V(:,order);

共分散行列の固有ベクトルはV主成分 (PC上記と同じですが、符号は逆にすることができます) であり、対応する固有値Eは説明される分散の量を表します ( と同じlatent)。主成分を固有値でソートするのが通例であることに注意してください。前と同じように、新しい座標でデータを表現するには、単純に計算します (符号が一致することを確認した場合、上記X*Vと同じである必要があります)。score

于 2011-02-14T22:41:55.243 に答える
0

「情報(どの固有値がどの元の(入力)列に対応するか)が失われます。」

各主成分はすべての入力変数の線形関数であるため、各主成分(固有ベクトル、固有値)は、元のすべての入力列に対応します。PCAで任意である可能性のある符号の変更を無視して、について入力変数を並べ替えても、PCAの結果は変更されません。

「固有値をソートしないようにmatlabに指示する方法はありますか?」

私はそれを疑っています:PCA(および一般的な固有分析)は通常、分散によって結果を並べ替えますが、princomp()は分散が大きいものから小さいものへと並べ替えられ、eig()は反対方向に並べ替えられます。

princomp()の有無にかかわらず、MATLABイラストを使用したPCAの詳細については、以下を参照してください。

主成分分析

于 2011-02-24T11:18:33.153 に答える