奇异值分解算法

时间:2012-10-22 15:54:09

标签: svd

我正在尝试使用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 也许我的问题将来可以帮助某人。

2 个答案:

答案 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的向量空间。可能只有一个对齐方式。可能存在一组离散的对准角度。可能存在一组连续的角度,如下所示:

enter image description here