以我Python代码,我用numpy.linalg.svd计算一些数据的SVD:由该返回为什么犰狳的SVD结果与NumPy不同?
from numpy import linalg
(_, _, v) = linalg.svd(m)
V矩阵变换是:
[[ 0.4512937 -0.81992002 -0.35222884]
[-0.22254721 0.27882908 -0.93419863]
[ 0.86417981 0.4999855 -0.05663711]]
虽然移植我的代码C++,我切换到使用Armadillo用于计算SVD:
#include <armadillo>
arma::fmat M; // Input data
arma::fmat U;
arma::fvec S;
arma::fmat V;
arma::svd(U, S, V, M);
对于相同的数据所得到的V是:
0.4513 -0.2225 -0.8642
-0.8199 0.2788 -0.5000
-0.3522 -0.9342 0.0566
我们可以看到,来自Armadillo的V的转置与来自NumPy的V相匹配。除此之外,来自Armadillo的V的最后一列。这些值与NumPy结果的最后一行中的值具有相反的符号。
这里发生了什么?为什么两个流行库的SVD结果会有这样的差异?两者中的哪一个是正确的结果?
什么是您将SVD应用于您的原始矩阵?你能保证它在两个系统之间是一致的吗?通常唯一的区别可能是特征向量的大小... –
@ AlexanderL.Belikoff:是的,输入数据是相同的。在C++中,类型是float,在Python中它是我猜的两倍。但是,这种精度差异应该不重要? –
从技术上来说,SVD分解并不是唯一的(不能确定符号的变化)。除此之外,可能其中一个返回V *而不是V,因此是转置。此外,在一个实数矩阵的SVD中产生一个U和V,它们都是旋转矩阵,“犰狳”在这里是正确的。你可以发布你的原始矩阵? – sbabbi