我正在尝试使用numpy库中的奇异值分解算法(numpy-MKL-1.6.2.win-amd64-py2.7),但我建议此函数不正确。此函数具有以下语句:
from numpy.linalg import *
U, S, V = svd(A, full_matrices=0)
我的假设是基于与Matlab中相同函数的比较比较,它给出了正确的答案。我还发现问题与V矩阵的错误计算有关。
例如,我有矩阵A:
A =[-15.5714, 19.2143, 15.0000; -2.8462, 7.7692, -3.9615; -19.5000, 3.1111, 4.5556]
在python中我收到:
V = [0.7053, -0.5629, -0.4308; -0.6863, -0.6945, -0.2161; -0.1776, 0.4481, -0.8762]
并在Matlab中:
V = [0.7053, -0.6863, -0.1776; -0.5629, -0.6945, 0.4481; -0.4308, -0.2161, -0.8762]
差异并不那么明显,但在LLS计算过程中它们变得至关重要。 我怎样才能克服这个问题?
好的,我找到了答案: [U,S,V] = svd(a) - Matlab U,S,Vh = linalg.svd(a),V = Vh.T - Python 也许我的问题将来可以帮助某人。
答案 0 :(得分:3)
您的Matlab V
矩阵和numpy V
矩阵是彼此的转置。
您可以使用transpose()功能获取转置版本。
答案 1 :(得分:1)
奇异值分解中的域矩阵 U 和 V 不是唯一的,因此很难比较来自不同数学引擎的结果。 (奇异值的矩阵是唯一的。不幸的是它没有发布。)
快速质量检查是查看域矩阵的列向量。由于这些矩阵是单一的,因此每个列向量具有2个范数的单位长度。对于python结果,这些规范是(0.999947,1.000000,1.00003);对于MATLAB,我们有一个优越的结果(0.999999,0.9999,1.0000)。 Mathematica超越了这个(1.0000000000000002,10000000000000004,1.000000000000000000)。
•附录: SVD对齐域和codomain的向量空间。可能只有一个对齐方式。可能存在一组离散的对准角度。可能存在一组连续的角度,如下所示: