提问人:Molares 提问时间:10/31/2023 更新时间:10/31/2023 访问量:19
scipy.optimize.differential_evolution的融合
convergence in scipy.optimize.differential_evolution
问:
下面是一个示例代码,演示了我向 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
答:
查找回调的文档
如果你在你链接的文档中搜索签名,它会告诉你会发生什么: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 分别是绝对容差和相对容差。
您可以进一步阅读源代码,了解收敛度
是如何计算的。但要点是,你打印的是一个比率,将公差与总体中仍然存在多少方差进行比较。
评论