python - sci-kit 学习 PCA 和手动 PCA 的结果差异
问题描述
我真的很困惑,希望有人能告诉我我错过了什么。我正在尝试通过两种不同的方法获取主要组件:
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。在此先感谢您的任何建议。
解决方案
这是预期的,因为矩阵的特征空间(您问题中的协方差矩阵)是唯一的,但特定的特征向量集不是。这里解释的太多了,所以我会推荐math.se 中的答案
PS:请注意,您正在处理 3x3 的协方差矩阵,您可以将特征向量想象为具有 x、y、z 轴的 3D 向量。然后你应该注意到你的 numpy 答案与 sklearn 答案对于 2 个向量的方向完全相反,而对于 1 个向量的方向相同。
推荐阅读
- google-sheets - 在模板中使用 ImportRange 并维护工作表关联
- intellij-idea - IntelliJ:如何在调试期间禁用条件提示
- r - 您如何在说明文件的远程部分中指定 GitLab 主机?
- python - 我可以在 Sphinx 的目录中添加水平条吗?
- python-3.x - 谁能帮我理解这段代码的问题?
- bash - 如何使用 BASH 将 JSON Web 密钥集 (JWKS) 公钥转换为 PEM 文件?
- c# - ASP WEB APP(.net 框架) - 未调用 repo 中的方法
- reactjs - 在 Material UI 日期选择器中突出显示周末(周六和周日)
- swift - 未找到 Microsoft 身份验证库 [MSALPublicClientApplicationConfig]
- mongodb - 在 mongoDB 中使用嵌套数组查询文档