sk-learn 中的 pca.components_ 是什么?

机器算法验证 主成分分析 scikit-学习 svd
2022-03-23 19:27:50

我一直在阅读一些关于 PCA 的文档并尝试使用 scikit-learn 来实现它。但是我很难理解 sklearn.decompositon.PCA 返回的属性是什么从我在这里读到的和这个属性的名称我的第一个猜测是属性 .components_ 是主成分的矩阵,这意味着如果我们有数据集X 可以使用 SVD 分解为

X = USV^T

那么我希望属性 .components_ 等于

XV = 美国。

为了澄清这一点,我采用了奇异值分解(此处)的维基百科页面的第一个示例,并尝试实现它以查看是否获得了预期的结果。但我得到了一些不同的东西。为了确保我没有犯错,我使用 scipy.linalg.svd 对矩阵 X 进行奇异值分解,并获得了维基百科上描述的结果:

X = np.array([[1, 0, 0, 0, 2],
          [0, 0, 3, 0, 0],
          [0, 0, 0, 0, 0],
          [0, 2, 0, 0, 0]])
U, s, Vh = svd(X)
print('U = %s'% U)
print('Vh = %s'% Vh)
print('s = %s'% s)

输出:

U = [[ 0.  1.  0.  0.]
[ 1.  0.  0.  0.]
[ 0.  0.  0. -1.]
[ 0.  0.  1.  0.]]
Vh = [[-0.          0.          1.          0.          0.        ]
[ 0.4472136   0.          0.          0.          0.89442719]
[-0.          1.          0.          0.          0.        ]
[ 0.          0.          0.          1.          0.        ]
[-0.89442719  0.          0.          0.          0.4472136 ]]
s = [ 3.          2.23606798  2.          0.        ]

但是通过 sk-learn 我得到了这个:

pca = PCA(svd_solver='auto', whiten=True)
pca.fit(X)
print(pca.components_)
print(pca.singular_values_)

输出是

[[ -1.47295237e-01  -2.15005028e-01   9.19398392e-01  -0.00000000e+00
-2.94590475e-01]
[  3.31294578e-01  -6.62589156e-01   1.10431526e-01   0.00000000e+00
6.62589156e-01]
[ -2.61816759e-01  -7.17459719e-01  -3.77506920e-01   0.00000000e+00
-5.23633519e-01]
[  8.94427191e-01  -2.92048264e-16  -7.93318415e-17   0.00000000e+00
-4.47213595e-01]]
[  2.77516885e+00   2.12132034e+00   1.13949018e+00   1.69395499e-16]

这不等于 SV^T(我省去了矩阵乘法,因为无论如何你可以看到奇异值与上面获得的不同)。我试图看看如果我将参数设置为 False 或参数 svd_solver 设置为 'full' 会发生什么,但它不会改变结果。

您是否在某处看到错误,或者您有解释?


3个回答

令人烦恼的是,除了PCA 方法的一般描述之外,没有关于此属性的 SKLearn 文档。

是经典面部识别项目中的一个有用应用程序pca.components_(使用与 SKL 捆绑的数据,因此您无需下载任何额外内容)。通过这个简洁的笔记本工作是了解定义和应用的最佳方式pca.components_

从那个项目,以及StackOverflow 上的这个答案,我们可以了解到这pca.components_您的投影空间的所有特征向量(又名载荷)的集合(每个主成分一个特征向量)。使用 获得特征向量pca.components_后,以下是获取特征值的方法。

有关特征向量与载荷的定义和应用的更多信息(包括链接所有三个概念的方程),请参见此处

pca.components_对于适用于(相同)面部识别数据的第二个项目/笔记本,请参见此处它比上面引用的第一个项目具有更传统的碎石地块。

pca.components_ 就是加载分数。使用带有 SVD(奇异值分解)的 PCA,主成分被缩放为 1。将加载分数想象成鸡尾酒的配方,其中我们的 PC1 是由(PC1 的加载分数)Gen1 的 0.97 部分和 Gen2 的 0.242 部分制成的, PC2 是 Gen1 的 -0.242 部分和 Gen2 的 0.97 部分(PC2 的加载分数)。

这确实为我们提供了每个分量的所谓奇异向量或特征向量(加载分数是第一个分量的每个变量的系数与第二个分量的系数)。

这也表明哪些变量对每个组件的影响最大。载荷的范围可以从 -1 到 1。载荷接近 -1 或 1 表示变量对组件的影响很大。接近 0 的载荷表明变量对分量的影响较弱。评估载荷还可以帮助您根据变量来表征每个组件。

我建议观看流动的视频:https ://www.youtube.com/watch?v=FgakZw6K1QQ

components_在数学上是中心输入矩阵的协方差矩阵的特征向量。这可以通过使用普通的 numpy 来验证。