scikit学习中PCA特征值和特征向量的发现与利用

2024-04-20 00:19:46 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
2条回答

我假设这里的特征向量是指协方差矩阵的特征向量。

假设在p维空间中有n个数据点,X是点的p X n矩阵,那么主成分的方向是协方差矩阵XXT的特征向量。通过访问PCA对象的components_属性,可以从sklearn获取这些特征向量的方向。具体操作如下:

from sklearn.decomposition import PCA
import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA()
pca.fit(X)
print pca.components_

这会产生如下输出

[[ 0.83849224  0.54491354]
[ 0.54491354 -0.83849224]]

其中每一行都是p维空间中的主成分(本玩具示例中为2)。每一行是中心协方差矩阵XXT的特征向量。

就特征值而言,没有直接的方法从PCA对象获取它们。PCA对象有一个名为explained_variance_ratio_的属性,该属性给出每个组件的方差百分比。每个分量的这些数字与特征值成正比。在我们的玩具示例中,如果打印explained_variance_ratio_属性,我们将得到这些:

[ 0.99244289  0.00755711]

这意味着第一主分量的特征值与第二主分量的特征值之比是0.99244289:0.00755711

如果对主成分分析的基本数学理解清楚,则用numpy.linalg.eig求中心协方差矩阵的特征值和特征向量是获得特征向量和特征值的较好方法。如果数据矩阵是p x n矩阵,x(p特征,n点),则可以使用以下代码:

import numpy as np
centered_matrix = X - X.mean(axis=1)[:, np.newaxis]
cov = np.dot(centered_matrix, centered_matrix.T)
eigvals, eigvecs = np.linalg.eig(cov)

来回答你的第二个问题。这些特征值和特征向量本身不能用于分类。对于分类,您需要每个数据点的特征。生成的这些特征向量和特征值来自整个协方差矩阵XXT。对于降维,可以使用主成分分析得到的主成分上的原始点投影(在p维空间中)。但是,这并不总是有用的,因为主成分分析没有考虑到你的训练数据的标签。我建议你调查一下后勤部的监督问题。

希望能有所帮助。

医生说explained_variance_会给你

“每一个选定部分解释的差异量。等于n_分量X的协方差矩阵的最大特征值。”,0.18版新版本。

似乎有点可疑,因为第一句和第二句似乎不一致。

sklearn PCA documentation

相关问题 更多 >