python scipy.optimize 非线性规划 求解局部最优和全局最优
1. 非線性規劃 求解局部最優
首先展示一個最簡單的示例:
from scipy.optimize import minimizedef fun_convex(x):return (x - 1) ** 2 + 3minimize(fun=fun_convex, x0=0, bounds=[(-10,10)]) scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)fun: 求最小值的目標函數 x0: 變量的初始猜測值,如果有多個變量,需要給每個變量一個初始猜測值 args: 常數值,fun中的可變常量 method: 求極值的方法,官方文檔給了很多種。一般使用默認 constraints: 約束條件,針對fun中為參數的部分進行約束限制scipy.optimize.minimizel 官方說明文檔
通過scipy.optimize.minimize,我們可以很輕松的求解凸函數的局部最優的數值解,這里有幾個注意點:
①求解函數為非凸函數時,所求結果為局部最優
②求解函數為凸函數時,所求結果為最小值
③所求皆為數值解而不是理論解
下面展示一個非凸函數的示例:
from scipy.optimize import minimizedef fun_nonconvex(x): if x<0:return ( x + 2 ) ** 2 + 1else:return ( x - 2 ) ** 2 + 2minimize(fun=fun_nonconvex, x0=0, bounds=[(-10,10)])
我們可以發現,所求的x=2并非為全局最優解(應該是x=-2)而是局部最優解,所求結果與設置的初值x0有很大關系。
2. 求解全局最優
通過以上內容我們可以發現,scipy.optimize.minimize只能求解局部最優解,那么我們該如何求解全局最優呢?本文介紹scipy.optimize的3種方法:
brute():網格搜索優化,屬于暴力全局優化。 brute官方說明文檔
differential_evolution():差分進化本質上是隨機的(不使用梯度方法)來尋找最小值,并且可以搜索大面積的候選空間,但通常需要比傳統的基于梯度的技術更多的函數評估。 differential_evolution官方說明文檔
basinhopping():Basin-hopping 是一種two-phase 方法,它將全局步進算法與每一步的局部最小相結合,會在每次隨機跳躍后使用局部松弛,旨在模擬原子簇能量最小化的自然過程。 basinhopping官方說明文檔
使用蠻力的brute()就不深入探討,接下來給出differential_evolution()和basinhopping()的簡單例程:
from scipy.optimize import differential_evolution, basinhoppingdef fun_nonconvex(x): if x<0:return ( x + 2 ) ** 2 + 1else:return ( x - 2 ) ** 2 + 2res_differential_evolution = differential_evolution(func=fun_nonconvex, bounds=[(-10,10)]) print('differential_evolution()的結果為:\n', res_differential_evolution)res_basinhopping = basinhopping(func=fun_nonconvex, x0=0, niter=1000) print('\n basinhopping()的結果為:\n', res_basinhopping)這兩種方法均可以求得全局最優解:
總結
以上是生活随笔為你收集整理的python scipy.optimize 非线性规划 求解局部最优和全局最优的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机毕业设计 在线免费小说微信小程序(
- 下一篇: 如何在WorkNC中快速建立坐标管理器