【发布时间】:2017-11-29 15:29:46
【问题描述】:
我正在尝试跟随 Abdi & Williams - Principal Component Analysis (2010) 并使用 numpy.linalg.svd 通过 SVD 构建主要组件。
当我使用 sklearn 显示来自拟合 PCA 的 components_ 属性时,它们的大小与我手动计算的完全相同,但 一些(不是全部)是相反的符号。这是什么原因造成的?
更新:下面我的(部分)答案包含一些附加信息。
以下面的数据为例:
from pandas_datareader.data import DataReader as dr
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import scale
# sample data - shape (20, 3), each column standardized to N~(0,1)
rates = scale(dr(['DGS5', 'DGS10', 'DGS30'], 'fred',
start='2017-01-01', end='2017-02-01').pct_change().dropna())
# with sklearn PCA:
pca = PCA().fit(rates)
print(pca.components_)
[[-0.58365629 -0.58614003 -0.56194768]
[-0.43328092 -0.36048659 0.82602486]
[-0.68674084 0.72559581 -0.04356302]]
# compare to the manual method via SVD:
u, s, Vh = np.linalg.svd(np.asmatrix(rates), full_matrices=False)
print(Vh)
[[ 0.58365629 0.58614003 0.56194768]
[ 0.43328092 0.36048659 -0.82602486]
[-0.68674084 0.72559581 -0.04356302]]
# odd: some, but not all signs reversed
print(np.isclose(Vh, -1 * pca.components_))
[[ True True True]
[ True True True]
[False False False]]
【问题讨论】:
-
这里是使用 PCA 的 R 包的解释。 stats.stackexchange.com/questions/88880/…
标签: python python-3.x numpy scikit-learn pca