在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写的贪吃蛇游戏例子
Jun 16 Python
Python 获取新浪微博的最新公共微博实例分享
Jul 03 Python
Django实现表单验证
Sep 08 Python
Python 转换文本编码实现解析
Aug 27 Python
python区分不同数据类型的方法
Oct 14 Python
Python如何使用函数做字典的值
Nov 30 Python
python解释器pycharm安装及环境变量配置教程图文详解
Feb 26 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
Python文件的操作示例的详细讲解
Apr 08 Python
教你怎么用Python生成九宫格照片
May 20 Python
python tqdm用法及实例详解
Jun 16 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调用Twitter的RSS的实现代码
2010/03/10 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
JavaScript 私有成员分析
2009/01/13 Javascript
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
Javascript的匿名函数小结
2009/12/31 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
分享15个最受欢迎的Python开源框架
2014/07/13 Python
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
Python实现登录接口的示例代码
2017/07/21 Python
利用Python查看目录中的文件示例详解
2017/08/28 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
Python实现的建造者模式示例
2018/08/06 Python
Python3远程监控程序的实现方法
2019/07/15 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
局域网标准
2016/09/10 面试题
百度JavaScript笔试题
2015/01/15 面试题
应届生护士求职信
2013/11/01 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
竞选学委演讲稿
2014/09/13 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python