在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基础-流程控制
Mar 18 Python
浅谈python对象数据的读写权限
Sep 12 Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
python 寻找list中最大元素对应的索引方法
Jun 28 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
python 将大文件切分为多个小文件的实例
Jan 14 Python
Django 实现图片上传和显示过程详解
Jul 18 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
flask框架配置mysql数据库操作详解
Nov 29 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
Feb 18 Python
pytorch 如何使用amp进行混合精度训练
May 24 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
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
JS前端笔试题分析
2016/12/19 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
微信小程序表单弹窗实例
2018/07/19 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
python list转dict示例分享
2014/01/28 Python
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
总结Python编程中函数的使用要点
2016/03/20 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
python处理xml文件的方法小结
2017/05/02 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
python几种常用功能实现代码实例
2019/12/25 Python
如何使用python代码操作git代码
2020/02/29 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
css3高级选择器使用方法
2013/12/02 HTML / CSS
平安工地建设方案
2014/05/06 职场文书
亚运会口号
2014/06/20 职场文书
社团活动总结报告
2014/06/27 职场文书
实习协议书范本
2014/09/25 职场文书
资料员岗位职责范本
2015/04/13 职场文书
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
Python 数据可视化之Matplotlib详解
2021/11/02 Python
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS
Android Studio 计算器开发
2022/05/20 Java/Android