Python 从SKPCA获取特征值和向量
如何获得PCA应用程序的特征值和特征向量Python 从SKPCA获取特征值和向量,python,scipy,scikit-learn,pca,Python,Scipy,Scikit Learn,Pca,如何获得PCA应用程序的特征值和特征向量 from sklearn.decomposition import PCA clf=PCA(0.98,whiten=True) #converse 98% variance X_train=clf.fit_transform(X_train) X_test=clf.transform(X_test) 我在里面找不到它 1.我“无法”理解这里的不同结果 编辑: def pca_code(data): #raw_implementatio
from sklearn.decomposition import PCA
clf=PCA(0.98,whiten=True) #converse 98% variance
X_train=clf.fit_transform(X_train)
X_test=clf.transform(X_test)
我在里面找不到它
1.我“无法”理解这里的不同结果
编辑:
def pca_code(data):
#raw_implementation
var_per=.98
data-=np.mean(data, axis=0)
data/=np.std(data, axis=0)
cov_mat=np.cov(data, rowvar=False)
evals, evecs = np.linalg.eigh(cov_mat)
idx = np.argsort(evals)[::-1]
evecs = evecs[:,idx]
evals = evals[idx]
variance_retained=np.cumsum(evals)/np.sum(evals)
index=np.argmax(variance_retained>=var_per)
evecs = evecs[:,:index+1]
reduced_data=np.dot(evecs.T, data.T).T
print(evals)
print("_"*30)
print(evecs)
print("_"*30)
#using scipy package
clf=PCA(var_per)
X_train=data.T
X_train=clf.fit_transform(X_train)
print(clf.explained_variance_)
print("_"*30)
print(clf.components_)
print("__"*30)
data/=np.std(data,axis=0)
不是经典PCA的一部分,我们只将变量居中。
因此,sklearn PCA没有预先缩放数据的功能
除此之外,如果我们抽象出您提供的代码没有运行这一事实,那么您的做法是正确的;)。
您只会对行/列布局感到困惑。老实说,我认为从X=data.T
开始,然后只使用X更容易。我在帖子末尾添加了你的代码“fixed”
求特征值
您已经注意到,您可以使用clf.components\uu
获得特征向量
所以你有主成分。它们是协方差矩阵的特征向量I使用sklearn PCA函数。返回参数“分量”是特征向量,“解释的方差”是特征值。下面是我的测试代码
from sklearn.decomposition import PCA
import numpy as np
def main():
data = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0], [2.3, 2.7], [2, 1.6], [1, 1.1], [1.5, 1.6], [1.1, 0.9]])
print(data)
pca = PCA()
pca.fit(data)
print(pca.components_)
print(pca.explained_variance_)
if __name__ == "__main__":
main()
当你说“特征值”时,你是指PCA的“奇异值”吗?特征值仅在矩阵PCA应用于方矩阵时才可能存在
如果您试图使用“特征值”来确定PCA所需的适当维度,那么实际上应该使用奇异值。你可以使用pca.singular\u values来获得奇异值。显然,我错认为
.explained\u variance\u
给出了实际的特征值,所以我删除了我的答案,因为它不准确。如果我有什么发现,我会告诉你的。好问题。@Akavall一个简单的方法是将方差作为1
传递,然后获取值。但是没有必要再运行它。你能告诉我sklearn中的PCA
功能以前是否对数据进行了缩放吗?@Akavall我认为你没有弄错。特征值由给出。解释的\u方差
。在这里,代码使用相关矩阵,因此获得的特征值不同。从pca.get_convariance()获得的协方差与cov(数据)之间的差异是什么?使用linalg.eigh,您可以将evals与evacs相乘以获得cov(数据),但如果将clf.expended_方差与clf.components_uuu相乘,您会得到什么?根据我的实验,如果n_样本>=n_特征,您只能从clf.components_uu>中获得特征向量,在这种情况下clf.components_u
是一个方阵,假设您生成了所有组件。如果n_样本clf.components_
是一个形状矩阵(n_成分,n_特征),其行包含主成分向量。