Python Matlab 特征值分解和奇异值分解 所得的特征向量不一致情况分析 已经解决 使用eigh = SVD

这个问题困扰我好久了,每次写都不知道用特征值分解好还是用奇异值分解好

计算特征向量不匹配

参考https://blog.csdn.net/weixin_43383558/article/details/83145867

https://zhuanlan.zhihu.com/p/43578482

https://codeday.me/bug/20181026/336042.html

 

还是没解决----->如果我要求一个准确的特征值要如何去做?

但是eig和svd的特征值是一样的

神奇之处就在于两个都可以恢复为原来的矩阵

X= U \Sigma V^T \\ A = X^T X = V \Sigma ^T U^T U \Sigma V^T = V \Sigma^2 V^T = P\Lambda P^T

所以SVD的V和特征值分解的P应该相同

但是matlab和svd中是不一样的,具体原因在于软件求解问题,那么如何才能一样呢?

Python Matlab 特征值分解和奇异值分解 所得的特征向量不一致情况分析 已经解决 使用eigh = SVD_第1张图片

eigh 奇迹般竟然相同了

Python Matlab 特征值分解和奇异值分解 所得的特征向量不一致情况分析 已经解决 使用eigh = SVD_第2张图片

但是eig就不相同了

哈哈哈以后用eigh吧

Python Matlab 特征值分解和奇异值分解 所得的特征向量不一致情况分析 已经解决 使用eigh = SVD_第3张图片

eigvalues
Out[88]: array([ 0.28251688,  0.59034175,  1.14891126,  1.45970816, 10.79185466])

index = np.argsort(eigvalues)[::-1]

index
Out[90]: array([4, 3, 2, 1, 0], dtype=int64)

eigvalues = eigvalues[index]

eigvalues
Out[92]: array([10.79185466,  1.45970816,  1.14891126,  0.59034175,  0.28251688])

eigvectors = eigvectors[:,index]

eigvectors
Out[94]: 
array([[-0.60480295, -0.51573258,  0.24030538,  0.40956589, -0.37781265],
       [-0.45461252,  0.42466685, -0.67842382, -0.08945472, -0.38042673],
       [-0.3539136 , -0.24283785,  0.17407516, -0.88488594,  0.04949405],
       [-0.32673754, -0.25846818, -0.4100625 ,  0.16537152,  0.79431592],
       [-0.44218615,  0.65414215,  0.53248571,  0.11782517,  0.28132838]])

u,sigma,vt = np.linalg.svd(X)

V = vt.T

V
Out[97]: 
array([[-0.60480295, -0.51573258,  0.24030538, -0.40956589,  0.37781265],
       [-0.45461252,  0.42466685, -0.67842382,  0.08945472,  0.38042673],
       [-0.3539136 , -0.24283785,  0.17407516,  0.88488594, -0.04949405],
       [-0.32673754, -0.25846818, -0.4100625 , -0.16537152, -0.79431592],
       [-0.44218615,  0.65414215,  0.53248571, -0.11782517, -0.28132838]])

 

使用index排序

Python Matlab 特征值分解和奇异值分解 所得的特征向量不一致情况分析 已经解决 使用eigh = SVD_第4张图片

验证单位正交性

Python Matlab 特征值分解和奇异值分解 所得的特征向量不一致情况分析 已经解决 使用eigh = SVD_第5张图片

 

总结使用eigh-------血与泪的经验教训

下面使用PCA进行验证

妥了,困扰我多年的问题解决了

Python Matlab 特征值分解和奇异值分解 所得的特征向量不一致情况分析 已经解决 使用eigh = SVD_第6张图片

开心

================================================================================================

下面为参考链接的内容:

Python Matlab 特征值分解和奇异值分解 所得的特征向量不一致情况分析 已经解决 使用eigh = SVD_第7张图片

 

 

最后提醒大家千万不要用Python包一个一个去求ATA以及AAT的特征值、特征向量,你会发现你求得的UΣVT与原矩阵不相等!!!
本文只是帮大家试下错,Python一定要用np.linalg.svd(A)求解SVD,千万不要单独求解,切记!!

Python Matlab 特征值分解和奇异值分解 所得的特征向量不一致情况分析 已经解决 使用eigh = SVD_第8张图片

你可能感兴趣的:(Python Matlab 特征值分解和奇异值分解 所得的特征向量不一致情况分析 已经解决 使用eigh = SVD)