2012-09-25 112 views
3

我試圖將IDL程序轉換爲Python。我必須從解決SVD結果,我通過以下方式在Python中求解奇異值分解(SVD)

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

u,w,v = svd(A) 

實現這工作正常,並從IDL很好翻譯。接下來的步驟是IDL(!)

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

在Python中u和IDL幾乎是相同的(和其他基質的爲好)。唯一的區別是尺寸,IDL的矩陣更大,但有很多的零。看起來Python的矩陣在這種意義上更加壓縮。

有沒有人知道類似的Python的東西。

如果有人需要它,這裏是svsol的手冊。

+0

你就不能使用:['scipy.linalg.solve(A,B)'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.solve.html)? –

+0

不,我正在尋找類似於IDL中'svsol'的東西。我所遵循的方法必須使用這種方法。 –

回答

4

通過IDL中的SVDCSVSOL,您可以通過SVD分解求解線性最小二乘問題。這在numpynumpy.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的語義,這裏是在svsolreference manual的例子:

>>> 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] 
+0

這似乎工作真的很棒。我想我會用最小二乘法。只是好奇,你能告訴我SVD的優點(如果有的話)超過'lstsq'。 非常感謝您的幫助;它非常精確! –

+1

@DanielThaagaardAndreasen在內部'np.linalg.lstsq'調用LAPACK ['dgelsd'](http://www.netlib.org/lapack/double/dgelsd.f),它依次是基於SVD的,所以概念上沒有區別。這就是說,通常「dgelsd」比完整的SVD和後來的解決方案要快。有關更多信息,請參閱LAPACK [用戶指南](http://www.netlib.org/lapack/lug/node27.html) –

+0

非常感謝您的幫助和時間:) –