【发布时间】:2020-02-14 12:08:12
【问题描述】:
我正在尝试最小化一个函数,该函数采用长度为 N 的 1darray 并通过 Levenberg-Marquardt (:= 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’ (Levenberg-Marquardt) 调用一个封装在MINPACK (lmder, lmdif) 中实现的最小二乘算法。它运行被表述为信任域类型算法的 Levenberg-Marquardt 算法。该实现基于论文 [JJMore],它非常健壮且高效,并带有许多智能技巧。它应该是无约束问题的首选。请注意,它不支持边界。 当m 时它也不起作用。
看起来当 m>=n
时没有有效的 LM 实现我的问题是:
如何在 Python 中像 Matlab 一样使用 LM 获得非线性最小二乘最小化?
【问题讨论】:
标签: python matlab optimization scipy