在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写的一个文本编辑器
Jan 23 Python
Python简单计算文件夹大小的方法
Jul 14 Python
用Pygal绘制直方图代码示例
Dec 07 Python
对Python 2.7 pandas 中的read_excel详解
May 04 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
Apr 07 Python
python的Jenkins接口调用方式
May 12 Python
keras的三种模型实现与区别说明
Jul 03 Python
Python同时迭代多个序列的方法
Jul 28 Python
Python txt文件如何转换成字典
Nov 03 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 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代码运行时间查看类代码分享
2011/08/06 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
PHP的几个常用加密函数
2016/02/03 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
密码强度检测效果实现原理与代码
2013/01/04 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
AngularJS使用ng-repeat指令实现下拉框
2016/08/23 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
Python重新引入被覆盖的自带function
2014/07/16 Python
python轻松实现代码编码格式转换
2015/03/26 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
Python tcp传输代码实例解析
2020/03/18 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
2020/11/02 Python
小学教师学期末自我评价
2013/09/25 职场文书
药剂学专业应届生自荐信
2013/09/29 职场文书
运动会入场解说词
2014/02/07 职场文书
宾馆总经理岗位职责
2014/02/14 职场文书
企业办公室岗位职责
2014/03/12 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
2015年招聘工作总结
2014/12/12 职场文书
实习生个人总结范文
2015/02/28 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers