在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 24 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
基于python的七种经典排序算法(推荐)
Dec 08 Python
对Tensorflow中权值和feature map的可视化详解
Jun 14 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
Django JWT Token RestfulAPI用户认证详解
Jan 23 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
基于python的Paxos算法实现
Jul 03 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
Python datetime 如何处理时区信息
Sep 02 Python
python基础入门之普通操作与函数(三)
Jun 13 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
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
php英文单词统计器
2016/06/23 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
js倒计时抢购实例
2015/12/20 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
详解C++编程中一元运算符的重载
2016/01/19 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
python rsa 加密解密
2017/03/20 Python
python中模块的__all__属性详解
2017/10/26 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
详解Python是如何实现issubclass的
2019/07/24 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
美国五金商店:Ace Hardware
2018/03/27 全球购物
财务管理职业生涯规划书
2014/02/26 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
教学反思怎么写
2016/02/24 职场文书
python用字节处理文件实例讲解
2021/04/13 Python
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python