在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 冒泡,选择,插入排序使用实例
Feb 05 Python
python实现DES加密解密方法实例详解
Jun 30 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
python中模块查找的原理与方法详解
Aug 11 Python
浅谈Pandas中map, applymap and apply的区别
Apr 10 Python
基于python OpenCV实现动态人脸检测
May 25 Python
解决python报错MemoryError的问题
Jun 26 Python
Python3中编码与解码之Unicode与bytes的讲解
Feb 28 Python
python实现翻译word表格小程序
Feb 27 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
python 实现分组求和与分组累加求和代码
May 18 Python
python 进阶学习之python装饰器小结
Sep 04 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
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
2011/03/25 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
vue实现扫码功能
2020/01/17 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
Python实现购物车程序
2018/04/16 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
出国留学自荐信
2013/10/25 职场文书
招商专员岗位职责
2014/02/08 职场文书
出国留学担保书
2014/05/20 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
应届大专生自荐书
2014/06/16 职场文书
植树节口号
2014/06/21 职场文书
活动总结新闻稿
2014/08/30 职场文书
在校学生证明格式
2015/06/24 职场文书
学习党章心得体会2016
2016/01/15 职场文书
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS