3

IDL プログラムを Python に変換しようとしています。SVD次の方法で達成した結果を解決する必要があります

from scipy.linalg import svd
A = [[1,2,3],[4,5,6]]
b = [4,4,5]

u,w,v = svd(A)

これは正常に動作し、IDL から適切に変換されています。次はIN IDL(!)

x = svsol(u,w,v,b)

in python と IDL はほぼ同じです (他のuマトリックスも同様です)。唯一の違いは次元です。IDL の行列の方が大きいですが、多くのゼロがあります。その意味で、Pythonのマトリックスはより圧縮されているようです。

Pythonについても同様のことを知っている人はいますか。

誰かがそれを必要とするなら、ここに のマニュアルがありますsvsol

4

1 に答える 1

4

IDLではSVDCSVSOLSVD 分解によって線形最小二乗問題を解きます。これは関数によって行われnumpyますnumpy.linalg.lstsq。(最初に SVD 分解を計算してから逆算する必要はありません。)

>>> import numpy as np
>>> A = np.array([[1,2,3],[4,5,6]])
>>> b = np.array([4,4])
>>> x, _, _, _ = np.linalg.lstsq(A,b)
>>> x
array([-2.,  0.,  2.])
>>> np.dot(A,x)
array([ 4.,  4.])

の長さはbの行数と同じでなければならないAので、あなたの例は間違っていることに注意してください。IDL セマンティクスを正しく解釈していることを確認するために、svsol リファレンス マニュアルの例を次に示します。

>>> A = np.array(
... [[1.0, 2.0, -1.0, 2.5],
...  [1.5, 3.3, -0.5, 2.0],
...  [3.1, 0.7,  2.2, 0.0],
...  [0.0, 0.3, -2.0, 5.3],
...  [2.1, 1.0,  4.3, 2.2],
...  [0.0, 5.5,  3.8, 0.2]])
>>> B = np.array([0.0, 1.0, 5.3, -2.0, 6.3, 3.8])
>>> x, _, _, _ = np.linalg.lstsq(A,B)
>>> print x
[ 1.00095058  0.00881193  0.98417587 -0.01009547]
于 2012-10-04T21:21:46.430 に答える