Pca
numpy 和 sklearn 中的 PCA 產生不同的結果 [關閉]
我是不是誤會了什麼。這是我的代碼
使用 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 並從幾個主成分重構原始變量?