我正在做一些主成分分析,我碰巧遇到了几种不同的方法来获取特征向量和特征值。
具体来说,我发现在scipy.sparse.linalg
中有一个eigs
方法,在sklearn.decomposition.PCA()
中,我也可以通过访问explained_variance_
属性来获得特征值。
然而,我已经运行了几次,我得到了一些特征值的不匹配。我知道特征向量可能不同,因为它们可能是标量倍数,但我不明白特征值为什么也会不同。
下面是一个例子:
import numpy as np
import scipy.sparse.linalg as ll
from sklearn.decomposition import PCA
a = np.array([[0,0,0],[0,0,1],[0,1,0]])
w1, v1 = ll.eigs(a, k=3)
w2 = PCA(n_components=3).fit(a).explained_variance_
w1.real
array([ 1., -1., 0.])
w2
array([0.5 , 0.16666667, 0. ])
你会看到w1
和w2
有不同的特征值。我不确定我是否误解了一些基本的线性代数概念,或者我的代码有问题。
1条答案
按热度按时间nbnkbykc1#
scikit-learn
的PCAfit()
方法将形状为(n_samples, n_features)
的数据集X
作为输入,其中n_samples
是样本数,n_features
是特征数,然后分解X
的(n_features, n_features)
协方差矩阵,而scipy
的eigs()
直接将待分解的矩阵作为输入。这意味着,为了获得相似的特征值,您应该将
scikit-learn
的PCA拟合到协方差矩阵接近a
的数据集X
,请参见下面的示例: