我一直在利用scikit学习中实现的PCA。然而,我想找到在我们拟合训练数据集之后得到的特征值和特征向量。文件中没有提到这两者。
其次,这些特征值和特征向量本身是否可以用作分类目的的特征?
我假设这里的特征向量是指协方差矩阵的特征向量。
假设在p维空间中有n个数据点,X是点的pxn矩阵,则主分量的方向是协方差矩阵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维空间中)在主成分分析结果中获得的主成分上的投影。然而,这也并不总是有用的,因为PCA没有考虑训练数据的标签。我建议您调查LDA中的监督问题。
希望能有所帮助。
医生说explained_variance_
会给你
"每个选定分量解释的方差。等于X的协方差矩阵的n_components最大特征值。",0.18版本中新增。
似乎有点可疑,因为第一句和第二句似乎不一致。
sklearn PCA文档