![](/img/trans.png)
[英]Non linear Least Squares: Reproducing Matlabs lsqnonlin with Scipy.optimize.least_squares using Levenberg-Marquardt
[英]Custom minimizer based on Levenberg-Marquardt in scipy.optimize.basinhopping
我在最小化 python 中复杂的非线性函数时遇到了麻烦。 该函数实际上是用于拟合实验数据的拟合模型的卡方。 为了获得全局最小值,我在 scipy 中使用了 Basinhopping 函数。 这个函数是minimize() 函数的一个封装,它增加了一些扰动来寻找不同的局部最小值。 现在我的问题是很难找到局部最小值。
有很多求解器可用于最小化(),并且由于我使用的是边界,因此我在“L-BFGS-B”、“SLSQP”和“TNC”之间进行了选择。 他们都没有真正找到局部最小值。 是否有一种基于流行的 Levenberg-Marquardt 算法的方法可用于最小化? 也许这没有意义,否则它已经实施了,但我不明白为什么。
我最初的想法实际上是使用leastsqbound 函数( https://pypi.python.org/pypi/leastsqbound ),我知道它非常擅长提供准确的协方差矩阵,而不管边界,并将其包含在一个更大的算法中,看起来对于全局最小值(如盆地跳跃函数)。 你知道这样的东西是否已经存在?
非常感谢您的建议!
Scipy 有一个 Levenberg-Marquardt 实现: scipy.optimize.leastsq
。 它没有正确的返回类型以用于minimize
(因此是basin_hopping
)。 然而,这似乎可以相当直接地补救。
虽然我还没有运行它,但这应该可以解决问题:
def leastsq_for_minimize( *args, **kwargs ):
results = leastsq( *args, **kwargs )
optimize_results = scipy.optimize.OptimizeResult()
# Some code here to correctly copy results to optimize results
return optimize_results
scipy.optimize.basinhopping(
# your arguments here
minimizer_kwargs=dict(method=leastsq_for_minimize),
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.