在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 相关文章推荐
Linux下使用python自动修改本机网关代码分享
May 21 Python
使用Python对Access读写操作
Mar 30 Python
python 将数据保存为excel的xls格式(实例讲解)
May 03 Python
Python 支付整合开发包的实现
Jan 23 Python
python地震数据可视化详解
Jun 18 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
Feb 07 Python
python使用pymongo与MongoDB基本交互操作示例
Apr 09 Python
如何教少儿学习Python编程
Jul 10 Python
Python私有属性私有方法应用实例解析
Sep 15 Python
基于Python爬取股票数据过程详解
Oct 21 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 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 用sock技术发送邮件的函数
2007/07/21 PHP
php 中文和编码判断代码
2010/05/16 PHP
php 模拟POST|GET操作实现代码
2010/07/20 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
js利用div背景,做一个竖线的效果。
2008/11/22 Javascript
HTML node相关的一些资料整理
2010/01/01 Javascript
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
js注意img图片的onerror事件的分析
2011/01/01 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
python 对象和json互相转换方法
2018/03/22 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
对python的文件内注释 help注释方法
2018/05/23 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
对python函数签名的方法详解
2019/01/22 Python
python3安装crypto出错及解决方法
2019/07/30 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
利用python生成照片墙的示例代码
2020/04/09 Python
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
司机岗位职责
2013/11/15 职场文书
初中化学教学反思
2014/01/23 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
2014年计生协会工作总结
2014/11/21 职场文书
MySQL分库分表与分区的入门指南
2021/04/22 MySQL