怎么在python中使用优化?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
python的优点有哪些
1,简单易用,与C/c++、Java、c#等传统语言相比,python对代码格式的要求没有那么严格;2,python属于开源的,所有人都可以看到源代码,并且可以被移植在许多平台上使用;3,python面向对象,能够支持面向过程编程,也支持面向对象编程;4,python是一种解释性语言,python写的程序不需要编译成二进制代码,可以直接从源代码运行程序;5,python功能强大,拥有的模块众多,基本能够实现所有的常见功能。
<强>非线性方程组求解强>
SciPy中对非线性方程组求解是fslove()函数,它的调用形式一般为fslove(有趣,x0),有趣的是计算非线性方程组的误差函数,它需要一个参数x,乐趣依靠x来计算线性方程组的每个方程的值(或者叫误差),x0是x的一个初始值。
“““ 计算非线性方程组: 5 x1 + 3,才能=0 4才能x0 ^ 2-2sin (x1x2)=0 x1x2才能- 1.5=0 “““ # #,误差函数 def 有趣的(x): x0, x1,才能x2 =, x.tolist () 返回才能(5 * x1 + 3、4 x0 ^ 2-2sin (x1x2) x1x2 - 1.5) 时间=result optimize.fsolve(有趣,(1,1,1)) # #,结果 [-0.70622057,,-0.6,,-2.5]
在计算非线性方程中的解时,比如像坐标上升算法,其中需要用到未知数的导数,同样,scipy的fslove()也提供了fprime参数传递未知数的雅各比矩阵从而加速计算,传递的雅各比矩阵每一行时某一方程对各个未知数的导数。对于上面的例子,我们可以写下如下的雅各比矩阵传入。
def j (x): x0, x1,才能x2 =, x.tolist () 返回才能[[0 5 0],[8 * x0, 2 * x2 * cos (x1 * x2], [0 x2 x1]] result =, optimize.fsolve(有趣,(1,1,1)fprime=j) #结果 [-0.70622057,,-0.6,,-2.5]
scipy的内部在实现fslove时应该时应该是利用了坐标上升算法或者梯度相关优化算法,但本人没有考证,有兴趣的可以看看源码。
<强>最小二乘拟合强>
关于最小二乘算法的理论这里并不想谈,网上解释的文章也挺多,在优化模块中,可以使用leastsq()对数据进行最小二乘拟合计算。leastsq()的用法很简单,只需要将计箅误差的函数和待确定参数的初始值传递给它即可。
x =, np.array ((8.19, 2.72, 6.39, 8.71, 4.7, 2.66, 3.78)) 时间=y np.array ([7.01, 2.78, 6.47, 6.71, 4.1, 4.23, 4.05)) def 残余(p): k,才能b p=, return 才能;y - (k * x + b) 时间=r optimize.leastsq(剩余(1,0)) 时间=k, b r [0] #,print k .613495349193 # print b .79409254326
def func (x, p): “才能”;“ ,,,计算的正弦波,罪:*(2 *π* k * x +θ) “才能”;“ ,,A, k, theta p=, return 才能;* sin (2 * np.pi * k * x +θ) def 复述(p y、x): return 才能y-func (x, p) 时间=x np.linspace (0, 2 * np.pi, 100) A、k theta =, 10日,0.34,np.pi/6 时间=y0 func (x, [k,θ]) #,加入噪声 np.random.seed (0) y1 =, y0 + 2 * np.random.randn (len (x)) 时间=p0 [7, 0.40, 0] #,p0是,k,θ的初始值,y1, x要拟合的数据 时间=plsq optimize.leastsq(复述,p0, arg游戏=(x)日元) print (k,θ),#真是的参数的值 print plsq[0],, #拟合后的参数值
对于像正弦波或者余弦波的曲线拟合、优化提供curve_fit()函数,它的使用方式和leastq()稍有不同,它直接计算曲线的值,比如上面的拟合正弦波可以用cureve_fit()来写。
def func2 (x, p): “才能”;“ ,,,计算的正弦波,罪:*(2 *π* k * x +θ) “才能”;“ ,,A, k, theta p=, return 才能;* sin (2 * np.pi * k * x +θ) ret, _=optimize.curve_fit (func2 x, y?, p0=p0)
该函数有一个缺点就是对于初始值敏感,如果初始频率和真实频率值差太多,会导致最后无法收敛到真是频率。
<强>局部最小值强>
优化模块还提供了常用的最小值算法如:Nelder-Mead,鲍威尔,CG,挠挠,Newton-CG等,在这些最小值计算时,往往会传入一阶导数矩阵(雅各比矩阵)或者二阶导数矩阵(黑塞矩阵)从而加速收敛,这些最优化算法往往不能保证收敛到全局最小值,大部分会收敛到局部极小值。这些函数的调用方式为: