开发者

关于scipy.optimize函数使用及说明

目录
  • scipy.optimize函数使用
    • scipy.optimize模块包含什么?
    • 使用步骤
  • 使用scipy.optimize进行优化
    • 总结

      scipy.optimize函数使用编程客栈

      简单使用scipy.optimize,训练逻辑回归损失函数,得到权值。

      scipy.optimize模块包含什么?

      该scipy.optimize包提供几种常用的优化算法。可以使用详细列表: scipandroidy.optimize(也可以通过help(scipy.optimize)找到)。

      该模块包含:

      1、使用多种算法(例如BFGS,Nelder-Mead单形,牛顿共轭梯度,COBYLA或SLSQP)对多元标量函数进行无约束和无约束的最小化(最小化)

      2、全局(强力)优化例程(例如,盆地跳动,differential_evolution)

      3、最小二乘最小化(least_squares)和曲线拟合(curve_fit)算法

      4、标量单变量函数最小化器(minimum_Scalar)和根查找器(牛顿)

      5、使用多种算法(例如,混合鲍威尔,莱文贝格-马夸特或大型方法,例如牛顿-克里洛夫)的多元方程组求解器(root)。

      使用步骤

      1、函数介绍

      imjsport numpy as np
      from scipy.optimize import minimize

      函数入参:

      scipy.optimize.minimize(
             fun, #可调用的目标函数。
                 x0, #ndarray,初值。(n,)
                 args=(), #额外的参数传递给目标函数及其导数
                 method=None, #类型的解算器。应该是其中之一:
               #‘Nelder-Mead'、‘Powell'
               #‘CG'、‘BFGS'
               #‘Newton-CG'、‘L-BFGS-B'
               #‘TNC'、‘COBYLA'
               #‘SLSQP'、‘dogleg'
               #‘trust-ncg'
      
                 jac=None, #目标函数的雅可比矩阵(梯度向量)。
                      #仅适用于CG, BFGS, Newton-CG,
                      #L-BFGS-B, TNC, SLSQP, dogleg,
                      #trust-ncg。如果jac是一个布尔值,
                      #且为True,则假定fun将随目标函数返回
                      #梯度。如果为False,则用数值方法估计梯
                      #度。Jac也可以是返回目标梯度的可调用对
                      #象。在这种情况下,它必须接受与乐趣相同
                      #的论点。
                 hess=None,
                 hessp=None,#目标函数的Hessian(二阶导数矩阵)或
                       #目标函数的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中的每个元素,定义该参数的
                        #边界。当在min或max方向上没有边界
                        #时,使用None表示其中之一。
                 constraints=(), #约束定义
                       #(仅适用于COBYLA和SLSQP)
                 tol=None, #终止的边界。
                 callback=None,
                 options=None)

      返回值: res : OptimizeResult

      #以OptimizeResult对象表示的优化结果。重要的属性有:x是解决方案数组,
      #success是一个布尔标志,指示优化器是否成功退出,以及描述终止原因的消息。

      使用scipy.optimize进行优化

      首先看一看这个函数的形式

      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: 可调用,f(x, *args)

      要最小化的目标函数。这里 x 必须是在搜索最小值时要更改的变量的一维数组,而 args 是 f 的其他(开发者_JAVA学习固定)参数。

      • x0: ndarray

      用户提供的 xopt 初始估计值,即 x 的最优值。它必须是一维值数组。

      • fprime: 可调用,fprime(x, *args),可选

      返回 f 在 x 处的梯度的函数。这里 x 和 args 与上面对 f 的说明相同。返回的值必须是一维数组。默认为 None,在这种情况下,梯度是数值近似的(参见下面的 epsilon)。

      • args: 元组,可选python

      传递给的参数值f和fprime.当需要额外的固定参数来完全指定函数时,必须提供f和fprime.

      • gtol:浮点数,可选

      当梯度的范数小于 gtol 时停止。

      • norm: 浮点数,可选

      用于梯度范数的顺序(-np.Inf 是最小值,np.Inf 是最大值)。

      • epsilon: float 或 ndarray,可选

      何时使用的步长fprime是数值近似的。可以是标量或一维数组。默认为sqrt(eps), 用 eps 表示浮点机器精度。通常sqrt(eps)约为 1.5e-8。

      • maxiter: int 可选

      要执行的最大迭代次数。默认为 200 * len(x0) 。

      • full_output: 布尔型,可选

      如果为 True,除了 xopt 之外,还返回 fopt、func_calls、grad_calls 和 warnflag。有关可选返回值的更多信息,请参阅下面的返回部分。

      • disp: 布尔型,可选

      如果为 True,则返回收敛消息,然后是 xopt。

      • retall: 布尔型,可选

      如果为 True,则将每次迭代的结果添加到返回值中。

      • callback: 可调用的,可选的

      一个可选的用户提供的函数,在每次迭代后调用。称为callback(xk),其中xk是的当前值x0.

      下面是返回值

      • xopt: ndarray

      最小化 f 的参数,即 f(xopt) == fopt 。

      • fopt: 浮点数,可选

      找到最小值,f(xopt)。仅在 full_output 为 True 时返回。

      • func_calls: int 可选

      function_calls 的数量。仅在 full_output 为 True 时返回。

      • grad_calls: int 可选

      进行的梯度调用次数。仅在 full_output 为 Trujse 时返回。

      • warnflag: int 可选

      带有警告状态的整数值,仅在 full_output 为 True 时返回。

      • 0:成功。
      • 1:超过最大迭代次数。
      • 2 梯度和/或函数调用没有改变。可能表明该精度丢失了,即例程没有收敛。
      • 3:遇到NaN 结果。
      • allvecs: ndarray 列表,可选

      数组列表,包含每次迭代的结果。只有当retall 为True 时才返回。

      下面是一个实际运行的实例

      from scipy import optimize
      args = (2, 3, 7, 8, 9, 10)
      def f(x,*args): # args是该函数需要用到的其他值
          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))  # 迭代的初始点
      res = optimize.fmin_cg(f, x0, fprime=gradf, args=args,full_output=True)
      # 直接运行的话就会出现下面的东西
      '''
      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'>
      # 第一个是代表最小化后的自变量的参数
      # 第二个是函数的最小值
      # 第三个是函数调用的次数
      # 第四个是梯度调用的次数
      # 第五个是带有警告状态的整数值,返回0表示成功
      

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜