2017-09-11 5 views
-1

私は、入力行列があります。numeric.jsが間違った値を返すのはなぜですか?

let t = [ 
     [0,1,0], 
     [0,1,0], 
     [0,0,0] 
    ] 

私はSVDを計算したいです。私が行います

A=np.array([[0,1,0],[0,1,0],[0,0,0]]) 
np.linalg.svd(A)[0] 

出力::私は、Python、numpyの中で同じ手順を実行します

let U = N.svd(t).U; 

Uが

[-0.7071067811865475, 0.7071067811865475, 0] 
[-0.7071067811865475, -0.7071067811865475, 0] 
[0, 0, 1] 

ある

[0.7071067811865475, 0, -0.7071067811865475] 
[0.7071067811865475, 0, 0.7071067811865475] 
[0, 1, 0] 

は、これはバグですか?私は何をすべきか ?結果が異なるのはこれだけではありません。私は誰を信頼すべきですか?

+0

SVD分解が何をしているのか知っていますか? –

+0

数字のjs出力の右のゼロスペースの基底ベクトルをAのヌルスペースに入れたくありません –

+2

[この質問を見る](https://math.stackexchange.com/questions/644327/how-unique-on-non) -unique-are-u-and-v-in-singular-value-decomposition-svd)である。 – Phylogenesis

答えて

2

SVDの結果では、アルゴリズムによってアルゴリズムが異なる可能性があります。対応する特異値が同一である場合には、UとVの完全な列とUとVの列の

  • 同じ順列の

    • 同一の符号変化を有することが可能です。実際には、直交行列による任意の種類の混合が起こり得る。

    これは両方ともここで発生しました。あなたの入力はランク1の行列です。すなわち、2つの特異値はゼロで、最後の2つの列の順列を説明します。サインフリップも明らかです。

  • +0

    ありがとうございますので、物事をはっきりさせるために、Vのn-rベクトル、UはAのnull/left nullスペースにあることが保証されていませんか? –

    +0

    通常のアルゴリズムでは、特異値は降順であり、最後の 'n-r'列は行列の左右の空白にまたがっています。しかし、これらの空白の正規直交基底は、実装ごとに異なる可能性があります。 – LutzL

    +0

    お返事ありがとうございます! –

    関連する問題