如何解决numpy eig 与 svd 为什么他们产生不同的结果
我正在尝试理解 numpy svd 与 eig 的想法和行为。 为什么它们会产生不同的结果?我在这里比较苹果和苹果吗? 希望我的用法是正确的。 这是我试图理解 SVD 和特征向量的简单愚蠢代码
import numpy as np
from sklearn import preprocessing
np.random.seed(123)
np.set_printoptions(suppress=True)
X = np.random.rand(2,3)
X1 = preprocessing.scale(X,axis=1)
cov = np.matmul(X1.T,X1)/X1.shape[0]
U,S,V = np.linalg.svd(cov)
eig_vals,eig_vec = np.linalg.eig(cov)
ids = eig_vals.argsort()[::-1]
eig_vals = eig_vals[ids]
eig_vec = eig_vec[:,ids]
print("SVD: \n U_svd: \n {} \n V_svd:\n {}\n".format( U,V))
print("Eig: \n U_eig: \n {} \n V_eig: \n {}\n".format(eig_vec,eig_vals))
U's 非常接近。然而,特征值有很大不同。谢谢!!
解决方法
特征值不同于奇异值,因为它们是 S 的平方,如 https://en.wikipedia.org/wiki/Singular_value_decomposition#Relation_to_eigenvalue_decomposition
这意味着您的奇异值是特征值的平方根除以样本数。看待这个问题的一种方法是转到 scikit-learn 的 PCA 代码 (https://github.com/scikit-learn/scikit-learn/blob/main/sklearn/decomposition/_pca.py),你可以看到他们做了什么;解释方差由奇异值确定。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。