SVD:恢复的矩阵与原始矩阵不匹配
SVD: The restored matrix doesn't match with the original matrix
我正在尝试在矩阵上使用 sympy 的 SVD:
[3, 2, 2]
[2, 3, -2]
但是,恢复后的矩阵与原始矩阵不匹配。
这是我的代码:
import sympy
A = sympy.Matrix([
[3, 2, 2],
[2, 3, -2]
])
A1 = A@A.transpose()
[U, D1] = A1.diagonalize(normalize=True)
A2 = A.transpose()@A
[V, D2] = A2.diagonalize(normalize=True)
V_T = V.transpose()
S = sympy.sqrt(D2).doit()
S = S.row_del(0)
U@S@V_T
输出为:
[2, 3, -2]
[3, 2, 2]
第 1 行和第 2 行与原来的行交换了。
我知道 U
导致了这个结果,即:
Matrix([
[-sqrt(2)/2, sqrt(2)/2],
[ sqrt(2)/2, sqrt(2)/2]])
而不是:
[ sqrt(2)/2, sqrt(2)/2],
[-sqrt(2)/2, sqrt(2)/2]])
...,但我不知道如何解决这个问题。
我给diagonalize()
添加了一个参数sort
:
[U, D1] = A1.diagonalize(sort=True, normalize=True)
但是,这没什么区别。
你会如何解决这个问题?
提前谢谢你。
我也被我的讲师骗了。我还认为 SVD 非常简单,什么都有。但是特征向量不是唯一的。即使在归一化后,每列都可以乘以 -1 以给出相同的答案。
你的 SVD 不起作用的原因是 U 和 V 是相互关联的,因为它们的列符号需要以某种方式协同工作。进行分离的对角化会忽略这种内在的依赖性,大多数时候你会得到一个错误的答案。
查看此 Maths Exchange 问题和许多其他类似的解释。
下面的内容与数学交流题中的内容相同。
import sympy
A = sympy.Matrix([
[3, 2, 2],
[2, 3, -2]
])
# A = U S V'
if A.shape[0] <= A.shape[1]:
A1 = A * A.T
U, S = A1.diagonalize(normalize=True)
V_T = S**-1 * U.T * A
print(U * S * V_T)
else:
A2 = A.T * A
V, S = A2.diagonalize(normalize=True)
U = A * V * S**-1
print(U * S * V.T)
我添加了两个单独的案例,如果 A 是“风景”或“肖像”,只是因为数学在每个案例中的表现方式。希望它是正确的。
注意:我强烈建议您使用某种数值计算库,而不是使用符号数学库创建您自己的函数。如果您不使用符号,数值计算库可能会更快。
我正在尝试在矩阵上使用 sympy 的 SVD:
[3, 2, 2]
[2, 3, -2]
但是,恢复后的矩阵与原始矩阵不匹配。
这是我的代码:
import sympy
A = sympy.Matrix([
[3, 2, 2],
[2, 3, -2]
])
A1 = A@A.transpose()
[U, D1] = A1.diagonalize(normalize=True)
A2 = A.transpose()@A
[V, D2] = A2.diagonalize(normalize=True)
V_T = V.transpose()
S = sympy.sqrt(D2).doit()
S = S.row_del(0)
U@S@V_T
输出为:
[2, 3, -2]
[3, 2, 2]
第 1 行和第 2 行与原来的行交换了。
我知道 U
导致了这个结果,即:
Matrix([
[-sqrt(2)/2, sqrt(2)/2],
[ sqrt(2)/2, sqrt(2)/2]])
而不是:
[ sqrt(2)/2, sqrt(2)/2],
[-sqrt(2)/2, sqrt(2)/2]])
...,但我不知道如何解决这个问题。
我给diagonalize()
添加了一个参数sort
:
[U, D1] = A1.diagonalize(sort=True, normalize=True)
但是,这没什么区别。
你会如何解决这个问题? 提前谢谢你。
我也被我的讲师骗了。我还认为 SVD 非常简单,什么都有。但是特征向量不是唯一的。即使在归一化后,每列都可以乘以 -1 以给出相同的答案。
你的 SVD 不起作用的原因是 U 和 V 是相互关联的,因为它们的列符号需要以某种方式协同工作。进行分离的对角化会忽略这种内在的依赖性,大多数时候你会得到一个错误的答案。
查看此 Maths Exchange 问题和许多其他类似的解释。
下面的内容与数学交流题中的内容相同。
import sympy
A = sympy.Matrix([
[3, 2, 2],
[2, 3, -2]
])
# A = U S V'
if A.shape[0] <= A.shape[1]:
A1 = A * A.T
U, S = A1.diagonalize(normalize=True)
V_T = S**-1 * U.T * A
print(U * S * V_T)
else:
A2 = A.T * A
V, S = A2.diagonalize(normalize=True)
U = A * V * S**-1
print(U * S * V.T)
我添加了两个单独的案例,如果 A 是“风景”或“肖像”,只是因为数学在每个案例中的表现方式。希望它是正确的。
注意:我强烈建议您使用某种数值计算库,而不是使用符号数学库创建您自己的函数。如果您不使用符号,数值计算库可能会更快。