【问题标题】:Custom minimizer based on Levenberg-Marquardt in scipy.optimize.basinhopping基于 scipy.optimize.basinhopping 中的 Levenberg-Marquardt 的自定义最小化器
【发布时间】:2015-06-09 08:41:46
【问题描述】:

我在最小化 python 中复杂的非线性函数时遇到了麻烦。该函数实际上是用于拟合实验数据的拟合模型的卡方。为了获得全局最小值,我在 scipy 中使用了盆地跳跃函数。这个函数是最小化()函数的包装,它增加了一些扰动来寻找不同的局部最小值。现在我的问题是很难找到局部最小值。

minimize() 中可以使用很多求解器,由于我使用的是边界,因此我在“L-BFGS-B”、“SLSQP”和“TNC”之间进行了选择。他们都没有真正找到局部最小值。有没有一种基于流行的 Levenberg-Marquardt 算法的方法可以用来最小化?也许这没有意义,否则它已经实现了,但我不明白为什么。

我最初的想法实际上是使用我知道的最简单的函数(https://pypi.python.org/pypi/leastsqbound),它非常擅长提供准确的无边界协方差矩阵,并将其包含在一个更大的算法中以寻找全局最小值(如盆地跳跃功能)。你知道这样的东西是否已经存在?

非常感谢您的建议!

【问题讨论】:

    标签: python scipy minimize data-fitting levenberg-marquardt


    【解决方案1】:

    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),
        )
    

    【讨论】:

    • 感谢 Andreus,但 leastsq 不能用作最小化()或盆地跳跃中的方法。所以它并没有真正解决我的问题。
    • 好的,在发布了那个大编辑之后,我现在明白为什么我的解决方案不起作用了。我唯一的建议是尝试将scipy.optimize.leastsq 包装在一个与自定义minimize 方法的调用约定相匹配的函数中。
    • 感谢您的编辑。我已经尝试过了,但是最小化函数不想将 minimumsq 作为有效方法。还有其他建议吗?
    • “该方法应返回一个 OptimizeResult 对象。” 这是最小化()例程所必需的。您可以尝试编写一个调用 minimumsq 的函数,并将 leastsq 的结果转换为 OptimizeResult (从文档中,leastsq 似乎返回了足够的信息来部分或完全填充该对象)。然后你可以把这个函数传递给minimize()。
    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多