怎么在python中使用优化

  介绍

怎么在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等,在这些最小值计算时,往往会传入一阶导数矩阵(雅各比矩阵)或者二阶导数矩阵(黑塞矩阵)从而加速收敛,这些最优化算法往往不能保证收敛到全局最小值,大部分会收敛到局部极小值。这些函数的调用方式为:

怎么在python中使用优化