2012-09-25 1 views
3

Je commence à traduire un programme IDL en Python. Je dois résoudre le résultat de SVD que je réalise de la manière suivanteRésoudre la décomposition de la valeur singulière (SVD) en Python

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

u,w,v = svd(A) 

Et cela fonctionne très bien et est traduit bien de IDL. L'étape suivante est en IDL (!)

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

Le u en python et IDL sont presque les mêmes (et aussi bien de l'autre matrice). La seule différence est les dimensions, où la matrice d'IDL est plus grande, mais a beaucoup de zéros. On dirait que les matrices de Python sont plus compressées dans ce sens.

Est-ce que quelqu'un sait quelque chose de similaire pour Python.

Si quelqu'un en a besoin, voici le manuel pour svsol.

+0

Tu ne peux pas utiliser simplement: [ 'scipy.linalg.solve (A, b)'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.solve.html)? –

+0

Non, je cherche quelque chose de similaire à 'svsol' dans IDL. La méthode que je suis doit utiliser de cette façon. –

Répondre

4

Avec SVDC et SVSOL dans IDL vous résolvez un problème linéaire des moindres carrés par décomposition SVD. Ceci est fait en numpy par la fonction numpy.linalg.lstsq. (Pas besoin de calculer d'abord la décomposition SVD, puis de nouveau à résoudre.)

>>> 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.]) 

S'il vous plaît noter que la longueur de b doit être le même que le nombre de lignes de A, de sorte que votre exemple est erroné. Juste pour faire shure que j'interpréter correctement la sémantique IDL, voici l'exemple dans le 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

Cela semble fonctionner vraiment bien. Je pense que je vais utiliser la méthode des moindres carrés alors. Juste par curiosité, pouvez-vous me dire les avantages de SVD (s'il y en a) sur 'lstsq'. Merci beaucoup pour votre aide; c'est très prisé! –

+1

@DanielThaagaardAndreasen interne 'np.linalg.lstsq' appelle LAPACK [' dgelsd'] (http://www.netlib.org/lapack/double/dgelsd.f) qui à son tour est basé sur SVD, donc conceptuellement il n'y a pas de différences . Ceci dit, 'dgelsd' s'avère généralement plus rapide que SVD complet et résolution ultérieure. Pour plus d'informations, jetez un oeil au LAPACK [guide de l'utilisateur] (http://www.netlib.org/lapack/lug/node27.html) –

+0

Merci beaucoup pour votre aide et votre temps :) –

Questions connexes