我一直在使用scikit-learn中实现的PCA。但是,我想找到在我们拟合训练数据集后得到的特征值和特征向量。文档中没有提及这两者。
其次,这些特征值和特征向量本身可以用作分类目的的特征吗?
答案 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中的新特征值。
似乎有点疑问,因为第一句和第二句似乎不同意。