在 scikit-learn 中从 PCA 中查找和利用特征值和特征向量

Posted

技术标签:

【中文标题】在 scikit-learn 中从 PCA 中查找和利用特征值和特征向量【英文标题】:Finding and utilizing eigenvalues and eigenvectors from PCA in scikit-learn 【发布时间】:2016-10-11 22:46:25 【问题描述】:

我一直在使用 scikit-learn 中实现的 PCA。但是,我想找到拟合训练数据集后产生的特征值和特征向量。文档中没有提到两者。

其次,这些特征值和特征向量本身是否可以用作分类目的的特征?

【问题讨论】:

重复? ***.com/questions/31909945/… 【参考方案1】:

文档说explained_variance_会给你

“每个选定组件解释的方差量。等于 X 的协方差矩阵的 n_components 个最大特征值。”,0.18 版中的新功能。

似乎有点问题,因为第一句话和第二句话似乎不一致。

sklearn PCA documentation

【讨论】:

【参考方案2】:

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

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

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

如果对PCA的基础数学理解清楚,那么更好的获取Eigenvectors和Eigenvalues的方法是使用numpy.linalg.eig获取居中协方差矩阵的Eigenvalues和Eigenvectors。如果您的数据矩阵是 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)

关于你的第二个问题。这些 EigenValues 和 EigenVectors 本身不能用于分类。对于分类,您需要每个数据点的特征。您生成的这些特征向量和特征值源自整个协方差矩阵 XXT。对于降维,您可以使用原始点(在 p 维空间中)对作为 PCA 结果获得的主成分的投影。但是,这也并不总是有用,因为 PCA 没有考虑训练数据的标签。我建议您查看 LDA 是否有监督问题。

希望对您有所帮助。

【讨论】:

很好的解释。你知道,在 LDA 的情况下,如果 lda.coef_ 存储特征向量? 如果我们最终没有得到特征值/向量,那么来自 sklearn.decomposition 的 PCA 有什么意义? 顺便说一句,大型数据集上的 np.dot() 在我的机器上占用了 32G 内存。

以上是关于在 scikit-learn 中从 PCA 中查找和利用特征值和特征向量的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 中的 PCA 投影和重建

scikit-learn 内核 PCA 解释方差

PCA详解-并用scikit-learn实现PCA压缩红酒数据集

Spark 中的 PCA 输出与 scikit-learn 不匹配

使用 scikit-learn PCA 找到具有最高方差的维度

scikit-learn PCA 没有“分数”方法