重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

下記のような行列を用意して、特異値分解の手順を確認しています。

A=
array([[ 1, 2, 3, 6],
    [ 4, 5, 8, 9],
    [ 7, 10, 11, 12]])

ツールを使うと直ぐに

Z_U=
[[-0.2628122 -0.81345009 0.51887253]
[-0.53653575 -0.32374711 -0.77930558]
[-0.80190968 0.48320467 0.35136037]]

Z_D=
array([[25.30981276, 0.    , 0.    , 0.    ],
    [ 0.    , 2.86440796, 0.    , 0.    ],
    [ 0.    , 0.    , 1.09933851, 0.    ]])

Z_V=
[[-0.31696493 0.44476701 -0.12628253 -0.82811126]
[-0.4435987  0.55383556 0.59564982 0.37641421]
[-0.54926242 0.09947055 -0.73941108 0.37641421]
[-0.63329631 -0.69681711 0.28727211 -0.17565996]]
と結果が得られ、

A = Z_U * Z_D * Z_V^T

である事が解るのですが、
別途、A^T*Aを求めて、これを固有値分解して固有ベクトルを求めてみると、
Z_V2=
[[ 0.31696493 0.44476701 0.12628253 -0.82811126]
[ 0.4435987  0.55383556 -0.59564982 0.37641421]
[ 0.54926242 0.09947055 0.73941108 0.37641421]
[ 0.63329631 -0.69681711 -0.28727211 -0.17565996]]
となりました。

よく見てみると、Z_V2 の1列目と3列目のベクトルが逆向きになっている事が解ります。

Z_V2を使って
Z_U * Z_D * Z_V2^T
を求めると、やはり、元の行列 A は得られないのですが、
特異値分解するための特異行列(上記の例では右特異行列)を作成するための固有ベクトルの向きの選び方にはどのようなルールがあるのでしょうか?

教えていただければ幸いです。

質問者からの補足コメント

  • どう思う?

    具体的な手順を知りたいので、何をどうするべきなのかご教示いただけませんでしょうか?
    さきほどの私の質問の中ではZ_U2は定義していませんでした。それは(A*A^T)を固有値分解した結果で得られる固有ベクトルで作る左特異値行列(ここで、これをZ_U2と定義します)がツールを使って得られた特異値分解分解行列Z_Uと同じだったからです。
    「~になるはず」という推測を含んだ回答ではなく「~という手順を踏めば~になる」という確定形の回答をお願い致します。

    No.1の回答に寄せられた補足コメントです。 補足日時:2019/05/18 16:30

A 回答 (2件)

つまり、理屈はどうでもいいからやり方だけ知りたい、ということですね(それなら初めからライブラリを使えばいいように思いますが)。


それなら、例えば、A*Z_V2 のi(i=1,2,3)列目の縦ベクトルをZ_D[i,i] で割ったものをZ_U2 のi番目の縦ベクトルになるようにすればいいです。
    • good
    • 0
この回答へのお礼

ヒントになりました。ありがとうございます。
A = Z_U * Z_D * Z_V2^T を期待しているので、Z_U^T * A * Z_V2 を求めてZ_Dの要素が期待通りか確認しました。マイナス要素があるなら対応するベクトルを逆向きにするという方針で解決しました。

お礼日時:2019/05/20 00:09

>Z_U * Z_D * Z_V2^T



Z_V2を使うのであれば、Z_UもZ_U2になるはず(対応するベクトルの符号が変わるはず)ですが、それを忘れていませんか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!