非常に高次元のデータに対してPCAを実行するにはどうすればよいですか?


12

主成分分析(PCA)を実行するには、データから各列の平均を差し引き、相関係数行列を計算してから、固有ベクトルと固有値を見つける必要があります。まあ、むしろ、これはPythonで実装するために行ったものですが、相関係数行列(corrcoef)を見つける方法では高次元の配列を使用できないため、小さな行列でしか機能しません。画像に使用する必要があるため、現在の実装では本当に役に立ちません。

データマトリックスを取得して、代わりにを計算することは可能であると読みましたが、それは私にはうまくいきません。まあ、私はそれが(私の場合は)ではなくマトリックスであることになっているという事実を除いて、それが何を意味するのか理解しているとははっきりとはわかりません。私はそれらについてeigenfacesチュートリアルで読みましたが、どれも私が本当に理解できるような方法でそれを説明していないようです。D D / N D D / N N × N P × P P » NDDD/nDD/nn×np×ppn

簡単に言うと、このメソッドの簡単なアルゴリズムの説明はありますか?


あなたが読んだことは正しいです。行列はグラム行列と呼ばれます。その固有ベクトルは(スケーリングされた)主成分です。その固有値は、因子まで、共分散行列固有値とまったく同じです。 1 / N D D / NDD1/nDD/n
amoeba氏は、2015

回答:


10

標準のPCAを行う最も簡単な方法は、列の平均を差し引くことによってデータマトリックスの列を中央に配置し(列が異なる変数に対応していると想定)、SVDを実行することです。左の特異ベクトルに対応する特異値を掛けると、(推定された)主成分に対応します。右の特異ベクトルは、(推定された)主成分の方向に対応します。これらは、PCAによって与えられる固有ベクトルと同じです。特異値は主成分の標準偏差に対応します(ルートnの係数で乗算されます。nはデータマトリックスの行数です)。これは、PCAによって与えられる固有値の平方根と同じです。

相関行列でPCAを実行する場合は、SVDを適用する前に、データ行列の列を標準化する必要があります。これは、平均を差し引いて(センタリング)、標準偏差で除算する(スケーリング)ことを意味します。

完全なPCAが必要な場合は、これが最も効率的な方法です。これは、代数を使用して、サンプルの共分散行列のスペクトル分解を行うのと同じ答えが得られることを確認できます。

一部のPCのみが必要な場合、部分的なSVDを計算する効率的な方法もあります。これらのいくつかは、パワー反復のバリアントです。ランチョスアルゴリズムは、部分最小二乗法に関連している一例です。マトリックスが巨大な場合は、おおよその方法を使用した方がよい場合があります。この場合、PCAを正規化する統計的な理由もあります。


私が間違っている場合は修正してください。ただし、LanczosアルゴリズムはSVDではなく固有分解を実行すると思います。
amoeba氏は

1
興味のある読者は、SVDを
アメーバは、モニカを

9

現在行っていることは近いですが、の固有ベクトルを取得する(data . data.T) / linesには、左側のの固有ベクトルにを乗算する必要があります。これは、「転置トリック」と呼ばれることもあります。data.T(data.T . data) / lines

AAATA

Am×nn>>mATAn×nATAm×mAATATAAAT

vAATλ

  • AATv=λv
  • AT(AATv)=AT(λv)
  • (ATA)(ATv)=λ(ATv)

vAATATvATAAATAvAATATATvATA


1
これは、PCAに適用される「カーネルトリック」のように聞こえます。en.wikipedia.org/wiki/Kernel_PCAこれは、特定の大きな行列を処理する非常に良い方法です。
ギリアド

AA

8

PCAを実行するためのNIPALSアルゴリズムが必要なようです。統計学者の間で非常に人気のあるアルゴリズムです。これには多くの利点があります。

  • 最初のいくつかのコンポーネントのみが必要な場合、SVDまたは固有値分解法よりも計算コストが低くなります。
  • 共分散行列が形成されないため、一般に、より適度なストレージ要件があります。これは非常に大きなデータセットにとって非常に重要な特性です。
  • データセット内の欠落データを処理できます(ただし、画像を扱っているため、問題にはなりません)。

説明
http://en.wikipedia.org/wiki/Non-linear_iterative_partial_least_squares

アルゴリズムこれ
は、アルゴリズムの簡単で優れた説明です(セクション1.2)
http://stats4.eng.mcmaster.ca/w/mediafiles/mediawiki/f/f7/Section-Extra-Class-1.pdf

PCAはスケールの影響を受けやすいので、PCAを実行する前に、まずセンタースケールを意味することを忘れないでください。


4

ギリアドの答えを補足すると、これらは切り捨てられたPCAの計算コストが低いアルゴリズムです。NIPALSは確かに非常に人気がありますが、部分的なデータ(ランダムな投影によってPCAと呼ばれることが多いもの)に一連の近似を実行する近似メソッドで多くの成功を収めてきました。これはmetaoptimizeスレッドで議論されました。

Pythonについて言及しているように、アルゴリズムはscikit-learnPCAクラスに実装されていることを指摘しておきます。特に、eigenfacesを示す例で使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.