【发布时间】:2018-09-24 19:53:17
【问题描述】:
我正在尝试手动计算下面定义的矩阵 A 的 SVD,但我遇到了一些问题。手动计算它并使用 numpy 中的 svd 方法产生两个不同的结果。
以下手动计算:
import numpy as np
A = np.array([[3,2,2], [2,3,-2]])
V = np.linalg.eig(A.T @ A)[1]
U = np.linalg.eig(A @ A.T)[1]
S = np.c_[np.diag(np.sqrt(np.linalg.eig(A @ A.T)[0])), [0,0]]
print(A)
print(U @ S @ V.T)
并通过 numpy 的 svd 方法计算:
X,Y,Z = np.linalg.svd(A)
Y = np.c_[np.diag(Y), [0,0]]
print(A)
print(X @ Y @ Z)
当这两个代码运行时。手动计算不等于 svd 方法。为什么这两个计算之间存在差异?
【问题讨论】:
-
嗯,我逐个元素地分解问题,发现如果你只比较
X和U = np.linalg.eig(A @ A.T)[1],你不会得到相同的矩阵(符号有些不同)。即使Z和V在Z 的第二排与V 的第三排相似的意义上也不同,反之亦然,有些符号相反。似乎 numpy linalg 可能存在一些问题。检查第二个答案here -
我看到行和/或符号被切换,但我不明白这是为什么。 U @ S @ V.T 也不等于 A,我也不明白。
-
答案是 U 和 V 一开始就没有正确计算。为此,只需取一个 2,2 矩阵并使用一些在线工具计算 A,然后比较 linalg 的 eig 是否给您相同的答案。如果没有,那就有问题了