在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简单删除目录下文件以及文件夹的方法
May 27 Python
python中OrderedDict的使用方法详解
May 05 Python
Flask框架web开发之零基础入门
Dec 10 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
python实现字符串完美拆分split()的方法
Jul 16 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
python 生成器和迭代器的原理解析
Oct 12 Python
python计算n的阶乘的方法代码
Oct 25 Python
python小程序基于Jupyter实现天气查询的方法
Mar 27 Python
计算Python Numpy向量之间的欧氏距离实例
May 22 Python
python中os包的用法
Jun 01 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 db类库进行数据库操作
2009/03/19 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
使用php+swoole对client数据实时更新(一)
2016/01/07 PHP
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
Python IDLE清空窗口的实例
2018/06/25 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
python getpass模块用法及实例详解
2019/10/07 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
悦木之源美国官网:Origins美国
2016/08/01 全球购物
工程概预算专业毕业生求职信
2013/10/04 职场文书
机关门卫岗位职责
2013/12/30 职场文书
岳父生日宴会答谢词
2014/01/13 职场文书
给儿子的表扬信
2014/01/15 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
医院节能减排方案
2014/06/13 职场文书
宣传口号大全
2014/06/16 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
Python使用openpyxl批量处理数据
2021/06/23 Python
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android