我一直在使用scikit-learn中实现的PCA。但是,我想要找到适合训练数据集后得到的特征值和特征向量。文档中没有提及这两者。在scikit-learn中查找和利用PCA中的特征值和特征向量
其次,这些特征值和特征向量本身可以用作分类目的的特征吗?
我一直在使用scikit-learn中实现的PCA。但是,我想要找到适合训练数据集后得到的特征值和特征向量。文档中没有提及这两者。在scikit-learn中查找和利用PCA中的特征值和特征向量
其次,这些特征值和特征向量本身可以用作分类目的的特征吗?
我在这里假设,通过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的监督问题。
希望有所帮助。
很好的解释。你知道,在LDA的情况下,如果lda.coef_存储特征向量? – sera