2

numpy ライブラリ (numpy-MKL-1.6.2.win-amd64-py2.7) の特異値分解アルゴリズムを使用しようとしていますが、この関数が正しくないことを提案します。この関数には次のステートメントがあります。

from numpy.linalg import *

U, S, V = svd(A, full_matrices=0)

私の仮定は、Matlab の同じ関数との比較比較に基づいており、正しい答えが得られます。また、問題は V 行列の計算の誤りに関連していることもわかりました。

たとえば、行列 A があります。

A =[-15.5714,   19.2143,   15.0000; -2.8462,    7.7692,   -3.9615; -19.5000,   3.1111,    4.5556]

pythonで私は受け取ります:

V = [0.7053,  -0.5629,   -0.4308; -0.6863,   -0.6945,   -0.2161; -0.1776,    0.4481,   -0.8762]

そしてMatlabで:

V = [0.7053,   -0.6863,   -0.1776; -0.5629,   -0.6945,    0.4481; -0.4308,   -0.2161,   -0.8762]

違いはそれほど明白ではありませんが、LLS の計算中に重要になります。どうすればこの問題を克服できますか?

OK、答えが見つかりました: [U,S,V]=svd(a) - Matlab U, S, Vh = linalg.svd(a), V = Vh.T - Python 多分私の質問は将来誰かを助けるでしょう.

4

2 に答える 2

3

MatlabV行列と numpyV行列は、互いの転置です。

transpose()関数を使用して、転置されたバージョンを取得できます。

于 2012-10-22T16:07:40.743 に答える
1

特異値分解の領域行列UVは一意ではないため、異なる数学エンジンの結果を比較することは困難です。(特異値の行列はユニークです。残念ながら掲載されていません。)

簡単な品質チェックは、ドメイン マトリックスの列ベクトルを確認することです。これらの行列はユニタリであるため、各列ベクトルは 2 ノルムで単位長を持ちます。Python の結果では、これらの基準は (0.999947、1.00002、1.00003) です。MATLAB では、優れた結果が得られました (0.999999、0.99999、1.00001)。Mathematica はこれを (1.0000000000000002, 1.0000000000000004, 1.0000000000000000) で上回っています。

• 補遺: SVD は、ドメインとコドメインのベクトル空間を整列させます。アライメントは 1 つしかない場合があります。配置角度の個別のセットが存在する場合があります。次に示すように、連続した角度のセットが存在する場合があります。

ここに画像の説明を入力

于 2014-08-14T21:12:44.383 に答える