1

現在、numpy.linalg の svd 関数を使用して、大きな行列 (正確には画像) で SVD を計算しています。私が見つけたドキュメントと例はすべて、返されるシグマ値が降順で並べられていることを示しているようです (U と V^T の正しい順序を暗示しています)。

ただし、私のテストでは、シグマ値は順不同に見えます。だから私の質問は、何らかの理由で私のlinalgで何かがうまくいかないのか(私が知っている可能性は非常に低い)、それとも単にシグマを順序付けられていないものとして返すのかということです.

フォローアップの質問は、シグマを並べ替えて、U と V^T の順序にも変更が反映されるようにするための最良の方法です。

4

1 に答える 1

2

linalg.svdは LAPACK への単なるインターフェイスであるため、dgesdd特異値を順序付けする必要があります。

>>> import numpy as np
>>> A = np.random.randn(2400,3600)
>>> U, s, V = np.linalg.svd(A, full_matrices=False)
>>> np.allclose(A, np.dot(U*s, V))
True
>>> (s[:-1] >= s[1:]).all()
True

順不同の結果が得られた場合は、上記の例のように、結果が正しいかどうかを確認してください。そうでない場合は、lapack バグまたは (可能性は低いですが) numpy バ​​グがある可能性があります。

于 2012-09-14T13:41:34.910 に答える