主成分分析が行列に対してSVDを実行してから、固有値行列を生成することを知っています。主成分を選択するには、最初のいくつかの固有値のみを取得する必要があります。では、固有値行列から取得する必要のある固有値の数をどのように決定するのでしょうか。
6 に答える
保持する固有値/固有ベクトルの数を決定するには、最初にPCAを実行する理由を考慮する必要があります。ストレージ要件を減らすため、分類アルゴリズムの次元を減らすため、またはその他の理由でそれを行っていますか?厳密な制約がない場合は、固有値の累積合計をプロットすることをお勧めします(降順であると仮定)。プロットする前に各値を固有値の合計で割ると、プロットには、保持された分散の合計と固有値の数の割合が表示されます。プロットは、収穫逓減のポイントに到達したときの適切な指標を提供します(つまり、追加の固有値を保持することによって分散がほとんど得られません)。
正解はありません。1からnの間です。
主成分を、これまで訪れたことのない町の通りと考えてください。町を知るためにいくつの通りをとるべきですか?
さて、あなたは明らかにメインストリート(最初のコンポーネント)、そしておそらく他のいくつかの大きな通りも訪れるべきです。あなたは町を十分に知るためにすべての通りを訪れる必要がありますか?おそらくそうではありません。
町を完全に知るためには、すべての通りを訪れる必要があります。しかし、50通りのうち10通りを訪れて、町を95%理解できるとしたらどうでしょうか。それで十分ですか?
基本的に、十分な分散を説明するのに十分なコンポーネントを選択する必要があります。
他の人が言ったように、説明された分散をプロットすることは害はありません。
教師あり学習タスクの前処理ステップとしてPCAを使用する場合は、データ処理パイプライン全体を相互検証し、PCA次元の数をハイパーパラメーターとして扱い、最終的な教師ありスコア(分類用のF1スコアなど)でグリッド検索を使用して選択する必要があります。または回帰の場合はRMSE)。
データセット全体の交差検定グリッド検索のコストが高すぎる場合は、2つのサブサンプルを試してください。たとえば、1つはデータの1%で、もう1つは10%で、PCAディメンションに同じ最適値が得られるかどうかを確認します。
そのために使用されるヒューリスティックは多数あります。
たとえば、全分散の少なくとも85%をキャプチャする最初のk個の固有ベクトルを取得します。
ただし、高次元の場合、これらのヒューリスティックは通常あまり良くありません。
状況によっては、データをndim
ディメンションに投影することにより、最大許容相対誤差を定義することが興味深い場合があります。
Matlabの例
これを小さなmatlabの例で説明します。興味がない場合は、コードをスキップしてください。
最初に、正確に100個の非ゼロ主成分を含むn
サンプル(行)と特徴のランダム行列を生成します。p
n = 200;
p = 119;
data = zeros(n, p);
for i = 1:100
data = data + rand(n, 1)*rand(1, p);
end
画像は次のようになります。
このサンプル画像の場合、入力データを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
次元数(主成分)の関数で相対誤差をプロットすると、次のグラフになります。
このグラフに基づいて、考慮する必要のある主成分の数を決定できます。この理論上の画像では、100個のコンポーネントを取得すると、正確な画像表現が得られます。したがって、100を超える要素を取得することは無意味です。たとえば、最大5%のエラーが必要な場合は、約40の主成分を取る必要があります。
免責事項:取得した値は、私の人工データに対してのみ有効です。したがって、提案された値を状況に応じて盲目的に使用するのではなく、同じ分析を実行して、発生するエラーと必要なコンポーネントの数の間でトレードオフを行います。
コードリファレンス
GavishとDonohoによる次の論文を強くお勧めします。特異値の最適なハードしきい値は4/sqrt(3)です。
CrossValidated (stats.stackexchange.com)にこれのより長い要約を投稿しました。簡単に言えば、彼らは非常に大きな行列の限界で最適な手順を取得します。手順は非常に単純で、手動で調整されたパラメータを必要とせず、実際には非常にうまく機能しているようです。
彼らはここに素晴らしいコード補足を持っています:https ://purl.stanford.edu/vg705qn9070