Python中scipy.optimize求解有无约束的最优化算法举例(附代码)

目录

算法需要输入的参数

算法输出的优化结果

优化算法应用举例

优化算法举例代码 

优化算法输出结果 

其他优化问题举例


最优化求解问题标准格式如下: 

标准形式如下:
目标函数:minimize f(x) ……

约束条件subject to:
g_i(x) >= 0,  i = 1,...,m

h_j(x)  = 0,  j = 1,...,p

Python中scipy库有很多包,其中一个就是scipy.optimize.minimize求解有无约束的最小化问题。

原文请参考:scipy.optimize.minimizehttps://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize

Python中scipy.optimize.minimize具体参数如下:

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None,             
                         hessp=None, bounds=None, constraints=(), tol=None, 
                         callback=None, options=None)[source]

算法需要输入的参数:

  • fun:可调用的目标函数;
  • x0:函数的初始解,是N 维数组对象ndarray;
  • args:可选,传递给目标函数和其偏导的额外参数,如(雅可比矩阵、海塞矩阵),是元组;
  • method : 可选,求解问题的方法,应该是如下表格中的其中一个。如果不指定,根据约束条件和取值范围默认选择BFGS, L-BFGS-B, SLSQP方法;
  • 最优化求解方法
    求解方法 解释
    Nelder-Mead 求解非线性、导函数未知的最值问题
    Powell 鲍威尔共轭方向法
    CG 共轭梯度法
    BFGS 变尺度法、拟牛顿方向法
    Newton-CG 牛顿-共轭方向法
    L-BFGS-B 改进的BFGS法
    TNC 截断牛顿法
    COBYLA 线性逼近法
    SLSQP 序列最小二乘法
    dogleg 信赖域算法(狗腿法)
    trust-ncg 信赖域的牛顿共轭梯度法
  • jac:可选目标函数的雅可比矩阵(目标函数的一阶偏导)。这些方法会用到: CG, BFGS, Newton-CG, L-BFGS-B, TNC, SLSQP, dogleg, trust-ncg;
  • hess, hessp : 可选,海塞矩阵(目标函数的二阶偏导),这些方法会用到Newton-CG, dogleg, trust-ncg;
  • bounds:可选,变量约束,这些方法会用到:L-BFGS-B, TNC and SLSQP
  • constraints:可选,约束条件,字典或序列类型,每个约束有以下三个关键字:
  • type : str
    Constraint type: '='号约束:'eq' ,'>='号约束:'ineq'.
    COBYLA算法仅支持ineq
    
    fun : callable
    定义条件的函数
    
    jac : callable, optional
    约束条件的梯度函数(only for SLSQP).
    
    args : sequence, optional
    传递给目标函数或雅可比矩阵的额外的参数
  • tol : 可选,float型,终止条件的忍耐度,可以理解为精度。
  • options :可选,字典类型,算法的其他选项。具体如下:
  • maxiter : int
    算法的最大迭代次数
    
    disp : bool
    disp=True时打印收敛信息

    算法输出的优化结果:

  • res : OptimizeResult
  • 具体信息如下:(看下后面的代码例子会懂)
    x the solution array, success a Boolean flag indicating if the optimizer 
    exited successfully and message which describes the cause of the termination. 

    优化算法应用举例:

    最小化问题,含有等式目标约束:

    优化算法举例代码: 

    import numpy as np
    from scipy.optimize import minimize
    
    # 定义目标函数
    def func(x, sign=1.0):
        # scipy.minimize默认求最小,求max时只需要sign*(-1),跟下面的args对应
        return sign * (x[0] ** 2 + x[1] ** 2 + x[2] ** 2)
        # return sign * (np.power(x[0], 2) + np.power(x[1], 2) + np.power(x[2], 2))
    
    # 定义目标函数的梯度
    def func_deriv(x, sign=1):
        jac_x0 = sign * (2 * x[0])
        jac_x1 = sign * (2 * x[1])
        jac_x2 = sign * (2 * x[2])
        return np.array([jac_x0, jac_x1, jac_x2])
    
    # 定义约束条件
    # constraints are defined as a sequence of dictionaries, with keys type, fun and jac.
    cons = (
        {'type': 'eq',
         'fun': lambda x: np.array([x[0] + 2 * x[1] - x[2] - 4]),
         'jac': lambda x: np.array([1, 2, -1])},
    
        {'type': 'eq',
         'fun': lambda x: np.array([x[0] - x[1] - x[2] + 2]),
         'jac': lambda x: np.array([1, -1, -1])}
        )
    
    # 定义初始解x0
    x0 = np.array([-1.0, 1.0, 1.0])
    
    # 使用SLSQP算法求解
    res = minimize(func, x0 , args=(1,), jac=func_deriv, method='SLSQP', options={'disp': True},constraints=cons)
    # args是传递给目标函数和偏导的参数,此例中为1,求min问题。args=-1时是求解max问题
    print(res.x) 

    优化算法输出结果: 

    Optimization terminated successfully.    (Exit mode 0)
                Current function value: 4.000000000000002
                Iterations: 2
                Function evaluations: 2
                Gradient evaluations: 2
    [-2.22044605e-16  2.00000000e+00 -6.66133815e-16]

    即函数输出最优值为:4.00,最优解为[0,2,0]。

    其他优化问题举例

    Optimization (scipy.optimize)https://docs.scipy.org/doc/scipy-0.18.1/reference/tutorial/optimize.html#constrained-minimization-of-multivariate-scalar-functions-minimize

    来源:蝴蝶飞努力追

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python中scipy.optimize求解有无约束的最优化算法举例(附代码)

    发表评论