python科学计算之scipy——optimize用法


Posted in Python onNovember 25, 2019

写在前面

SciPy的optimize模块提供了许多数值优化算法,下面对其中的一些记录。

非线性方程组求解

SciPy中对非线性方程组求解是fslove()函数,它的调用形式一般为fslove(fun, x0),fun是计算非线性方程组的误差函数,它需要一个参数x,fun依靠x来计算线性方程组的每个方程的值(或者叫误差),x0是x的一个初始值。

"""
计算非线性方程组:
  5x1+3 = 0
  4x0^2-2sin(x1x2)=0
  x1x2-1.5=0
"""
## 误差函数
def fun(x):
  x0,x1,x2 = x.tolist()
  return[5*x1+3,4x0^2-2sin(x1x2),x1x2-1.5]

result = optimize.fsolve(fun,[1,1,1])
## result
[-0.70622057  -0.6  -2.5]

在计算非线性方程中的解时,比如像坐标上升算法,其中需要用到未知数的导数,同样,scipy的fslove()也提供了fprime参数传递未知数的雅各比矩阵从而加速计算,传递的雅各比矩阵每一行时某一方程对各个未知数的导数。对于上面的例子,我们可以写下如下的雅各比矩阵传入。

def j(x):
  x0,x1,x2 = x.tolist()
  return[[0,5,0],[8*x0,-2*x2*cos(x1*x2],[0,x2,x1]]

result = optimize.fsolve(fun,[1,1,1],fprime=j)
#result
[-0.70622057  -0.6  -2.5]

scipy的内部在实现fslove时应该时应该是利用了坐标上升算法或者梯度相关优化算法,但本人没有考证,有兴趣的可以看看源码。

最小二乘拟合

关于最小二乘算法的理论这里并不想谈,网上解释的文章也挺多,在 optimize模块中,可以使用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 residual(p):
  k,b = p
  return y-(k*x+b)
r = optimize.leastsq(residual,[1,0])
k,b = r[0]
# print k
.613495349193
# print b
.79409254326
def func(x,p):
  """
    计算的正弦波 :A*sin(2*pi*k*x+theta)
  """
  A,k,theta = p
  return A*sin(2*np.pi*k*x+theta)

def redis(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,[A,k,theta])
# 加入噪声
np.random.seed(0)
y1 = y0+2*np.random.randn(len(x))
p0 = [7,0.40,0]
# p0是A,k,theta的初始值,y1,x要拟合的数据
plsq = optimize.leastsq(redis, p0,args=(y1,x))
print [A,k,theta] #真是的参数值
print plsq[0]  #拟合后的参数值

对于像正弦波或者余弦波的曲线拟合,optimize提供curve_fit()函数,它的使用方式和leastq()稍有不同,它直接计算曲线的值,比如上面的拟合正弦波可以用cureve_fit()来写。

def func2(x,p):
  """
    计算的正弦波 :A*sin(2*pi*k*x+theta)
  """
  A,k,theta = p
  return A*sin(2*np.pi*k*x+theta)
ret,_=optimize.curve_fit(func2,x,y1,p0=p0)

该函数有一个缺点就是对于初始值敏感,如果初始频率和真实频率值差太多,会导致最后无法收敛到真是频率。

局部最小值

optimize模块还提供了常用的最小值算法如:Nelder-Mead、Powell、CG、BFGS、Newton-CG等,在这些最小值计算时,往往会传入一阶导数矩阵(雅各比矩阵)或者二阶导数矩阵(黑塞矩阵)从而加速收敛,这些最优化算法往往不能保证收敛到全局最小值,大部分会收敛到局部极小值。这些函数的调用方式为:

optimize.minimize(target_fun,init_val,method,jac,hess) 
target_fun:函数的表达式计算; 
init_val:初始值; 
method:最小化的算法; 
jac:雅各比矩阵 
hess:黑塞矩阵。

全局最小值算法

全局最小值使用optimize.basinhopping()来实现,这个函数首先要定义一个误差计算方式,比如平方误差函数,niter时迭代的次数,最后还需要一个局部极小值优化方法,minimizer_kwargs传入。比如上面的正弦函数拟合:

def func1(x,p):
  """
    计算的正弦波 :A*sin(2*pi*k*x+theta)
  """
  A,k,theta = p
  return A*sin(2*np.pi*k*x+theta)
def func_error(p,y,x):
  return np.sum((y-func1(x,p)**2)
result = optimize.basinhopping(func_error,[1,1,1],niter=10,
              minimizer_kwargs={"method":"L-BFGS-B",
                        "args":(y1,x1)})
## [1,1,1]是传入的初始值,args是需要拟合的数据

以上这篇python科学计算之scipy——optimize用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
django实现分页的方法
May 26 Python
在Django中创建URLconf相关的通用视图的方法
Jul 20 Python
pandas object格式转float64格式的方法
Apr 10 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
Dec 18 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
Apr 01 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
python多线程实现同时执行两个while循环的操作
May 02 Python
python opencv角点检测连线功能的实现代码
Nov 24 Python
Python Selenium库的基本使用教程
Jan 04 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 Python
基于python中__add__函数的用法
Nov 25 #Python
pygame库实现移动底座弹球小游戏
Apr 14 #Python
python科学计算之numpy——ufunc函数用法
Nov 25 #Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
Nov 25 #Python
Python解析json代码实例解析
Nov 25 #Python
python实现差分隐私Laplace机制详解
Nov 25 #Python
python3实现弹弹球小游戏
Nov 25 #Python
You might like
PHP中的超全局变量
2006/10/09 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
极简的Python入门指引
2015/04/01 Python
深入解析Python中函数的参数与作用域
2016/03/20 Python
Python执行时间的计算方法小结
2017/03/17 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
python web框架中实现原生分页
2019/09/08 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
美德好少年事迹材料
2014/01/19 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
水电站项目建议书
2014/05/12 职场文书
导游欢迎词范文
2015/01/23 职场文书
文案策划岗位职责
2015/02/11 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
收入证明申请书
2015/06/12 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
Android Rxjava3 使用场景详解
2022/04/07 Java/Android
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android