代数的/厳密なレベルでの主成分分析と特異値分解の関係を理解しています。私の質問は、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 T
関連コード:PCAのライン415 TruncatedSVDのライン137。
Xtimes()
Xt_times()