scipy 解释_variance_用于sklearn.decomposition.PCA

tjrkku2a  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(69)

我正在做一些主成分分析,我碰巧遇到了几种不同的方法来获取特征向量和特征值。
具体来说,我发现在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.        ])

你会看到w1w2有不同的特征值。我不确定我是否误解了一些基本的线性代数概念,或者我的代码有问题。

nbnkbykc

nbnkbykc1#

scikit-learn的PCA fit()方法将形状为(n_samples, n_features)的数据集X作为输入,其中n_samples是样本数,n_features是特征数,然后分解X(n_features, n_features)协方差矩阵,而scipyeigs()直接将待分解的矩阵作为输入。
这意味着,为了获得相似的特征值,您应该将scikit-learn的PCA拟合到协方差矩阵接近a的数据集X,请参见下面的示例:

import numpy as np
import scipy.sparse.linalg as ll
from sklearn.decomposition import PCA
from sklearn.datasets import make_spd_matrix

# number of dimensions
n_dim = 3

# covariance matrix
a = make_spd_matrix(n_dim=n_dim, random_state=42)

# dataset with given covariance matrix
np.random.seed(42)
X = np.random.multivariate_normal(mean=np.zeros(n_dim), cov=a, size=100000)

# decompositions
w0 = np.linalg.eig(a)[0]
w1 = ll.eigs(a, k=n_dim, return_eigenvectors=False)
w2 = PCA(n_components=n_dim).fit(X).explained_variance_

# eigenvalues
print([format(w, '.3f') for w in np.sort(w0.real)[::-1]])
print([format(w, '.3f') for w in np.sort(w1.real)[::-1]])
print([format(w, '.3f') for w in np.sort(w2.real)[::-1]])
# ['3.616', '0.841', '0.242']
# ['3.616', '0.841', '0.242']
# ['3.616', '0.841', '0.242']

相关问题