Использование метода Левенберга-Марквардта в функции Scipy's less_squares - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь решить игрушечную задачу (нелинейных наименьших квадратов) с помощью функции scipy.optimize.least_squares в Python.

import numpy as np
from scipy.optimize import least_squares

a = 2
b = -1

def myfun(x,a,b):
    return [a*x[0]-x[1]-np.exp(-x[0]), b*x[0]+2*x[1]-np.exp(-x[1])]

x0 = [-5,-5]
sol = least_squares(myfun,x0,method='lm',ftol=1e-9,xtol=1e-9, \
                    max_nfev=1e6,args=(a,b))

print(sol)

'''
method='trf' solution:  x = array([0.56714329,0.56714329])
'''

Если я использую метод Левенберга-Марквардтаmethod='lm' тогда я получаю ошибку TypeError: integer argument expected, got float.Я пропускаю входной аргумент для least_squares?У меня нет никакой дополнительной информации по этой проблеме, например, матрицы Якоби, поэтому я не уверен, что этот метод особенно подходит для этой проблемы.

1 Ответ

0 голосов
/ 28 мая 2018

Вам нужно написать max_nfev=1000000 или max_nfev=int(1e6), если вы предпочитаете экспоненциальную запись.

1e9 - это литерал с плавающей точкой, но max_nfev должно быть целым числом.Очевидно, что алгоритм LM проверяет это, в то время как другие алгоритмы могут молча принимать плавающее число.

Обратите внимание на разницу между значением и типом данных :

1 - это целое число со значением один, 1.0 - это число с плавающей запятой со значением один.Математически оба имеют одно и то же значение, но это не одно и то же, потому что они имеют разные типы данных.

...