Я пытаюсь минимизировать функцию, которая принимает 1-мерный массив длины N и возвращает скаляр через Левенберга-Марквардта (: = LM).
Это работает в Matlab:
beta_initial = [-0.7823, -0.1441, -0.7669];
% substitution for my long, convoluted function
% but it also works with the proper function
F = @(beta) sum(exp(beta))+3;
options = optimset('Algorithm','Levenberg-Marquardt');
beta_arma = lsqnonlin(F,beta_initial,[],[],options) % -21.7814 -15.9156 -21.5420
F(beta_arma) % 3
Когда я попробовал это в Python, я получил ошибку значения:
ValueError: Метод 'lm' не работает, когда число остатков меньше, чем число переменных.
import numpy as np
from scipy.optimize import least_squares as lsq
# substitution for my long, convoluted function
F = lambda beta: np.sum(np.exp(beta))+3
beta_initial = [-0.7823, -0.1441, -0.7669]
beta_arma = lsq(F, beta_initial,method='lm')['x']
Насколько я понимаю, ошибка scipy требует, чтобы
out = F (in), чтобы len (out)> = len (in), но matlab не
Я изучил документы, Сципи и Матлаб .
Из документа scipy:
Метод 'lm' (Левенберг-Марквардт) вызывает оболочку для алгоритмов наименьших квадратов, реализованных в MINPACK (lmder, lmdif). Он запускает алгоритм Левенберга-Марквардта, сформулированный как алгоритм типа области доверия. Реализация основана на бумаге [JJMore], она очень надежна и эффективна со множеством хитрых уловок. Это должен быть ваш первый выбор для неограниченных проблем. Обратите внимание, что он не поддерживает границы. Также это не работает, когда m .
Похоже, что нет реализации LM, которая работает, когда m> = n
Мой вопрос:
Как я могу получить нелинейную минимизацию наименьших квадратов, используя LM как Matlab в Python?