7

私はPCAを使用して、他の変数との相関が高いためにデータセット内のどの変数が冗長であるかを調べています。以前にzscoreを使用して正規化されたデータに対してprincompmatlab関数を使用しています。

[coeff, PC, eigenvalues] = princomp(zscore(x))

固有値は、データセットのバリエーションがすべての主成分をカバーする量を示し、係数は、j番目の主成分(i-行、j-列)にあるi番目の元の変数の量を示します

したがって、元のデータセットのどの変数が最も重要で、どれが最も重要でないかを見つけるには、係数行列に固有値を掛ける必要があると仮定しました。係数コンポーネントが持つすべての変数の量を表し、固有値は、このコンポーネントの重要性を示します。は。だからこれは私の完全なコードです:

[coeff, PC, eigenvalues] = princomp(zscore(x));
e = eigenvalues./sum(eigenvalues);
abs(coeff)/e

しかし、これは実際には何も示していません-変数1が変数2と完全に相関している次のセットで試してみました(v2 = v1 + 2):

     v1    v2    v3
     1     3     4
     2     4    -1
     4     6     9
     3     5    -2

しかし、私の計算結果は次のとおりです。

v1 0.5525
v2 0.5525
v3 0.5264

これは実際には何も表示しません。変数2の結果は、v1またはv3よりもはるかに重要性が低いことを示していると思います。私の仮定のどれが間違っていますか?

4

1 に答える 1

3

編集どの仮定が間違っていたかを理解したので、答えを完全に作り直しました。

OP で何が機能しないかを説明する前に、用語が同じであることを確認させてください。主成分分析の目標は、観測を適切に分離する座標変換を取得することです。これにより、データ、つまり異なる多次元観測を低次元空間で簡単に記述できるようになります。複数の測定値から構成されている場合、観測は多次元です。測定よりも線形に独立した観測が少ない場合、固有値の少なくとも 1 つがゼロであると予想されます。これは、たとえば、3D 空間内の 2 つの線形に独立した観測ベクトルが 2D 平面で記述できるためです。

配列がある場合

x = [    1     3     4
         2     4    -1
         4     6     9
         3     5    -2];

これは、それぞれ 3 つの測定値を持つ 4 つの観測値で構成され、4 つの観測値にprincomp(x)またがる低次元空間を見つけます。2 つの共依存測定値があるため、測定空間は 2D のみで 3D ではないため、固有値の 1 つがほぼゼロになります。実際、固有ベクトル ( coeff) を調べると、最初の 2 つの成分が非常に明らかに同一線上にあることがわかります。

coeff = princomp(x)
coeff =
      0.10124      0.69982      0.70711
      0.10124      0.69982     -0.70711
       0.9897     -0.14317   1.1102e-16

実際、最初の 2 つの成分は反対方向を指しているため、変換された観測値の最初の 2 つの成分の値は、それ自体では無意味[1 1 25]です[1000 1000 25]

ここで、測定値が線形に依存しているかどうかを調べたい場合、および実際にこれに主成分を使用したい場合は、実際には測定値が完全に共線的であるとは限らず、記述子の適切なベクトルを見つけることに関心があるためです。機械学習アプリケーションでは、3 つの測定値を「観測」と見なして実行する方がはるかに理にかなっていますprincomp(x')。したがって、「観測」は 3 つしかなく、「測定」は 4 つあるため、4 番目の固有ベクトルはゼロになります。ただし、線形従属観測が 2 つあるため、ゼロ以外の固有値は 2 つだけ残ります。

eigenvalues =
       24.263
       3.7368
            0
            0

どの測定値の相関が非常に高いかを調べるには (固有ベクトル変換された測定値を機械学習などの入力として使用する場合は実際には必要ありません)、測定値間の相関関係を調べるのが最善の方法です。

corr(x)
  ans =
        1            1      0.35675
        1            1      0.35675
  0.35675      0.35675            1

当然のことながら、各測定値はそれ自体と完全に相関しており、 とv1完全に相関していv2ます。

EDIT2

しかし、固有値は、新しい空間のどのベクトルが最も重要であるか (ほとんどの変動をカバーする) を示し、係数は、各変数が各成分にどれだけ含まれているかを示します。したがって、このデータを使用して、元の変数のどれが分散を最も多く保持し、したがって最も重要であるかを見つけることができると思います(そして、少量を表す変数を取り除きます)

これは、観察が 1 つの測定変数でほとんど分散を示さない場合に機能します (たとえば、 where x = [1 2 3;1 4 22;1 25 -25;1 11 100];、したがって最初の変数は分散に何も寄与しません)。ただし、共線測定では、両方のベクトルが同等の情報を保持し、分散に等しく寄与します。したがって、固有ベクトル (係数) は互いに類似している可能性があります。


@agnieszka のコメントが理にかなっているようにするために、回答の元のポイント 1 ~ 4 を以下に残しました。#3 は、固有値による固有ベクトルの除算に対応していたことに注意してください。これは、私にはあまり意味がありませんでした。

  1. ベクトルは列ではなく行にある必要があります (各ベクトルは観測値です)。
  2. coeff主成分の基底ベクトルを返し、その順序は元の入力とはほとんど関係ありません
  3. 主成分の重要性を確認するには、次を使用します。eigenvalues/sum(eigenvalues)
  4. 2 つの共線ベクトルがある場合、最初のベクトルが重要で、2 番目のベクトルが重要でないとは言えません。それが逆であってはならないことをどのように知っていますか?共線性をテストしたい場合は、代わりに配列のランクをチェックするか、unique正規化された (つまりnorm1 に等しい) ベクトルを呼び出す必要があります。
于 2011-09-28T21:12:53.773 に答える