以我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