Pca

numpy 和 sklearn 中的 PCA 產生不同的結果 [關閉]

  • September 20, 2016

我是不是誤會了什麼。這是我的代碼

使用 sklearn

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import decomposition
from sklearn import datasets
from sklearn.preprocessing import StandardScaler

pca = decomposition.PCA(n_components=3)

x = np.array([
       [0.387,4878, 5.42],
       [0.723,12104,5.25],
       [1,12756,5.52],
       [1.524,6787,3.94],
   ])
pca.fit_transform(x)

輸出:

array([[ -4.25324997e+03,  -8.41288672e-01,  -8.37858943e-03],
  [  2.97275001e+03,  -1.25977271e-01,   1.82476780e-01],
  [  3.62475003e+03,  -1.56843494e-01,  -1.65224286e-01],
  [ -2.34425007e+03,   1.12410944e+00,  -8.87390454e-03]])

使用 numpy 方法

x_std = StandardScaler().fit_transform(x)
cov = np.cov(x_std.T)
ev , eig = np.linalg.eig(cov)
a = eig.dot(x_std.T)

輸出

array([[ 0.06406894,  0.94063993, -1.62373172],
  [-0.35357757,  0.7509653 ,  0.63365168],
  [ 0.29312477,  0.6710958 ,  1.11766206],
  [-0.00361615, -2.36270102, -0.12758202]])

我保留了所有 3 個組件,但它似乎不允許我保留我的原始數據。

我可以知道為什麼會這樣嗎?

如果我想取回我的原始矩陣,我該怎麼辦?

不同之處在於decomposition.PCA,在進行 PCA 之前沒有標準化您的變量,而在您的手動計算中,您調用StandardScaler進行標準化。因此,您正在觀察這種差異:PCA 是相關性還是協方差?

如果你更換

pca.fit_transform(x)

x_std = StandardScaler().fit_transform(x)
pca.fit_transform(x_std)

您將獲得與手動計算相同的結果…

…但僅取決於 PC 的順序。那是因為當你跑

ev , eig = np.linalg.eig(cov)

你得到的特徵值不一定按降序排列。我明白了

array([ 0.07168571,  2.49382602,  1.43448827])

因此,您將需要手動訂購它們。Sklearn 會為您做到這一點。


關於重構原始變量,請參閱如何反轉 PCA 並從幾個主成分重構原始變量?

引用自:https://stats.stackexchange.com/questions/235882

comments powered by Disqus