本文簡要介紹 python 語言中 scipy.optimize.direct
的用法。
用法:
scipy.optimize.direct(func, bounds, *, args=(), eps=0.0001, maxfun=None, maxiter=1000, locally_biased=True, f_min=-inf, f_min_rtol=0.0001, vol_tol=1e-16, len_tol=1e-06, callback=None)#
使用 DIRECT 算法查找函數的全局最小值。
- func: 可調用的
要最小化的目標函數。
func(x, *args) -> float
,其中x
是形狀為 (n,) 的一維數組,args
是完整指定函數所需的固定參數的元組。- bounds: 序列或
Bounds
變量的界限。有兩種方法可以指定邊界:
Bounds
類的實例。(min, max)
對x
中的每個元素進行配對。
- args: 元組,可選
完全指定目標函數所需的任何其他固定參數。
- eps: 浮點數,可選
當前最佳超矩形與要劃分的下一個潛在最佳超矩形之間的目標函數值所需的最小差異。因此,eps 充當局部搜索和全局搜索之間的權衡:越小,搜索就越局部。默認值為 1e-4。
- maxfun: int 或無,可選
目標函數評估的近似上限。如果None,將自動設置為
1000 * N
其中N
表示維數。如有必要,將設置上限,以限製應用程序的 DIRECT RAM 使用量。 1GiB。這隻會發生在非常高維度的問題和過多的情況下max_fun.默認為None.- maxiter: 整數,可選
最大迭代次數。默認值為 1000。
- locally_biased: 布爾型,可選
如果為 True(默認值),則使用稱為 DIRECT_L 的算法的局部偏置變體。如果為 False,則使用原始無偏 DIRECT 算法。對於具有許多局部最小值的難題,建議使用 False。
- f_min: 浮點數,可選
全局最優的函數值。僅當全局最優值已知時才設置此值。默認值為
-np.inf
,因此該終止標準被停用。- f_min_rtol: 浮點數,可選
一旦當前最佳最小值 f 與提供的全局最小值 f_min 之間的相對誤差小於 f_min_rtol,則終止優化。僅當還設置了 f_min 時才使用此參數。必須介於 0 和 1 之間。默認值為 1e-4。
- vol_tol: 浮點數,可選
一旦包含最低函數值的超矩形的體積小於完整搜索空間的vol_tol,則終止優化。必須介於 0 和 1 之間。默認值為 1e-16。
- len_tol: 浮點數,可選
如果locally_biased=True,一旦包含最低函數值的超矩形的歸一化最大邊長的一半小於len_tol,則終止優化。如果locally_biased=False,一旦包含最低函數值的超矩形的歸一化對角線的一半小於len_tol,則終止優化。必須介於 0 和 1 之間。默認值為 1e-6。
- callback: 可調用的,可選的
具有簽名
callback(xk)
的回調函數,其中xk
表示迄今為止找到的最佳函數值。
- res: OptimizeResult
優化結果表示為
OptimizeResult
對象。重要的屬性是:x
解決方案數組,success
指示優化器是否成功退出的布爾標誌和說明終止原因的message
。有關其他屬性的說明,請參見OptimizeResult
。
參數 ::
返回 ::
注意:
DIviding RECTangles (DIRECT) 是一種確定性全局優化算法,能夠通過對搜索空間中的潛在解決方案進行采樣來最小化黑盒函數,其變量受下限和上限約束[1]。該算法首先將搜索空間標準化為 n 維單位超立方體。它在此超立方體的中心和 2n 個(n 是變量的數量)個點(每個坐標方向上 2 個)對函數進行采樣。然後,DIRECT 使用這些函數值將域劃分為超矩形,每個超矩形恰好以一個采樣點作為其中心。在每次迭代中,DIRECT 使用每股收益參數默認為1e-4,對現有的一些超矩形進行進一步劃分。此除法過程持續進行,直到超過允許的最大迭代次數或最大函數計算次數,或者包含迄今為止找到的最小值的超矩形變得足夠小。如果f_min指定後,一旦該函數值達到相對容差範圍內,優化就會停止。 DIRECT 的局部偏置變體(最初稱為 DIRECT_L)[2]默認使用。對於隻有幾個局部極小值的情況,它使搜索更具局部偏差且更有效。
關於終止標準的說明:vol_tol指的是迄今為止找到的包含最低函數值的超矩形的體積。隨著問題維度的增加,這個體積呈指數下降。所以vol_tol應減少以避免算法過早終止更高維度。這不適用於len_tol:它指的是最大邊長的一半(對於
locally_biased=True
)或超矩形對角線的一半(對於locally_biased=False
)。該代碼基於 Gablonsky 等人的 DIRECT 2.0.4 Fortran 代碼。在https://ctk.math.ncsu.edu/SOFTWARE/DIRECTv204.tar.gz。這個原始版本最初是通過 f2c 轉換的,然後由 Steven G. Johnson 於 2007 年 8 月為 NLopt 項目進行清理和重組。
direct
函數包裝了 C 實現。參考:
[1]瓊斯,D.R.,佩圖寧,C.D. & 斯塔克曼,B.E.沒有 Lipschitz 常數的 Lipschitz 優化。 《最優理論應用雜誌》79, 157-181 (1993)。
[2]Gablonsky, J.,Kelley, C. DIRECT 算法的 Locally-Biased 形式。全局優化雜誌 21, 27-37 (2001)。
例子:
以下示例是具有四個局部最小值的二維問題:最小化 Styblinski-Tang 函數(https://en.wikipedia.org/wiki/Test_functions_for_optimization)。
>>> from scipy.optimize import direct, Bounds >>> def styblinski_tang(pos): ... x, y = pos ... return 0.5 * (x**4 - 16*x**2 + 5*x + y**4 - 16*y**2 + 5*y) >>> bounds = Bounds([-4., -4.], [4., 4.]) >>> result = direct(styblinski_tang, bounds) >>> result.x, result.fun, result.nfev array([-2.90321597, -2.90321597]), -78.3323279095383, 2011
找到了正確的全局最小值,但進行了大量的函數評估(2011)。放寬終止容差vol_tol 和len_tol 可用於提前停止 DIRECT。
>>> result = direct(styblinski_tang, bounds, len_tol=1e-3) >>> result.x, result.fun, result.nfev array([-2.9044353, -2.9044353]), -78.33230330754142, 207
相關用法
- Python SciPy optimize.diagbroyden用法及代碼示例
- Python SciPy optimize.differential_evolution用法及代碼示例
- Python SciPy optimize.dual_annealing用法及代碼示例
- Python SciPy optimize.rosen_der用法及代碼示例
- Python SciPy optimize.line_search用法及代碼示例
- Python SciPy optimize.rosen用法及代碼示例
- Python SciPy optimize.shgo用法及代碼示例
- Python SciPy optimize.minimize_scalar用法及代碼示例
- Python SciPy optimize.root用法及代碼示例
- Python SciPy optimize.fmin用法及代碼示例
- Python SciPy optimize.NonlinearConstraint用法及代碼示例
- Python SciPy optimize.KrylovJacobian用法及代碼示例
- Python SciPy optimize.toms748用法及代碼示例
- Python SciPy optimize.linprog_verbose_callback用法及代碼示例
- Python SciPy optimize.bracket用法及代碼示例
- Python SciPy optimize.milp用法及代碼示例
- Python SciPy optimize.bisect用法及代碼示例
- Python SciPy optimize.isotonic_regression用法及代碼示例
- Python SciPy optimize.golden用法及代碼示例
- Python SciPy optimize.brute用法及代碼示例
- Python SciPy optimize.newton用法及代碼示例
- Python SciPy optimize.fsolve用法及代碼示例
- Python SciPy optimize.Bounds用法及代碼示例
- Python SciPy optimize.fixed_point用法及代碼示例
- Python SciPy optimize.rosen_hess用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.direct。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。