scipy.optimize包提供了幾種常用的優(yōu)化算法。 該模塊包含以下幾個(gè)方面 -
minimize())anneal(),basinhopping())leastsq())和曲線擬合(curve_fit())算法minim_scalar())和根查找(newton())多變量標(biāo)量函數(shù)的無(wú)約束和約束最小化
minimize()函數(shù)為scipy.optimize中的多變量標(biāo)量函數(shù)提供了無(wú)約束和約束最小化算法的通用接口。 為了演示最小化函數(shù),考慮使NN變量的Rosenbrock函數(shù)最小化的問(wèn)題 -
這個(gè)函數(shù)的最小值是0,當(dāng)xi = 1時(shí)達(dá)到。
在下面的例子中,minimize()例程與Nelder-Mead單純形算法(method ='Nelder-Mead')一起使用(通過(guò)方法參數(shù)選擇)。參考下面的例子。
import numpy as np
from scipy.optimize import minimize
def rosen(x):
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead')
print(res.x)
上述程序?qū)⑸梢韵螺敵?-
[7.93700741e+54 -5.41692163e+53 6.28769150e+53 1.38050484e+55 -4.14751333e+54]
簡(jiǎn)單算法只需要函數(shù)評(píng)估,對(duì)于簡(jiǎn)單的最小化問(wèn)題是一個(gè)不錯(cuò)的選擇。 但是,由于它不使用任何梯度評(píng)估,因此可能需要較長(zhǎng)時(shí)間才能找到最小值。
另一種只需要函數(shù)調(diào)用來(lái)尋找最小值的優(yōu)化算法就是鮑威爾方法,它可以通過(guò)在minimize()函數(shù)中設(shè)置method ='powell'來(lái)實(shí)現(xiàn)。
求解一個(gè)帶有變量邊界的非線性最小二乘問(wèn)題。 給定殘差f(x)(n個(gè)實(shí)變量的m維實(shí)函數(shù))和損失函數(shù)rho(s)(標(biāo)量函數(shù)),最小二乘法找到代價(jià)函數(shù)F(x)的局部最小值。 看看下面的例子。
在這個(gè)例子中,Rosenbrock函數(shù)的最小值不受自變量的限制。
#Rosenbrock Function
def fun_rosenbrock(x):
return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])
from scipy.optimize import least_squares
input = np.array([2, 2])
res = least_squares(fun_rosenbrock, input)
print (res)
請(qǐng)注意,我們只提供殘差的向量。 該算法將成本函數(shù)構(gòu)造為殘差的平方和,這給出了Rosenbrock()函數(shù)。 確切的最小值是x = [1.0,1.0]。
上述程序?qū)⑸梢韵螺敵?-
active_mask: array([ 0., 0.])
cost: 9.8669242910846867e-30
fun: array([ 4.44089210e-15, 1.11022302e-16])
grad: array([ -8.89288649e-14, 4.44089210e-14])
jac: array([[-20.00000015,10.],[ -1.,0.]])
message: '`gtol` termination condition is satisfied.'
nfev: 3
njev: 3
optimality: 8.8928864934219529e-14
status: 1
success: True
x: array([ 1., 1.])
讓我們了解求根如何在SciPy中使用。
標(biāo)量函數(shù)
如果有一個(gè)單變量方程,則可以嘗試四種不同的尋根算法。 這些算法中的每一個(gè)都需要預(yù)期根的時(shí)間間隔的端點(diǎn)(因?yàn)楹瘮?shù)會(huì)改變符號(hào))。 一般來(lái)說(shuō),brentq是最好的選擇,但其他方法可能在某些情況下或?qū)W術(shù)目的有用。
定點(diǎn)求解
與找到函數(shù)零點(diǎn)密切相關(guān)的問(wèn)題是找到函數(shù)的固定點(diǎn)的問(wèn)題。 函數(shù)的固定點(diǎn)是函數(shù)評(píng)估返回點(diǎn)的點(diǎn):g(x)= x。 顯然,gg的不動(dòng)點(diǎn)是f(x)= g(x)-x的根。 等價(jià)地,ff的根是g(x)= f(x)+ x的固定點(diǎn)。 例程fixed_point提供了一個(gè)簡(jiǎn)單的迭代方法,使用Aitkens序列加速度來(lái)估計(jì)gg的固定點(diǎn),如果給出起點(diǎn)的話。
方程組
使用root()函數(shù)可以找到一組非線性方程的根。 有幾種方法可供選擇,其中hybr(默認(rèn))和lm分別使用Powell的混合方法和MINPACK中的Levenberg-Marquardt方法。
下面的例子考慮了單變量超越方程。
其根可以求解如下 -
import numpy as np
from scipy.optimize import root
def func(x):
return x*2 + 2 * np.cos(x)
sol = root(func, 0.3)
print (sol)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
fjac: array([[-1.]])
fun: array([ 2.22044605e-16])
message: 'The solution converged.'
nfev: 10
qtf: array([ -2.77644574e-12])
r: array([-3.34722409])
status: 1
success: True
x: array([-0.73908513])