svd - eigh() 和 svd 不给出相同的结果
问题描述
考虑奇异值分解 M=USV*。然后 M* M 的特征值分解得到 M* M= V (S* S) V*=VS* U* USV*。我希望通过证明 eigh 函数返回的特征向量与 svd 函数返回的特征向量相同来验证与 numpy 的这种相等性:
# svd
U1,S1,V1=np.linalg.svd(M)
S1=np.square(S1)
V1=V1.T
# eig
S2,V2=np.linalg.eigh(np.dot(M.T,M))
indx=np.argsort(S2)[::-1]
S2=S2[indx]
V2=V2[:,indx]
当我执行此代码时,向量仅相差一个符号。例子 :-
v1 = array([[-0.33872745, 0.94088454],
[-0.94088454, -0.33872745]])
and for v2:
v2 = array([[ 0.33872745, -0.94088454],
[ 0.94088454, 0.33872745]])
为什么在特征向量中会出现这种差异,如何解决?任何帮助表示感谢提前谢谢你!
解决方案
特征向量在符号更改之前是唯一的(请参阅https://math.stackexchange.com/questions/235396/eigenvalues-are-unique)。
直到符号唯一性是因为 $$ A u = \lambda $$ 也适用于 $$ A (-u) = \lambda) (-u) $$。
推荐阅读
- mysql - 将数据库中的数据拉入不同的数据库[Spring Boot]
- python - 使用字典键删除链表中的节点
- java - 没有找到方法调用 javafx (intelliJ build.gradle) 的候选者
- powershell - 在 Powershell 中将 csv 文件转换为 base64 格式
- java - 春季问题:无法列出具有 @CustomAnnotation 的属性
- angular - http请求上的角度微调器异步
- javascript - 使用firebase登录后如何重定向
- jquery - 使用输入键输入值进行搜索
- autodesk-forge - Autodesk forge(查看器)是否支持空间功能
- angular - 如何在不倾斜列表溢出的情况下显示角度 mat-grid-list?