當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy optimize.brute用法及代碼示例


本文簡要介紹 python 語言中 scipy.optimize.brute 的用法。

用法:

scipy.optimize.brute(func, ranges, args=(), Ns=20, full_output=0, finish=<function fmin>, disp=False, workers=1)#

通過蠻力最小化給定範圍內的函數。

使用 “brute force” 方法,即計算函數在多維點網格的每個點的值,以找到函數的全局最小值。

按照vectorize NumPy 函數的強製執行,該函數在範圍內的任何地方都使用第一次調用該函數的數據類型進行評估。當full_output=Truefinish 參數影響時返回的函數評估的值和類型(請參閱注釋)。

蠻力方法效率低下,因為網格點的數量呈 index 增長 - 要評估的網格點數量為 Ns ** len(x) 。因此,即使使用粗網格間距,即使是中等大小的問題也可能需要很長時間才能運行,和/或遇到內存限製。

參數

func 可調用的

要最小化的目標函數。必須采用 f(x, *args) 的形式,其中 x 是一維數組形式的參數,而 args 是完全指定函數所需的任何其他固定參數的元組。

ranges 元組

的每個組件範圍元組必須是 “slice object” 或形式為範圍元組(low, high).該程序使用這些來創建將在其上計算目標函數的點網格。看筆記2了解更多詳情。

args 元組,可選

完全指定函數所需的任何其他固定參數。

Ns 整數,可選

如果未另行指定,則沿軸的網格點數。見注 2。

full_output 布爾型,可選

如果為 True,則返回評估網格及其上的目標函數值。

finish 可調用的,可選的

以蠻力最小化的結果作為初始猜測調用的優化函數。 finish 應該將 func 和初始猜測作為位置參數,並將 args 作為關鍵字參數。它還可以將 full_output 和/或 disp 作為關鍵字參數。如果不使用 “polishing” 函數,則使用 None。有關詳細信息,請參閱注釋。

disp 布爾型,可選

設置為 True 以打印來自完成可調用的收斂消息。

workers int 或 map-like 可調用,可選

如果工作人員是一個int,網格被細分為工作人員部分和並行評估(使用multiprocessing.Pool)。供應-1使用進程可用的所有內核。或者提供一個 map-like 可調用對象,例如多處理.Pool.map用於並行評估網格。本次評價為workers(func, iterable).要求函數可以 pickle 。

返回

x0 ndarray

包含目標函數具有最小值的點的坐標的一維數組。 (有關返回的點,請參見注 1。)

fval 浮點數

點 x0 處的函數值。 (當full_output 為真時返回。)

grid 元組

評估網格的表示。它的長度與 x0 相同。 (當full_output 為真時返回。)

Jout ndarray

評估網格每個點的函數值,即Jout = func(*grid). (返回時full_output是真的。)

注意

注1:程序找到目標函數出現最小值的網格點。如果結束為無,即返回的點。當全局最小值出現在網格邊界之內(或不是很遠)時,並且網格足夠精細,該點將位於全局最小值附近。

但是,用戶經常使用其他一些優化程序來“polish”網格點值,即在附近尋找更精確的(局部)最小值蠻力的最佳網格點。這brute職能結束選項提供了一種方便的方法來做到這一點。使用的任何拋光程序都必須采取蠻力的輸出作為其初始猜測作為位置參數,並取蠻力的輸入值參數作為關鍵字參數,否則將引發錯誤。它可能還需要full_output和/或顯示作為關鍵字參數。

brute假設結束函數返回一個OptimizeResult對象或元組的形式:(xmin, Jmin, ... , statuscode),其中xmin是參數的最小化值,Jmin是目標函數的最小值,“…”可能是其他一些返回值(brute), 和statuscode是狀態碼結束程序。

請注意,當結束不是無,返回的值是那些結束程序,不是網格點的。因此,雖然brute將其搜索限製在輸入網格點,結束程序的結果通常不會與任何網格點重合,並且可能落在網格邊界之外。因此,如果隻需要在提供的網格點上找到最小值,請確保傳入完成=無.

筆記2:點的網格是numpy.mgrid目的。為了brute 範圍NS輸入具有以下效果。的每個組件範圍tuple 可以是切片對象,也可以是給出一係列值的二元組,例如 (0, 5)。如果組件是切片對象,brute直接使用它。如果組件是一個二元組範圍,brute在內部將其轉換為插入的切片對象NS從它的low-value 指向它的high-value,包括在內。

例子

我們舉例說明使用brute尋求兩個變量的函數的全局最小值,該函數作為正定二次和兩個深 “Gaussian-shaped” 隕石坑之和給出。具體來說,定義目標函數f作為其他三個函數的總和,f = f1 + f2 + f3.我們假設每個都有一個簽名(z, *params),其中z = (x, y), 和params函數定義如下。

>>> import numpy as np
>>> params = (2, 3, 7, 8, 9, 10, 44, -1, 2, 26, 1, -2, 0.5)
>>> def f1(z, *params):
...     x, y = z
...     a, b, c, d, e, f, g, h, i, j, k, l, scale = params
...     return (a * x**2 + b * x * y + c * y**2 + d*x + e*y + f)
>>> def f2(z, *params):
...     x, y = z
...     a, b, c, d, e, f, g, h, i, j, k, l, scale = params
...     return (-g*np.exp(-((x-h)**2 + (y-i)**2) / scale))
>>> def f3(z, *params):
...     x, y = z
...     a, b, c, d, e, f, g, h, i, j, k, l, scale = params
...     return (-j*np.exp(-((x-k)**2 + (y-l)**2) / scale))
>>> def f(z, *params):
...     return f1(z, *params) + f2(z, *params) + f3(z, *params)

因此,目標函數可能在其組成的三個函數中的每一個函數的最小值附近具有局部最小值。要使用 fmin 來打磨它的網格點結果,我們可以繼續如下:

>>> rranges = (slice(-4, 4, 0.25), slice(-4, 4, 0.25))
>>> from scipy import optimize
>>> resbrute = optimize.brute(f, rranges, args=params, full_output=True,
...                           finish=optimize.fmin)
>>> resbrute[0]  # global minimum
array([-1.05665192,  1.80834843])
>>> resbrute[1]  # function value at global minimum
-3.4085818767

請注意,如果結束已設置為無,我們將獲得網格點 [-1.0 1.75],其中舍入函數值為 -2.892。

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.optimize.brute。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。