PCAとTruncatedSVDのscikit-learn実装の違い


12

代数的/厳密なレベルでの主成分分析と特異値分解の関係を理解し​​ています。私の質問は、scikit-learnの実装についてです。

ドキュメンテーションは、「[TruncatedSVD]はPCAに非常に似ていますが、共分散行列ではなく、サンプルベクトルを直接操作します。」これは、両方のアプローチの代数的な違いを反映しています。ただし、後で説明します:「この推定器[TruncatedSVD]は、2つのアルゴリズムをサポートしています。高速ランダム化SVDソルバーと、(X * XT)または(XT * X)の固有ソルバーとしてARPACKを使用する「単純な」アルゴリズムのいずれか多い方です。効率的。PCAについて、「データの特異値分解を使用してそれを投影する線形次元削減...」と述べています。PCA実装は、同じ2つのアルゴリズム(ランダム化およびARPACK)ソルバーと、もう1つのアルゴリズムLAPACKをサポートしています。コードを見ると、PCAとTruncatedSVDの両方のARPACKとLAPACKの両方がサンプルデータXでsvdを実行しており、ARPACKは(svdsを使用して)スパース行列を処理できることがわかります。

したがって、さまざまな属性とメソッドを除いて、PCAがLAPACK、PCA、およびTruncatedSVDを使用して正確な完全特異値分解を実行できることを除いて、scikit-learnの実装はまったく同じアルゴリズムのようです。最初の質問:これは正しいですか?

2番目の質問:LAPACKとARPACK使用scipy.linalg.svd(X)とscipy.linalg.svds(X)、というXサンプルマトリックスが、彼らは特異値分解またはの固有分解を計算するにもかかわらず、または内部では「ランダム化」ソルバーは積を計算する必要はありませんが。(これは数値の安定性に関連しています。データのSVDによるデータのPCAの理由を参照してください)これは正しいです?X X TXTXXXT

関連コード:PCAのライン415 TruncatedSVDのライン137。


1
コードへのリンクを追加できますか
seanv507

1
ドレイク-最初のQであなたに同意します。2番目は理解できません。「それらは、XT ∗ XXT ∗ XまたはX ∗ XTX ∗ XTの特異値分解または固有分解を内部で計算する」とはどういう意味ですか?XでSVDを使用してすべて行われるコードを示したところですか?-数値の問題は、最初に共分散行列(Cと呼ぶ)を計算し、次にCの固有ベクトルを見つけることを
指します

@ seanv507 2番目の質問について-scipy.linalg.svd(X)はまたは/および の固有分解を行うことによりsvdを計算すると思います。linalg.svds(X)についても同様です。引用:「高速ランダム化SVDソルバー、および(X * XT)または(XT * X)の固有ソルバーとしてARPACKを使用する「単純な」アルゴリズム」。docs.scipy.org/doc/scipy/reference/generated/…の最後の行も参照してください。最初の引用を理解できる唯一の方法は、ランダム化されたアルゴリズムが共分散/グラムマトリックスを計算しない唯一のアルゴリズムであるということですX X TXTXXXT
drake

1
ARPACKアプローチはArnoldi反復のようなものと関係があるので、行列とベクトルの積を行うだけでよいと思います。(原則として、この種の反復法は明示的なも実行せず、ルーチンとのペアのみを実行します。これは、たとえばPDEソルバーの大規模なスパース行列で一般的です。)XXtimes()Xt_times()
GeoMatt22

@ GeoMatt22コメントについて詳しく教えてください。ARPACKまたはLAPACKアプローチは、共分散行列を計算する必要がないため、数値の不安定性に悩まされないということですか?
2016年

回答:


13

PCAとTruncatedSVDのscikit-learn実装は、まったく同じアルゴリズムのようです。

いいえ:PCAは(機能ごとの平均減算によって)中央揃えされたデータの(切り捨てられた)SVD です。データが既に中央に配置されている場合、これら2つのクラスは同じことを行います。

実際にTruncatedSVDは、メモリ使用量を爆発させなければ中央に配置できない大規模なスパースデータセットで役立ちます。

  • numpy.linalg.svdそしてscipy.linalg.svdどちらも、ここで説明されているLAPACK _GESDDに依存しています:http : //www.netlib.org/lapack/lug/node32.html(分割統治ドライバー)

  • scipy.sparse.linalg.svdsARPACKに依存してXTの固有値分解を行います。XまたはX。Arnoldi反復法によるXT(データの形状に依存)。ARPACKのHTMLユーザーガイドには、計算の詳細を隠すフォーマットが壊れていますが、ArnoldiのイテレーションはWikipediaで詳しく説明されていますhttps : //en.wikipedia.org/wiki/Arnoldi_iteration

以下は、scipyでのARPACKベースのSVDのコードです。

https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642(ソースコードの行が変更された場合は、「def svds」の文字列を検索してください) )。


2
1つはスパースデータを効率的にサポートでき(TruncatedSVD)、もう1つはサポートできません(PCA)。これが2つのクラスがある理由です。
ogrisel

1
それが理由であれば、混乱を避けるために、それらをSVDおよびSparseSVD(または同様のもの)と呼びます。
ドレイク、

2
しかし、人々はPCAを望んでおり、PCAが中央データの単なるSVDであることを知らないかもしれません。
ogrisel

5
@drake「手順が異なる(PCAは共分散行列を使用し、SVDはデータ行列を使用する)」には同意しません。PCAは、分析のタイプの名前です。さまざまなアルゴリズムと実装を使用して実行できます。covマトリックスのEIGは1つの方法であり、中央に配置されたデータマトリックスのSVDは別の方法です。EIGとSVDもさまざまな方法で実行できます。重要ではありません-それはすべてPCAです。
アメーバはモニカを復活させます2016

1
@amoeba用語の説明と訂正に感謝します。SVDとEIGがPCAよりも広い範囲の代数定理/方法であることを考えると、あなたの言うことは私にとってより理にかなっています
drake
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.