2016-06-10 250 views

回答

4

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

假设您在p维空间中有n个数据点,并且X是您的点的p×n矩阵,那么主要分量的方向是协方差矩阵的特征向量XX T。通过访问PCA对象的components_属性,可以从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×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的监督问题。

希望有所帮助。

+0

很好的解释。你知道,在LDA的情况下,如果lda.coef_存储特征向量? – sera

相关问题