關(guān)于scipy.optimize函數(shù)使用及說明
scipy.optimize函數(shù)使用
簡單使用scipy.optimize,訓(xùn)練邏輯回歸損失函數(shù),得到權(quán)值。
scipy.optimize模塊包含什么?
該scipy.optimize包提供幾種常用的優(yōu)化算法??梢允褂迷敿?xì)列表: scipy.optimize(也可以通過help(scipy.optimize)找到)。
該模塊包含:
1、使用多種算法(例如BFGS,Nelder-Mead單形,牛頓共軛梯度,COBYLA或SLSQP)對多元標(biāo)量函數(shù)進(jìn)行無約束和無約束的最小化(最小化)
2、全局(強(qiáng)力)優(yōu)化例程(例如,盆地跳動,differential_evolution)
3、最小二乘最小化(least_squares)和曲線擬合(curve_fit)算法
4、標(biāo)量單變量函數(shù)最小化器(minimum_scalar)和根查找器(牛頓)
5、使用多種算法(例如,混合鮑威爾,萊文貝格-馬夸特或大型方法,例如牛頓-克里洛夫)的多元方程組求解器(root)。
使用步驟
1、函數(shù)介紹
import numpy as np from scipy.optimize import minimize
函數(shù)入?yún)ⅲ?/p>
scipy.optimize.minimize( ?? ??? ??? ??? ??? ? ? fun, ?#可調(diào)用的目標(biāo)函數(shù)。 ? ? ? ? ? ? ? ? ? ? ? ?x0, ?#ndarray,初值。(n,) ? ? ? ? ? ? ? ? ? ? ? ?args=(), #額外的參數(shù)傳遞給目標(biāo)函數(shù)及其導(dǎo)數(shù) ? ? ? ? ? ? ? ? ? ? ? ?method=None, #類型的解算器。應(yīng)該是其中之一: ?? ??? ??? ??? ??? ??? ??? ??? ??? ?#‘Nelder-Mead'、‘Powell' ?? ??? ??? ??? ??? ??? ??? ??? ??? ?#‘CG'、‘BFGS' ?? ??? ??? ??? ??? ??? ??? ??? ??? ?#‘Newton-CG'、‘L-BFGS-B'? ?? ??? ??? ??? ??? ??? ??? ??? ??? ?#‘TNC'、‘COBYLA' ?? ??? ??? ??? ??? ??? ??? ??? ??? ?#‘SLSQP'、‘dogleg'? ?? ??? ??? ??? ??? ??? ??? ??? ??? ?#‘trust-ncg'? ? ? ? ? ? ? ? ? ? ? ? ?jac=None, #目標(biāo)函數(shù)的雅可比矩陣(梯度向量)。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#僅適用于CG, BFGS, Newton-CG,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#L-BFGS-B, TNC, SLSQP, dogleg, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#trust-ncg。如果jac是一個布爾值, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#且為True,則假定fun將隨目標(biāo)函數(shù)返回 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#梯度。如果為False,則用數(shù)值方法估計梯 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#度。Jac也可以是返回目標(biāo)梯度的可調(diào)用對 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#象。在這種情況下,它必須接受與樂趣相同 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#的論點(diǎn)。 ? ? ? ? ? ? ? ? ? ? ? ?hess=None,? ? ? ? ? ? ? ? ? ? ? ? ?hessp=None,#目標(biāo)函數(shù)的Hessian(二階導(dǎo)數(shù)矩陣)或 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #目標(biāo)函數(shù)的Hessian乘以任意向量p。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #僅適用于Newton-CG, dogleg, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #trust-ncg。只需要給出一個hessp或 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #hess。如果提供了hess,則將忽略 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #hessp。如果不提供hess和hessp,則用 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #jac上的有限差分來近似Hessian積。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #hessp必須計算Hessian乘以任意向量。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bounds=None, #變量的邊界(僅適用于L-BFGS-B,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #TNC和SLSQP)。(min, max) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #對x中的每個元素,定義該參數(shù)的 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #邊界。當(dāng)在min或max方向上沒有邊界 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #時,使用None表示其中之一。 ? ? ? ? ? ? ? ? ? ? ? ?constraints=(), #約束定義 ? ? ? ? ? ? ? ? ? ? ? ??? ??? ??? ??? ? ? #(僅適用于COBYLA和SLSQP) ? ? ? ? ? ? ? ? ? ? ? ?tol=None, #終止的邊界。 ? ? ? ? ? ? ? ? ? ? ? ?callback=None,? ? ? ? ? ? ? ? ? ? ? ? ?options=None)
返回值: res : OptimizeResult
#以O(shè)ptimizeResult對象表示的優(yōu)化結(jié)果。重要的屬性有:x是解決方案數(shù)組, #success是一個布爾標(biāo)志,指示優(yōu)化器是否成功退出,以及描述終止原因的消息。
使用scipy.optimize進(jìn)行優(yōu)化
首先看一看這個函數(shù)的形式
scipy.optimize.fmin_cg(f, x0, fprime=None, args=(), gtol=1e-05, norm=inf, epsilon=1.4901161193847656e-08, maxiter=None, full_output=0, disp=1, retall=0, callback=None)
f
: 可調(diào)用,f(x, *args)
要最小化的目標(biāo)函數(shù)。這里 x 必須是在搜索最小值時要更改的變量的一維數(shù)組,而 args 是 f 的其他(固定)參數(shù)。
x0
: ndarray
用戶提供的 xopt 初始估計值,即 x 的最優(yōu)值。它必須是一維值數(shù)組。
fprime
: 可調(diào)用,fprime(x, *args),可選
返回 f 在 x 處的梯度的函數(shù)。這里 x 和 args 與上面對 f 的說明相同。返回的值必須是一維數(shù)組。默認(rèn)為 None,在這種情況下,梯度是數(shù)值近似的(參見下面的 epsilon)。
args
: 元組,可選
傳遞給的參數(shù)值f和fprime.當(dāng)需要額外的固定參數(shù)來完全指定函數(shù)時,必須提供f和fprime.
gtol
:浮點(diǎn)數(shù),可選
當(dāng)梯度的范數(shù)小于 gtol 時停止。
norm
: 浮點(diǎn)數(shù),可選
用于梯度范數(shù)的順序(-np.Inf 是最小值,np.Inf 是最大值)。
epsilon
: float 或 ndarray,可選
何時使用的步長fprime是數(shù)值近似的??梢允菢?biāo)量或一維數(shù)組。默認(rèn)為sqrt(eps), 用 eps 表示浮點(diǎn)機(jī)器精度。通常sqrt(eps)約為 1.5e-8。
maxiter
: int 可選
要執(zhí)行的最大迭代次數(shù)。默認(rèn)為 200 * len(x0) 。
full_output
: 布爾型,可選
如果為 True,除了 xopt 之外,還返回 fopt、func_calls、grad_calls 和 warnflag。有關(guān)可選返回值的更多信息,請參閱下面的返回部分。
disp
: 布爾型,可選
如果為 True,則返回收斂消息,然后是 xopt。
retall
: 布爾型,可選
如果為 True,則將每次迭代的結(jié)果添加到返回值中。
callback
: 可調(diào)用的,可選的
一個可選的用戶提供的函數(shù),在每次迭代后調(diào)用。稱為callback(xk),其中xk是的當(dāng)前值x0.
下面是返回值
xopt
: ndarray
最小化 f 的參數(shù),即 f(xopt) == fopt 。
fopt
: 浮點(diǎn)數(shù),可選
找到最小值,f(xopt)。僅在 full_output 為 True 時返回。
func_calls
: int 可選
function_calls 的數(shù)量。僅在 full_output 為 True 時返回。
grad_calls
: int 可選
進(jìn)行的梯度調(diào)用次數(shù)。僅在 full_output 為 True 時返回。
warnflag
: int 可選
帶有警告狀態(tài)的整數(shù)值,僅在 full_output 為 True 時返回。
- 0:成功。
- 1:超過最大迭代次數(shù)。
- 2 梯度和/或函數(shù)調(diào)用沒有改變??赡鼙砻髟摼葋G失了,即例程沒有收斂。
- 3:遇到NaN 結(jié)果。
allvecs
: ndarray 列表,可選
數(shù)組列表,包含每次迭代的結(jié)果。只有當(dāng)retall 為True 時才返回。
下面是一個實(shí)際運(yùn)行的實(shí)例
from scipy import optimize args = (2, 3, 7, 8, 9, 10) def f(x,*args): # args是該函數(shù)需要用到的其他值 u,v=x a,b,c,d,e,f=args return a*u**2 + b*u*v + c*v**2 + d*u + e*v + f def gradf(x,*args): u,v=x a, b, c, d, e, f = args gu=2*a*u+b*v+d gv=b*u+2*c*v+e return np.asarray((gu,gv)) x0 = np.asarray((0, 0)) # 迭代的初始點(diǎn) res = optimize.fmin_cg(f, x0, fprime=gradf, args=args,full_output=True) # 直接運(yùn)行的話就會出現(xiàn)下面的東西 ''' Optimization terminated successfully. Current function value: 1.617021 Iterations: 4 Function evaluations: 8 Gradient evaluations: 8 ''' # print(res) # [-1.80851064 -0.25531915] # 這是沒有添加full_output=True的時候 # print(type(res)) # <class 'numpy.ndarray'> # 添加過之后full_output=True print(res) # (array([-1.80851064, -0.25531915]), 1.6170212765957448, 8, 8, 0) print(type(res)) # <class 'tuple'> # 第一個是代表最小化后的自變量的參數(shù) # 第二個是函數(shù)的最小值 # 第三個是函數(shù)調(diào)用的次數(shù) # 第四個是梯度調(diào)用的次數(shù) # 第五個是帶有警告狀態(tài)的整數(shù)值,返回0表示成功
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python AutoCAD 系統(tǒng)設(shè)置的實(shí)現(xiàn)方法
這篇文章主要介紹了Python AutoCAD 系統(tǒng)設(shè)置的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Python使用SQLAlchemy進(jìn)行復(fù)雜查詢的操作代碼
SQLAlchemy 是 Python 生態(tài)系統(tǒng)中非常流行的數(shù)據(jù)庫處理庫,它提供了一種高效、簡潔的方式與數(shù)據(jù)庫進(jìn)行交互,在數(shù)據(jù)驅(qū)動的應(yīng)用程序中,復(fù)雜查詢是必不可少的,本文將通過一些常見的示例介紹如何使用 SQLAlchemy 編寫復(fù)雜查詢,需要的朋友可以參考下2024-10-10Python中Pandas庫提供的函數(shù)pd.DataFrame的基本用法
pandas庫中的pd.DataFrame()函數(shù)用于創(chuàng)建一個DataFrame對象,它是一個二維表格數(shù)據(jù)結(jié)構(gòu),每列可以是不同的數(shù)據(jù)類型(數(shù)值、字符串、布爾值等),下面這篇文章主要給大家介紹了關(guān)于Python中Pandas庫提供的函數(shù)pd.DataFrame的基本用法,需要的朋友可以參考下2024-03-03python3基于OpenCV實(shí)現(xiàn)證件照背景替換
這篇文章主要為大家詳細(xì)介紹了python3基于OpenCV實(shí)現(xiàn)證件照背景替換,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07使用python實(shí)現(xiàn)遞歸版漢諾塔示例(漢諾塔遞歸算法)
這篇文章主要介紹了使用python實(shí)現(xiàn)遞歸版漢諾塔示例(漢諾塔遞歸算法),需要的朋友可以參考下2014-04-04判斷Threading.start新線程是否執(zhí)行完畢的實(shí)例
這篇文章主要介紹了判斷Threading.start新線程是否執(zhí)行完畢的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05對Python中GIL(全局解釋器鎖)的一點(diǎn)理解淺析
首先需要明確的一點(diǎn)是GIL并不是Python的特性,它是在實(shí)現(xiàn)Python解析器(CPython)時所引入的一個概念,下面這篇文章主要給大家介紹了關(guān)于對Python中GIL的一點(diǎn)理解,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05基于Python實(shí)現(xiàn)通過微信搜索功能查看誰把你刪除了
這篇文章主要介紹了基于Python實(shí)現(xiàn)微信搜索查看誰把你刪除了的相關(guān)資料,需要的朋友可以參考下2016-01-01python實(shí)現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法
這篇文章主要介紹了python實(shí)現(xiàn)將pvr格式轉(zhuǎn)換成pvr.ccz的方法,涉及Python實(shí)現(xiàn)格式轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04