【翻譯自 : Function Optimization With SciPy】
【說明:Jason Brownlee PhD大神的文章個人很喜歡,所以閑暇時間里會做一點翻譯和學習實踐的作業,這里是相應作業的實踐記錄,希望能幫到有需要的人!】
優化涉及尋找目標函式的輸入,從而導致函式的最小或最大輸出,
用于科學計算的開源Python庫SciPy提供了一組優化演算法,許多演算法被用作其他演算法的構建塊,最著名的是scikit-learn庫中的機器學習演算法,
這些優化演算法可以直接以獨立方式使用以優化功能,最值得注意的是,本地搜索演算法和全域搜索演算法是您在機器學習專案中可能遇到的兩種主要優化型別,
在本教程中,您將發現SciPy庫提供的優化演算法,
完成本教程后,您將知道:
SciPy庫提供了一套針對不同目的的不同優化演算法,
SciPy中提供了本地搜索優化演算法,
SciPy中提供了全域搜索優化演算法,
教程概述
本教程分為三個部分: 他們是:
科學的優化
使用SciPy進行本地搜索
SciPy的全球搜索
科學的優化
用于科學計算的Python SciPy開源庫提供了一套優化技術,
許多演算法被用作SciPy庫以及機器學習庫(例如scikit-learn)中其他演算法的構建塊,
在審查特定技術之前,讓我們看一下庫提供的演算法型別,
他們是:
標量優化:凸單變數函式的優化,
本地搜索:優化單峰多變數函式,
全域搜索:多模式多變數函式的優化,
最小二乘:解決線性和非線性最小二乘問題,
曲線擬合:將曲線擬合到資料樣本,
根查找:查找函式的根(輸出為零的輸入),
線性規劃:線性優化受約束,
所有演算法都假設正在優化的目標函式是最小化函式,如果您的函式正在最大化,則可以通過向目標函式回傳的值添加負號來將其轉換為最小化,
除了上面的串列之外,該庫還提供一些演算法使用的實用程式功能以及Rosenbrock測驗問題,
有關SciPy庫優化功能的概述,請參見:
優化和根查找(scipy.optimize)API
現在,我們對庫支持的優化技術的型別有了一個高層次的了解,讓我們仔細研究一下我們更可能在應用機器學習中使用的兩組演算法,它們是本地搜索和全域搜索,
使用SciPy進行本地搜索
區域搜索或區域功能優化是指尋找輸入到函式的演算法,該演算法會導致最小或最大輸出,其中假定正在搜索的函式或受約束區域具有單個最優值,例如, 單峰的,
正在優化的函式可以是凸函式,也可以不是凸函式,并且可以具有一個或多個輸入變數,
如果功能被認為或已知是單峰的,則可以直接應用區域搜索優化來優化功能, 否則,可以應用區域搜索演算法來微調全域搜索演算法的結果,SciPy庫通過minimal()函式提供本地搜索,minimal()函式將要最小化的目標函式的名稱以及開始搜索的起始點作為輸入,并回傳OptimizeResult,該結果概述搜索的成功或失敗以及解決方案的詳細資訊(如果找到),
# minimize an objective function
result = minimize(objective, point)
如果已知,則可以提供有關目標函式的其他資訊,例如輸入變數的界限,用于計算函式一階導數的函式(梯度或雅可比矩陣),用于計算函式二階導數的函式(Hessian) 矩陣),以及對輸入的任何約束,重要的是,該函式提供了“方法”引數,該引數允許指定在本地搜索中使用的特定優化,
提供了一套流行的本地搜索演算法,例如:
Nelder-Mead演算法(方法=“ Nelder-Mead”),
牛頓法(method ='Newton-CG'),
鮑威爾的方法(方法=“鮑威爾”),
BFGS演算法和擴展名(方法=“ BFGS”),
下面的示例演示了如何使用L-BFGS-B區域搜索演算法求解二維凸函式,
# l-bfgs-b algorithm local optimization of a convex function
from scipy.optimize import minimize
from numpy.random import rand
# objective function
def objective(x):
return x[0]**2.0 + x[1]**2.0
# define range for input
r_min, r_max = -5.0, 5.0
# define the starting point as a random sample from the domain
pt = r_min + rand(2) * (r_max - r_min)
# perform the l-bfgs-b algorithm search
result = minimize(objective, pt, method='L-BFGS-B')
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['x']
evaluation = objective(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))
運行示例將執行優化,并報告搜索的成功或失敗,執行的功能評估的次數以及導致功能最佳化的輸入,
Status : b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
Total Evaluations: 9
Solution: f([3.38059583e-07 3.70089258e-07]) = 0.00000
既然我們熟悉將本地搜索演算法與SciPy結合使用,那么讓我們看一下全域搜索,
SciPy的全域搜索
全域搜索或全域功能優化是指尋找功能輸入的演算法,該演算法會導致最小或最大輸出,其中假定正在搜索的功能或約束區域具有多個區域最優值,例如,多式聯運,要優化的函式通常是非線性的,非凸的,并且可能具有一個或多個輸入變數,全域搜索演算法通常是隨機的,這意味著它們會在搜索程序中利用隨機性,并且可能會或可能不會在搜索程序中管理大量候選解決方案,
SciPy庫提供了許多隨機的全域優化演算法,每種演算法都通過不同的功能,他們是:
通過Basinhopping()函式實作盆地跳躍優化,
通過differential_evolution()函式進行差分進化優化,
通過dual_annealing()函式進行的模擬退火,
該庫還提供用于序列優化的shgo()函式和用于網格搜索優化的brute(),每種演算法都回傳一個OptimizeResult物件,該物件概述搜索的成功或失敗以及解決方案的詳細資訊(如果找到),
下面的示例演示了如何使用模擬退火求解二維多峰函式,
# simulated annealing global optimization for a multimodal objective function
from scipy.optimize import dual_annealing
# objective function
def objective(v):
x, y = v
return (x**2 + y - 11)**2 + (x + y**2 -7)**2
# define range for input
r_min, r_max = -5.0, 5.0
# define the bounds on the search
bounds = [[r_min, r_max], [r_min, r_max]]
# perform the simulated annealing search
result = dual_annealing(objective, bounds)
# summarize the result
print('Status : %s' % result['message'])
print('Total Evaluations: %d' % result['nfev'])
# evaluate solution
solution = result['x']
evaluation = objective(solution)
print('Solution: f(%s) = %.5f' % (solution, evaluation))
運行示例將執行優化,并報告搜索的成功或失敗,執行的功能評估的次數以及導致功能最佳化的輸入,
Status : ['Maximum number of iteration reached']
Total Evaluations: 4028
Solution: f([-3.77931027 -3.283186 ]) = 0.00000
參考APIS
Optimization (scipy.optimize) API.
Optimization and root finding (scipy.optimize) API.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258129.html
標籤:AI
