gpt4 book ai didi

python - 在 sklearn.decomposition.PCA 中,为什么 components_ 是负的?

转载 作者:太空狗 更新时间:2023-10-29 17:32:16 26 4
gpt4 key购买 nike

我正在尝试跟随 Abdi & Williams - Principal Component Analysis (2010) 并通过 SVD 构建主成分,使用 numpy.linalg.svd .

当我显示 components_ 时来自带有 sklearn 的拟合 PCA 的属性,它们与我手动计算的那些大小完全相同,但一些(不是全部)符号相反。这是什么原因造成的?

更新:我在下面的(部分)回答包含一些额外的信息。

采用以下示例数据:

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]]

最佳答案

正如您在回答中了解到的,奇异值分解 (SVD) 的结果在奇异向量方面并不是唯一的。实际上,如果 X 的 SVD 是\sum_1^r\s_i u_i v_i^\top : enter image description here

随着 s_i 以递减方式排序,然后您可以看到您可以更改 u_1 和 v_1 的符号(即“翻转”),减号将取消,因此公式仍然有效。

这表明 SVD 是唯一的直到左右奇异向量对的符号发生变化

由于 PCA 只是 X 的 SVD(或 X^\top X 的特征值分解),因此无法保证每次执行时都不会在同一 X 上返回不同的结果。可以理解的是,scikit learn 实现想要避免这种情况:他们保证返回的左右奇异向量(存储在 U 和 V 中)始终相同,通过强加(这是任意的)绝对值中 u_i 的最大系数为正.

如您所见阅读the source :首先,他们使用 linalg.svd() 计算 U 和 V。然后,对于每个向量 u_i(即 U 的行),如果其绝对值中的最大元素为正,则它们什么都不做。否则,他们将 u_i 更改为 - u_i,并将相应的左奇异向量 v_i 更改为 - v_i。如前所述,这不会更改 SVD 公式,因为减号抵消了。但是,现在可以保证经过此处理后返回的 U 和 V 始终相同,因为符号上的不确定性已被删除。

关于python - 在 sklearn.decomposition.PCA 中,为什么 components_ 是负的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44765682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com