在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实现下载网易云音乐的高清MV
Mar 16 Python
分析在Python中何种情况下需要使用断言
Apr 01 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
python安装模块如何通过setup.py安装(超简单)
May 05 Python
Numpy 改变数组维度的几种方法小结
Aug 02 Python
python操作文件的参数整理
Jun 11 Python
如何安装并使用conda指令管理python环境
Jul 10 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
python中的random模块和相关函数详解
Apr 22 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 mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
异步加载script的代码
2011/01/12 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
vue element-ui中table合计指定列求和实例
2020/11/02 Javascript
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
利用python GDAL库读写geotiff格式的遥感影像方法
2018/11/29 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
军人违纪检讨书
2014/02/04 职场文书
交通安全寄语大全
2014/04/08 职场文书
高中课程设置方案
2014/05/28 职场文书
小学见习报告
2014/10/31 职场文书
欠款起诉书范文
2015/05/19 职场文书
中学教代会开幕词
2016/03/04 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python