web-dev-qa-db-ja.com

取るべき主成分はいくつですか?

主成分分析は、行列に対してSVDを実行し、固有値行列を生成することを知っています。主成分を選択するには、最初のいくつかの固有値のみを取得する必要があります。では、固有値行列から取得する固有値の数をどのように決定するのでしょうか?

32
London guy

保持する固有値/固有ベクトルの数を決定するには、最初にPCAを実行する理由を考慮する必要があります。ストレージ要件を減らすために、分類アルゴリズムの次元を減らすために、または他の何らかの理由でそれをしていますか?厳密な制約がない場合は、固有値の累積和をプロットすることをお勧めします(降順であると仮定)。プロットする前に各値を固有値の合計で除算すると、プロットには、保持された合計分散の割合と固有値の数が表示されます。プロットは、減少するリターンのポイントに達したときの適切な指標を提供します(つまり、追加の固有値を保持することでほとんど分散が得られません)。

34
bogatron

正解はありません。1〜nの間です。

主成分は、あなたが今まで訪れたことのない町の通りと考えてください。町を知るために何通り通るべきですか?

まあ、あなたは明らかにメインストリート(最初のコンポーネント)、そしておそらく他のいくつかの大通りも訪れるべきです。あなたは町を十分に知るためにあらゆる通りを訪れる必要がありますか?おそらくない。

町を完全に知るには、すべての街を訪れてください。しかし、50通りのうち10通りを訪れて、町について95%理解しているとしたらどうでしょうか。それで十分ですか?

基本的に、十分なコンポーネントを選択して、満足できる十分な分散を説明する必要があります。

22
Neil McGuigan

他の人が言ったように、説明された分散をプロットしても害はありません。

教師あり学習タスクの前処理ステップとしてPCAを使用する場合、データ処理パイプライン全体を相互検証し、PCAディメンションの数をハイパーパラメーターとして扱い、最終的な教師ありスコアでのグリッド検索を使用して選択する必要があります(分類用のF1スコアなど)または回帰のRMSE)。

データセット全体で交差検証されたグリッド検索のコストが高すぎる場合は、2つのサブサンプルを試してください。 1つはデータの1%で、もう1つは10%で、PCAディメンションに対して同じ最適値が得られるかどうかを確認します。

9
ogrisel

そのためのヒューリスティックな使用法がいくつかあります。

例えば。 合計分散の少なくとも85%をキャプチャする最初のk個の固有ベクトルを取得します。

ただし、高次元の場合、これらのヒューリスティックは通常あまり良くありません。

7
Anony-Mousse

状況に応じて、ndim次元にデータを投影することにより、最大許容相対誤差を定義することは興味深いかもしれません。

これを小さなmatlabの例で説明します。興味がない場合は、コードをスキップしてください。

最初に、n個のサンプル(行)と、正確に100個の非ゼロ主成分を含むp個の特徴のランダム行列を生成します。

n = 200;
p = 119;
data = zeros(n, p);
for i = 1:100
  data = data + Rand(n, 1)*Rand(1, p);
end

画像は次のようになります。

enter image description here

このサンプル画像では、次のように入力データをndim次元に投影することにより発生する相対誤差を計算できます。

[coeff,score] = pca(data,'Economy',true);

relativeError = zeros(p, 1);
for ndim=1:p
    reconstructed = repmat(mean(data,1),n,1) + score(:,1:ndim)*coeff(:,1:ndim)';
    residuals = data - reconstructed;
    relativeError(ndim) = max(max(residuals./data));
end

次元数(主成分)の関数の相対誤差をプロットすると、次のグラフが得られます。

enter image description here

このグラフに基づいて、考慮する必要がある主成分の数を決定できます。この理論上の画像では、100個のコンポーネントを使用すると、正確な画像表現が得られます。したがって、100を超える要素を取得することは無意味です。たとえば、最大5%のエラーが必要な場合は、約40の主要コンポーネントを使用する必要があります。

免責事項:得られた値は、私の人工データに対してのみ有効です。したがって、提案された値を状況で盲目的に使用しないでください。同じ分析を実行し、発生するエラーと必要なコンポーネントの数の間でトレードオフを行ってください。

コード参照

5
m7913d

GavishとDonohoによる次の論文を強くお勧めします。 特異値の最適なハードしきい値は4/sqrt(3)

この詳細な要約を CrossValidated(stats.stackexchange.com) に投稿しました。簡単に言えば、彼らは非常に大きなマトリックスの限界で最適な手順を取得します。手順は非常に単純で、手動で調整されたパラメーターを必要とせず、実際に非常にうまく機能するようです。

彼らはここにニースのコード補足があります: https://purl.stanford.edu/vg705qn907

1
Alex Williams