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 相关文章推荐
详细探究Python中的字典容器
Apr 14 Python
Python实现简单的代理服务器
Jul 25 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
Oct 20 Python
Python基于socket模块实现UDP通信功能示例
Apr 10 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
Python pip install如何修改默认下载路径
Apr 29 Python
如何理解Python中包的引入
May 29 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
pytorch交叉熵损失函数的weight参数的使用
May 24 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
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
php在服务器执行exec命令失败的解决方法
2012/03/03 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
PHP的pcntl多进程用法实例
2015/03/19 PHP
简单实现php上传文件功能
2017/09/21 PHP
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
python处理中文编码和判断编码示例
2014/02/26 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
Python 实现自动导入缺失的库
2019/10/29 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
小学五年级学生评语
2014/04/22 职场文书
工作评语大全
2014/04/26 职场文书
计算机网络专业求职信
2014/06/05 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
党建目标管理责任书
2014/07/25 职场文书
地雷战观后感
2015/06/09 职场文书
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL