2017-11-24 5 views
0

なぜsklearn.decomposition.PCA.fit_transform(X)はXで乗算をしませんか?私の知る限り、一般的に次のステップであるPCAに理解されるように

  1. は*(Xの*のX ')の共分散行列Σ=(1/m)を計算する
  2. Σ上の特異値分解を適用します。 U、Sは、V = SVD(Σ)
  3. 寸法をkに減少させるためにUの最初のk列を取る:U_reduced = U [:、k]は
  4. X_reduced = U_reduced」* X

X_reducedでありますXはk次元に縮小される。

しかし、私はimplementation of SKLearnに見ていたとき、私はこのコード行が見つかりました:

U *= S[:self.n_components_] 

をとSを使用しての代わりに、Xまだ有効であるなぜ、このUが変換X. として返されますか?

答えて

3

1-2の理解は間違っています。 PCAは、のいずれかに、共分散行列またはの固有ベクトルを見つけることによって実装できます。これは、SVDを中心のデータ行列に適用することによって行われます。あなたは共分散とSVDの両方をしません。実際には、共分散行列の計算は、条件の悪い行列に関連する数値問題を増幅するので、SVD手法が好ましい。そしてSKLearnはそれを使用します。ここでthe core of the methodある:

self.mean_ = np.mean(X, axis=0) 
X -= self.mean_ 
U, S, V = linalg.svd(X, full_matrices=False) 

SVD(マトリックス乗算のため、@を使用して、実数値データを想定)U @ S @ V.TとしてXを表します。ここで、Vは共分散行列の固有ベクトルからなり、直交性関係を満たす。V.T @ V = I

固有ベクトルVに関して、変換されたデータはX @ Vである。しかし、XはU @ S @ V.Tに等しいので、両辺にVを掛けると、X @ VU @ Sに等しくなります。したがって、U @ Sは変換されたデータです。

対角であるSを、任意の密行列であるXよりも乗算する方が簡単です。

詳細については、Relationship between SVD and PCA. How to use SVD to perform PCA?

関連する問題