Решить разложение по сингулярным значениям (SVD) в Python
Я пытаюсь перевести программу 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)
u
в Python и IDL почти одинаковы (и для других матриц также). Единственное отличие состоит в размерах, где матрица IDL больше, но имеет много нулей. Похоже, что матрицы Python в этом смысле более сжаты.
Кто-нибудь знает что-то подобное для Python.
Если кому-то это нужно, вот руководство для svsol
,
1 ответ
С SVDC
а также SVSOL
в IDL вы решаете линейную задачу наименьших квадратов разложением SVD. Это сделано в 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]