pythonoptimize_SciPy优化optimize模块⽤法
优化包提供了各种常⽤的优化算法。该模块包含以下⽅⾯:
全局优化例程(brute-force蛮⼒, anneal(), basinhopping())
使⽤各种算法(BFGS, Nelders-Mead单形, ⽜顿共轭梯度, COBLYA)对多元标量函数(minimize())进⾏⽆约束和⽆约束的最⼩化。
最⼩⼆乘最⼩化算法(leastsq()和curve fit())
标量单变量函数最⼩化器(minimizer_scalar()和根查器newton())
Nelder-Mead单纯形算法
Nelder-Mead Simplex算法提供了minimum()函数, 该函数⽤于最⼩化⼀个或多个变量的标量函数。
import numpy as np
import scipy
from scipy.optimize import minimize
#define function f(x)
def f(x):
return .2*(1 - x[0])**2
scipy.optimize.minimize(f, [2, -1], method="Nelder-Mead")
输出
final_simplex: (array([[ 1. , -1.27109375], [ 1. , -1.27118835], [ 1. , -1.27113762]]), array([0., 0., 0.]))
fun: 0.0
message: 'Optimization terminated successfully.'
nfev: 147
nit: 69
status: 0
success: True
x: array([ 1. , -1.27109375])
最⼩⼆乘最⼩化
它⽤于解决变量受限的⾮线性最⼩⼆乘问题。给定残差(数据的观测值和预测值之间的差)f(x)(n个实变量的n维实函数)和损失函数rho(s)(标量函数), minimum_square会到成本函数f(x):让我们考虑以下⽰例:
from scipy.optimize import least_squares
import numpy as np
input = np.array([2, 2])
def rosenbrock(x):
return np.array([10 * (x[1] - x[0]**3), (1 - x[0])])
res = least_squares(rosenbrock, input)
输出
active_mask: array([0., 0.])
cost: 0.0
fun: array([0., 0.])
grad: array([0., 0.])
jac: array([[-30.00000045, 10. ], [ -1. , 0. ]])
message: '`gtol` termination condition is satisfied.'
nfev: 4
njev: 4
optimality: 0.0
status: 1
success: True
x: array([1., 1.])
寻根
标量函数
对于单个值⽅程, 有四种不同的寻根算法。每种算法都需要⼀个期望根值的区间的端点(因为函数会改变符号)。
⽅程组
root()函数⽤于查⾮线性⽅程的根。 MINPACK提供了多种⽅法, 例如hybr(默认)和Levenberg-Marquardt⽅法。让我们考虑下⾯的等式
x2 + 3cos(x)= 0
import numpy as np
from scipy.optimize import root
def func(x):
return x*2 + 3* np.cos(x)
a = root(func, 0.3)
print(a)
输出
fjac: array([[-1.]])
fun: array([2.22044605e-16])
message: 'The solution converged.'
nfev: 10
qtf: array([-1.19788401e-10])
r: array([-4.37742564])
success: True
x: array([-0.91485648])
优化曲线拟合
曲线拟合是创建曲线的技术。它是⼀种数学函数, 最适合可能会受到约束的⼀系列数据点。⽰例如下:
import numpy as np
from scipy.optimize import curve_fit
from matplotlib import pyplot as plt
x = np.linspace(0, 10, num = 40)
# The coefficients are much bigger.
y = 10.35 * np.sin(5.330 * x) + al(size = 40)
def test(x, a, b):
return a * np.sin(b * x)
param, param_cov = curve_fit(test, x, y)
print("Sine funcion coefficients:")
print(param)
print("Covariance of coefficients:")
linspace函数pythonprint(param_cov)
ans = (param[0]*(np.sin(param[1]*x)))
plt.plot(x, y, 'o', color ='red', label ="data")
plt.plot(x, ans, '--', color ='blue', label ="optimized data")
plt.legend()
plt.show()
输出
Sine funcion coefficients:
[-0.42111847 1.03945217]
Covariance of coefficients:
[[3.03920718 0.05918002]
[0.05918002 0.43566354]]
SciPy幻想
scipy.optimize库提供了fsolve()函数, 该函数⽤于查函数的根。给定初始估计值, 它将返回fun(x)= 0定义的⽅程式的根。考虑以下⽰例:
import numpy as np
from scipy.optimize import fsolve
a = 132712000000
T = 365.35 * 86337 * 2 / 3
e = 580.2392124070273
def f(x):
return np.abs((T * a ** 2 / (2 * np.pi)) ** (1 / 3) * sqrt(1 - x ** 2) - sqrt(.5 * a ** 2 / e * (1 - x ** 2)))
x = fsolve(f, 0.01)
x, f(x)
输出
(array([1.]), array([82.17252895]))

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。