繁体   English   中英

基于 scipy.optimize.basinhopping 中的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM