在python中利用最小二乘拟合二次抛物线函数的方法


Posted in Python onDecember 29, 2018

1、最小二乘也可以拟合二次函数

我们都知道用最小二乘拟合线性函数没有问题,那么能不能拟合二次函数甚至更高次的函数呢?答案当然是可以的。下面我们就来试试用最小二乘来拟合抛物线形状的的图像。

对于二次函数来说,一般形状为 f(x) = a*x*x+b*x+c,其中a,b,c为三个我们需要求解的参数。为了确定a、b、c,我们需要根据给定的样本,然后通过调整这些参数,知道最后找出一组参数a、b、c,使这些所有的样本点距离f(x)的距离平方和最小。用什么方法来调整这些参数呢?最常见的自然就是我们的梯度下降喽。

spicy库中有名为leastsq的方法,只需要输入一系列样本点,给出待求函数的基本形状,就可以针对上述问题求解了。

2、抛物线拟合源码

#!/usr/bin/env python
# coding:utf-8


import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsq


# 待拟合的数据
X = np.array([1,2,3,4,5,6])
Y=np.array([9.1,18.3,32,47,69.5,94.8])


# 二次函数的标准形式
def func(params, x):
 a, b, c = params
 return a * x * x + b * x + c


# 误差函数,即拟合曲线所求的值与实际值的差
def error(params, x, y):
 return func(params, x) - y


# 对参数求解
def slovePara():
 p0 = [10, 10, 10]

 Para = leastsq(error, p0, args=(X, Y))
 return Para


# 输出最后的结果
def solution():
 Para = slovePara()
 a, b, c = Para[0]
 print "a=",a," b=",b," c=",c
 print "cost:" + str(Para[1])
 print "求解的曲线是:"
 print("y="+str(round(a,2))+"x*x+"+str(round(b,2))+"x+"+str(c))

 plt.figure(figsize=(8,6))
 plt.scatter(X, Y, color="green", label="sample data", linewidth=2)

 # 画拟合直线
 x=np.linspace(0,12,100) ##在0-15直接画100个连续点
 y=a*x*x+b*x+c ##函数式
 plt.plot(x,y,color="red",label="solution line",linewidth=2)
 plt.legend() #绘制图例
 plt.show()


solution()

上面的代码中,稍微注意的是如下几点:

1.func是待拟合的曲线的形状。本例中为二次函数的标准形式。

2.error为误差函数。很多同学会问不应该是最小平方和吗?为什么不是func(params, x) - y * func(params, x) - y?原因是名为lasts的方法中帮我们做了。看一下sklearn中源码的注释就知道什么情况了:

Minimize the sum of squares of a set of equations.
 x = arg min(sum(func(y)**2,axis=0))
   y

二次方的操作在源码中帮我们实现了。

3.p0里放的是a、b、c的初始值,这个值可以随意指定。往后随着迭代次数增加,a、b、c将会不断变化,使得error函数的值越来越小。

4.leastsq的返回值是一个tuple,它里面有两个元素,第一个元素是a、b、c的求解结果,第二个则为cost function的大小!

3.程序的最终结果与拟合曲线

程序最终的输出结果:

a= 2.06607141425 b= 2.5975001036 c= 4.68999985496
cost:1
求解的曲线是:
y=2.07x*x+2.6x+4.68999985496

最终的拟合曲线:

在python中利用最小二乘拟合二次抛物线函数的方法

4、模拟其他曲线

leastsq函数除了可以模拟线性函数二次函数等多项式,还适用于任何波形的模拟。

比如方波:

def square_wave(x,p):
 a, b, c, T = p
 y = np.where(np.mod(x-b,T)<T/2, 1+c/a, 0)
 y = np.where(np.mod(x-b,T)>T/2, -1+c/a, y)
 return a*y

比如高斯分布:

def gaussian_wave(x,p):
 a, b, c, d= p
 return a*np.exp(-(x-b)**2/(2*c**2))+d

只要将上面代码中的func换成对应的函数即可!

以上这篇在python中利用最小二乘拟合二次抛物线函数的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python下的Mysql模块MySQLdb安装详解
Apr 09 Python
Python生成pdf文件的方法
Aug 04 Python
Python中return self的用法详解
Jul 27 Python
详解Python 装饰器执行顺序迷思
Aug 08 Python
python实现归并排序算法
Nov 22 Python
python几种常用功能实现代码实例
Dec 25 Python
Python函数生成器原理及使用详解
Mar 12 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
Jun 23 Python
安装Anaconda3及使用Jupyter的方法
Oct 27 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
Python学习之异常中的finally使用详解
Mar 16 Python
对python指数、幂数拟合curve_fit详解
Dec 29 #Python
对python实现二维函数高次拟合的示例详解
Dec 29 #Python
pip安装py_zipkin时提示的SSL问题对应
Dec 29 #Python
Python 做曲线拟合和求积分的方法
Dec 29 #Python
python 画三维图像 曲面图和散点图的示例
Dec 29 #Python
python实现三维拟合的方法
Dec 29 #Python
Django数据库连接丢失问题的解决方法
Dec 29 #Python
You might like
php设计模式 Factory(工厂模式)
2011/06/26 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
Tab切换组件(选项卡功能)实例代码
2013/11/21 Javascript
易操作的jQuery表单提示插件
2015/12/01 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
python根据路径导入模块的方法
2014/09/30 Python
python 实时遍历日志文件
2016/04/12 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
python做量化投资系列之比特币初始配置
2018/01/23 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
Python configparser模块操作代码实例
2020/06/08 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
纯CSS3制作页面切换效果的实例代码
2019/05/30 HTML / CSS
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
大一新生军训时的自我评价分享
2013/12/05 职场文书
大学毕业后的十年规划
2014/01/07 职场文书
企业后勤岗位职责
2014/02/28 职场文书
学生个人总结范文
2015/02/15 职场文书
学校捐书倡议书
2015/04/27 职场文书
在校生证明
2015/06/17 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL
k-means & DBSCAN 总结
2021/04/27 Python
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript