【发布时间】:2019-03-05 01:29:10
【问题描述】:
我有一个包含 400 个特征的数据集。
我做了什么:
# approach 1
d_cov = np.cov(d_train.transpose())
eigens, mypca = LA.eig(d_cov) # assume sort by eigen value also/ LA = numpy linear algebra
# approach 2
pca = PCA(n_components=300)
d_fit = pca.fit_transform(d_train)
pc = pca.components_
现在,这两个应该是一样的,对吧?因为 PCA 只是协方差矩阵的特征分解。
但在我的情况下这些有很大不同吗?
怎么可能,我在上面做错了什么?
比较差异:
import numpy as np
LA = np.linalg
d_train = np.random.randn(100, 10)
d_cov = np.cov(d_train.transpose())
eigens, mypca = LA.eig(d_cov)
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
pca = PCA(n_components=10)
d_fit = pca.fit_transform(d_train)
pc = pca.components_
ve = pca.explained_variance_
#mypca[0,:], pc[0,:] pc.transpose()[0,:]
plt.plot(list(range(len(eigens))), [ x.transpose().dot(d_cov).dot(x) for x,y in zip(mypca, eigens) ])
plt.plot(list(range(len(ve))), ve)
plt.show()
print(mypca, '\n---\n' , pc)
【问题讨论】:
-
能否请您出示您的进口声明?
-
你试过
pc.transpose()吗? -
@P.Camilleri 但即使是差异也不一样?至少由 PC 和特征向量解释的方差应该是 sam,对吧?请查看编辑。
-
仅供参考,使用 pc.T 而不是 pc.transpose(),它更短,您可以避免创建新数组
标签: numpy scikit-learn linear-algebra pca