sci-kit 学习 PCA 和手动 PCA 的结果差异

Posted

技术标签:

【中文标题】sci-kit 学习 PCA 和手动 PCA 的结果差异【英文标题】:Difference in result for sci-kit learn PCA and manual PCA 【发布时间】:2020-10-15 10:33:56 【问题描述】:

我真的很困惑,希望有人能告诉我我错过了什么。我正在尝试通过两种不同的方法获取主成分:

import numpy as np
data = np.array([[ 2.1250045 , -0.17169867, -0.47799957],
               [ 0.7400025 , -0.07970344, -0.99600106],
               [ 0.15800177,  1.2993019 , -0.8030003 ],
               [ 0.3159989 ,  1.919297  ,  0.24300112],
               [-0.14800562, -1.0827019 , -0.2890004 ],
               [ 0.26900184, -1.3816979 ,  1.1239979 ],
               [-0.5040008 , -2.9066994 ,  1.6400006 ],
               [-1.2230027 , -2.415702  ,  3.1940014 ],
               [-0.54700005,  1.757302  , -1.825999  ],
               [-1.1860001 ,  3.0623024 , -1.8090007 ]]) # this should already be mean centered



# Method 1. Scikit-Learn
from sklearn.decomposition import PCA

pca = PCA(n_components=3).fit(data)
print(pca.components_)
[[-0.04209988 -0.79261507  0.60826717]
 [ 0.88594009 -0.31106375 -0.34401963]
 [ 0.46188501  0.52440508  0.71530521]]


# Method 2. Manually with numpy
cov = np.cov(data.T)

evals , evecs = np.linalg.eig(cov)

# The next three lines are just sorting by the largest eigenvalue
idx = np.argsort(evals)[::-1]
evecs = evecs[:,idx]
evals = evals[idx]

print(evecs.T)
[[ 0.04209988  0.79261507 -0.60826717]
 [ 0.88594009 -0.31106375 -0.34401963]
 [-0.46188501 -0.52440508 -0.71530521]]

特征向量的值相同,但符号错误。我想要的是从 sklearn PCA 获取输出,但只使用 numpy。提前感谢您的任何建议。

【问题讨论】:

【参考方案1】:

这是预期的,因为矩阵的特征空间(您问题中的协方差矩阵)是唯一的,但特定的特征向量集不是。这里解释太多了,推荐the answer in math.se

PS:请注意,您正在处理 3x3 的协方差矩阵,您可以将特征向量想象为具有 x、y、z 轴的 3D 向量。然后你应该注意到你的 numpy 答案与 sklearn 答案对于 2 个向量的方向完全相反,而对于 1 个向量的方向相同。

【讨论】:

以上是关于sci-kit 学习 PCA 和手动 PCA 的结果差异的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD PCA与SVD 之 PCA中的SVD

机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD PCA与SVD 之 PCA中的SVD

吴恩达机器学习-9-降维PCA

PCA和LDA

机器学习面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?

使用 PCA 时有监督学习和无监督学习的区别