2

我正在尝试使用 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 也许我的问题对未来的人有帮助。

4

2 回答 2

3

您的 MatlabV矩阵和 numpyV矩阵是彼此的转置。

您可以使用transpose()函数来获取转置版本。

于 2012-10-22T16:07:40.743 回答
1

奇异值分解中的域矩阵UV不是唯一的,因此很难比较不同数学引擎的结果。(奇异值矩阵是唯一的。不幸的是,它没有发布。)

快速质量检查是查看域矩阵的列向量。由于这些矩阵是单一的,因此每个列向量在 2 范数中具有单位长度。对于 python 结果,这些规范是 (0.999947, 1.00002, 1.00003); 对于 MATLAB,我们得到了更好的结果(0.999999、0.99999、1.00001)。Mathematica 以 (1.0000000000000002, 1.0000000000000004, 1.0000000000000000) 超越了这一点。

• 附录:SVD 对齐域和共域的向量空间。可能只有一种对齐方式。可能有一组离散的对齐角度。可能有一组连续的角度,如下所示:

在此处输入图像描述

于 2014-08-14T21:12:44.383 回答