在 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 中查找和利用特征值和特征向量的主要内容,如果未能解决你的问题,请参考以下文章
PCA详解-并用scikit-learn实现PCA压缩红酒数据集
Spark 中的 PCA 输出与 scikit-learn 不匹配