2

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

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

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

非常感谢您的建议!

4

1 回答 1

2

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),
    )
于 2015-06-09T22:28:33.710 回答