在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 13 Python
python检测远程udp端口是否打开的方法
Mar 14 Python
使用Python构建Hopfield网络的教程
Apr 14 Python
python socket多线程通讯实例分析(聊天室)
Apr 06 Python
Python selenium文件上传方法汇总
Nov 19 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
Python实现使用卷积提取图片轮廓功能示例
May 12 Python
Python使用paramiko操作linux的方法讲解
Feb 25 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 Python
基于Keras的格式化输出Loss实现方式
Jun 17 Python
详解python的异常捕获
Mar 03 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
php 清除网页病毒的方法
2008/12/05 PHP
php反弹shell实现代码
2009/04/22 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
浅谈Vue.js
2017/03/02 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
10个经典的网页鼠标特效代码
2018/01/09 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
2018/08/09 jQuery
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
Python编程实战之Oracle数据库操作示例
2017/06/21 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
Python中logger日志模块详解
2020/08/04 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
Ejb技术面试题
2015/04/29 面试题
巧克力蛋糕店创业计划书
2014/01/14 职场文书
产品质量保证书
2014/04/29 职场文书
廉洁教育学习材料
2014/05/19 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书