关于scipy.optimize.differential_evolution中收敛值定义的技术问询
关于scipy.optimize.differential_evolution收敛值的定义疑问
我运行了以下针对Rastrigin函数的差分进化算法示例代码,发现当回调函数输出的convergence值超过1时,算法提示“Optimization terminated successfully”并终止。我原本以为优化成功时收敛值应该趋近于0,但在官方文档中未找到该convergence参数的明确定义,特此请教。
示例代码
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]
解答
convergence参数的具体定义
scipy官方文档中对callback参数的说明包含该参数的定义:
convergenceis the fractional value of the population convergence. When convergence is 1, the population has converged.
简单来说,这个值是衡量种群同质化程度的指标:
- 当种群个体差异较大时,
convergence值接近0; - 随着迭代进行,种群逐渐向最优解聚集,个体差异缩小,
convergence值逐渐趋近于1; - 当
convergence达到1(或因计算误差略大于1)时,说明种群已失去多样性,所有个体趋近于同一个解,算法判定为收敛并终止。
与直觉认知的差异
你认为“收敛值应趋近于0”的逻辑,通常对应梯度下降这类单点迭代算法——这类算法通过监控目标函数的变化量或参数更新幅度判断收敛。但差分进化是种群类优化算法,其收敛逻辑聚焦于种群的整体状态:当种群不再有新的探索方向时,就认为已找到当前搜索范围内的最优解(或局部最优解)。
在你的示例中,算法终止时得到的解对应Rastrigin函数的一个局部最优值(约0.995),符合算法的运行结果,而convergence值略大于1是计算过程中的微小误差导致,本质上已满足收敛条件。
内容的提问来源于stack exchange,提问作者Molares
相关产品推荐
相关产品推荐

