我试图在 sklearn 的 PCA API 中使用 numpy在 numpy 中使用 PCA 来复制 PCA,而 sklearn 会产生不同的结果。我注意到:
- 特征值与 PCA 对象的 explain_variance_ 属性以及顺序相同
- 特征向量不相同。这是我的代码:
import numpy as np
from sklearn.decomposition import PCA
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
X = datasets.load_iris()['data']
X_scaled = StandardScaler().fit_transform(X)
pca = PCA(n_components=4)
pca.fit(X_scaled)
print('Explained Variance = ', pca.explained_variance_)
print('Principal Components = ', pca.components_)
这给了我:
Explained Variance = [2.93808505 0.9201649 0.14774182 0.02085386]
Principal Components = [[ 0.52106591 -0.26934744 0.5804131 0.56485654]
[ 0.37741762 0.92329566 0.02449161 0.06694199]
[-0.71956635 0.24438178 0.14212637 0.63427274]
[-0.26128628 0.12350962 0.80144925 -0.52359713]]
使用 Numpy:
cov = np.cov(X_scaled.T)
eig_val, eig_vec = np.linalg.eig(cov)
print('Eigenvalues = ', eig_val)
print('Eigenvectors = ', eig_vec)
这给了我:
Eigenvalues = [2.93808505 0.9201649 0.14774182 0.02085386]
Eigenvectors = [[ 0.52106591 -0.37741762 -0.71956635 0.26128628]
[-0.26934744 -0.92329566 0.24438178 -0.12350962]
[ 0.5804131 -0.02449161 0.14212637 -0.80144925]
[ 0.56485654 -0.06694199 0.63427274 0.52359713]]
pca.explained_variance_
请注意,特征值与ie完全相同,不像numpy 中的后 PCA 和 sklearn 产生不同的结果表明,我们确实通过 numpy 中的降序获得特征值(至少在本示例中),但特征向量与pca.components_
. 为什么会这样以及如何手动复制 Sklearn 的 PCA API 的确切结果。