python scipy.optimize 非线性规划 求解局部最优和全局最优
1. 非线性规划 求解局部最优
首先展示一个最简单的示例:
from scipy.optimize import minimizedef fun_convex(x):return (x - 1) ** 2 + 3minimize(fun=fun_convex, x0=0, bounds=[(-10,10)])
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: 变量的初始猜测值,如果有多个变量,需要给每个变量一个初始猜测值
args: 常数值,fun中的可变常量
method: 求极值的方法,官方文档给了很多种。一般使用默认
constraints: 约束条件,针对fun中为参数的部分进行约束限制
scipy.optimize.minimizel 官方说明文档
通过scipy.optimize.minimize
,我们可以很轻松的求解凸函数的局部最优的数值解,这里有几个注意点:
①求解函数为非凸函数时,所求结果为局部最优
②求解函数为凸函数时,所求结果为最小值
③所求皆为数值解而不是理论解
下面展示一个非凸函数的示例:
from scipy.optimize import minimizedef fun_nonconvex(x): if x<0:return ( x + 2 ) ** 2 + 1else:return ( x - 2 ) ** 2 + 2minimize(fun=fun_nonconvex, x0=0, bounds=[(-10,10)])
我们可以发现,所求的x=2
并非为全局最优解(应该是x=-2
)而是局部最优解,所求结果与设置的初值x0有很大关系。
2. 求解全局最优
通过以上内容我们可以发现,scipy.optimize.minimize
只能求解局部最优解,那么我们该如何求解全局最优呢?本文介绍scipy.optimize的3种方法:
brute()
:网格搜索优化,属于暴力全局优化。 brute官方说明文档
differential_evolution()
:差分进化本质上是随机的(不使用梯度方法)来寻找最小值,并且可以搜索大面积的候选空间,但通常需要比传统的基于梯度的技术更多的函数评估。 differential_evolution官方说明文档
basinhopping()
:Basin-hopping 是一种two-phase 方法,它将全局步进算法与每一步的局部最小相结合,会在每次随机跳跃后使用局部松弛,旨在模拟原子簇能量最小化的自然过程。 basinhopping官方说明文档
使用蛮力的brute()
就不深入探讨,接下来给出differential_evolution()
和basinhopping()
的简单例程:
from scipy.optimize import differential_evolution, basinhoppingdef fun_nonconvex(x): if x<0:return ( x + 2 ) ** 2 + 1else:return ( x - 2 ) ** 2 + 2res_differential_evolution = differential_evolution(func=fun_nonconvex, bounds=[(-10,10)])
print('differential_evolution()的结果为:\n', res_differential_evolution)res_basinhopping = basinhopping(func=fun_nonconvex, x0=0, niter=1000)
print('\n basinhopping()的结果为:\n', res_basinhopping)
这两种方法均可以求得全局最优解:
python scipy.optimize 非线性规划 求解局部最优和全局最优相关推荐
- 使用python scipy.optimize linprog和lingo线性规划求解最大值,最小值(运筹学学习笔记)
1. 线性模型 2. 使用python scipy.optimize linprog求解模型最优解: 在这里我们用到scipy中的linprog进行求解,linprog的用法见https://docs ...
- python scipy.optimize.minimize多变量多参数优化
python scipy.optimize.minimize多变量多参数优化 x是一维变量,无超参数 x是二维变量,无超参数,带bounds x是二维变量,有一个超参数,带bounds x是二维变量, ...
- 面试题:说下局部最优和全局最优的区别
更多面试题关注"机器学习算法面试"有劳动下手指啦 问题背景 在优化的世界里,总避免不了的接触全局最优和局部最优的概念,那么这两者的区别是什么呢? 问题解答 全局最优:针对一定条件/ ...
- 利用scipy.optimize.minimize()求解有约束、非线性规划问题
''' scipy.optimize.minimize(目标函数obj,初始点,constraints=cons,bounds=bd)此函数有很多参数,这里介绍主要参数 obj:目标函数,最小值形式, ...
- python scipy.optimize least_squares实现最小二乘法
Least-squares minimization (least_squares) The code below implements least-squares estimation of and ...
- python 曲线拟合(numpy.polyfit、scipy.optimize.curve_fit)
小白的学习笔记,欢迎各位大神批评指正. python 曲线拟合 (一次二次比较简单,直接使用numpy中的函数即可,来自 <https://blog.csdn.net/yefengzhichen ...
- 全局最优和局部最优 世俗理解以及原理解释
引言 今天逛知乎看到这样一个问题和回答,让我瞬间理解局部最优和全局最优 在诸如算法导论等书是这样解释的:全局最优是在全局选取一个最佳值,而局部最优是在某一部分选取一个最佳值.每一部分都选取最佳值(即局 ...
- [机缘参悟-99] :关于局部最优与全局最优解的人生感悟
在没有获取全局信息之前,要获得全局最优解几乎是不可能的,最多是概率大一点而已,大多数时候,由于时空资源的限制,获得往往是局部最优解,局部最优解,放在全局,往往并非全局最优,甚至可能是错误解,错误率的大 ...
- python解非线性规划问题讲析_python中线性规划中的单纯形法、scipy库与非线性规划求解问题...
单纯形法.scipy库与非线性规划求解问题 单纯形法的基本定义 大M法求解线性规划的原理 excel求解 Python调用optimize包和scipy求解线性规划 Python编程实现单纯形法 对比 ...
最新文章
- DOM中的onbeforeunload函数
- Java操作XML文件 dom4j 篇【转】
- MySQL命令行导出数据库
- android wear 同步应用,Android Wear发布 突出语音及同步功能
- 在虚拟机中安装Windows XP
- apollo学习之:如何测试canbus模块
- MAX30102 模拟IIC读取程序(C语言)
- LabVIEW的VISA函数串口数据采集例子——温度采集系统
- 计算机主机名与用户名区别
- 浅析游戏音乐的风格特点—欧美风
- Android studio突然报错Entry name ‘META-INF/androidx.vectordrawable_vectordrawable.version‘ collided的解决办法
- Unity 性能优化基础
- 兼容并“包”NLP评价指标:Robustness Gym框架
- Fibonacci数列通项公式推导
- 农行计算机类笔试好过吗,2020中国农业银行招聘笔试要多少分才能进入面试?...
- 自动化软件测试 - 利用短信转发器结合Selenium读取短信验证码
- 回归预测 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络多输入单输出回归预测
- 在linux中删除多级目录,如何使用一个Linux命令删除多个子目录 | MOS86
- android中打开查看pdf文件可用mupdf
- uniapp 拦截器-未登录跳转到登陆页面