一、背景:
现在项目上有一个用python 实现非线性规划的需求。非线性规划可以简单分两种,目标函数为凸函数 or 非凸函数。
凸函数的 非线性规划,比如fun=x^2+y^2+x*y,有很多常用的python库来完成,网上也有很多资料,比如CVXPY
非凸函数的 非线性规划(求极值),从处理方法来说,可以尝试以下几种:
1.纯数学方法,求导求极值;
2.使用神经网络,深度学习来处理,可参考反向传播算法中链式求导的过程;
3.寻找一些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)
解释:
fun: 求最小值的目标函数
x0:变量的初始猜测值,如果有多个变量,需要给每个变量一个初始猜测值。minimize是局部最优的解法,所以
args:常数值,后面demo会讲解,fun中没有数字,都以变量的形式表示,对于常数项,需要在这里给值
method:求极值的方法,官方文档给了很多种。一般使用默认。每种方法我理解是计算误差,反向传播的方式不同而已,这块有很大理论研究空间
constraints:约束条件,针对fun中为参数的部分进行约束限制
三、demo
1.计算 1/x+x 的最小值
# coding=utf-8
from scipy.optimize import minimize
import numpy as np
#demo 1
#计算 1/x+x 的最小值
def fun(args):
a=args
v=lambda x:a/x[0]