在scikit-learn

时间:2016-06-10 21:07:44

标签: python machine-learning scikit-learn pca

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

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

2 个答案:

答案 0 :(得分:9)

我在这里假设,通过EigenVectors,你的意思是协方差矩阵的特征向量。

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

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)。这些行中的每一行是居中协方差矩阵XX T 的特征向量。

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

[ 0.99244289  0.00755711]

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

如果对PCA基本数学的理解是明确的,那么获得特征向量和特征值的更好方法是使用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)

来到你的第二个问题。这些EigenValues和EigenVectors不能用于分类。对于分类,您需要每个数据点的功能。您生成的这些特征向量和特征值来自整个协方差矩阵XX T 。对于降维,您可以使用原始点的投影(在p维空间中)对由PCA获得的主要组件进行投影。但是,这并不总是有用,因为PCA没有考虑训练数据的标签。我建议你研究LDA的监督问题。

希望有所帮助。

答案 1 :(得分:0)

文档说explained_variance_会给你

"每个所选组件解释的差异量。 等于x的协方差矩阵的n_components最大特征值。",版本0.18中的新特征值。

似乎有点疑问,因为第一句和第二句似乎不同意。

sklearn PCA documentation