scipy.optimize.differential_evolution的融合

convergence in scipy.optimize.differential_evolution

提问人:Molares 提问时间:10/31/2023 更新时间:10/31/2023 访问量:19

问:

下面是一个示例代码,演示了我向 ChatGPT 请求的 scipy.optimize.differential_evolution 的使用。输出指示代码在收敛度超过 1 时终止,并显示一条消息,指出“优化已成功终止”。

import numpy as np
from scipy.optimize import differential_evolution

# Define a sample function to be optimized (Rastrigin function in this case)
def rastrigin(x):
    return sum([(i**2 + 10 - 10*np.cos(2*np.pi*i)) for i in x])

# Callback function to print the convergence value at each iteration
def callback(xk, convergence):
    print(f"Current parameters: {xk}, Convergence: {convergence:.6f}")

bounds = [(-5.12, 5.12), (-5.12, 5.12)]  # For a 2D Rastrigin function

result = differential_evolution(rastrigin, bounds, callback=callback)

print("\nOptimized Result:")
print(result)
Current parameters: [-0.05500736  1.12167317], Convergence: 0.019343
Current parameters: [-0.05500736  1.12167317], Convergence: 0.021779
Current parameters: [-0.05500736  1.12167317], Convergence: 0.023104
Current parameters: [-1.0372644   0.95886127], Convergence: 0.021842
Current parameters: [-1.0372644   0.95886127], Convergence: 0.022447
Current parameters: [-1.0372644   0.95886127], Convergence: 0.020804
Current parameters: [-1.0372644   0.95886127], Convergence: 0.019910
Current parameters: [-1.0372644   0.95886127], Convergence: 0.020295
Current parameters: [-0.92414087 -0.03163365], Convergence: 0.019972
Current parameters: [-0.92414087 -0.03163365], Convergence: 0.018159
Current parameters: [-0.92414087 -0.03163365], Convergence: 0.019535
Current parameters: [-1.01618653 -0.01727175], Convergence: 0.016007
Current parameters: [-1.01618653 -0.01727175], Convergence: 0.017456
Current parameters: [-1.01618653 -0.01727175], Convergence: 0.015801
Current parameters: [-0.98535569  0.02419573], Convergence: 0.014148
Current parameters: [-0.9894422  -0.00648482], Convergence: 0.018350
Current parameters: [-0.9894422  -0.00648482], Convergence: 0.015497
Current parameters: [-0.9894422  -0.00648482], Convergence: 0.050019
Current parameters: [-0.99360956 -0.00208593], Convergence: 0.172460
Current parameters: [-9.93609564e-01 -2.49866280e-04], Convergence: 0.289696
Current parameters: [-9.93609564e-01 -2.49866280e-04], Convergence: 0.352541
Current parameters: [-9.94934163e-01 -7.51133414e-05], Convergence: 1.135028

Optimized Result:
 message: Optimization terminated successfully.
 success: True
     fun: 0.9949590570932987
       x: [-9.950e-01 -4.988e-09]
     nit: 22
    nfev: 702
     jac: [ 3.553e-07  0.000e+00]

我预计成功的优化将与接近零的收敛相对应。因此,我很好奇在这种情况下如何定义“收敛”。不幸的是,我无法从官方文档中看出这一点:https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.differential_evolution.html

scipy-optimize 收敛微 分进化

评论


答:

0赞 maxy 10/31/2023 #1

查找回调的文档

如果你在你链接的文档中搜索签名,它会告诉你会发生什么:callback

val表示总体收敛的小数值。当大于 1 时,函数停止。val

不是一个完整的解释。但至少它停在一个事实上现在已经不足为奇了。

编写该库的人可以期望您将在实现回调之前查找回调签名,以了解它需要哪些参数。因此,他们可以期望您在运行代码之前已经阅读了本节。

寻找实现

同一个 docu 在顶部还有一个指向源代码的链接。(非常方便。但是,如果不存在,您仍然可以下载他们的 github 存储库并四处使用 grep,或者从 IDE 或 REPL 获取实际的源文件。通过一些搜索,您可以找到调用回调的位置

c = self.tol / (self.convergence + _MACHEPS)
warning_flag = bool(self.callback(self.x, convergence=c))

所以这是一个比率.tol / convergence

如果你再读一遍 docu,你可以看到这是一个参数,解释如下:tol

收敛的相对容差,当 np.std(pop) <= atol + tol * np.abs(np.mean(population_energies)) 时求解停止,其中 和 atol 和 tol 分别是绝对容差和相对容差。

您可以进一步阅读源代码,了解收敛度是如何计算的。但要点是,你打印的是一个比率,将公差与总体中仍然存在多少方差进行比较。

评论

0赞 Molares 11/1/2023
非常感谢您的详细解释!您对查找回调及其实现的文档的细分非常有帮助。我特别感谢您花时间指导我浏览库的文档,并指出回调的调用位置和方式。我现在对这个比率及其意义有了更清晰的了解。感谢您阐明这个话题。