在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 sort、sorted高级排序技巧
Nov 21 Python
python使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
Python Pexpect库的简单使用方法
Jan 29 Python
大家都说好用的Python命令行库click的使用
Nov 07 Python
python实现密度聚类(模板代码+sklearn代码)
Apr 27 Python
TensorFlow保存TensorBoard图像操作
Jun 23 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中养成7个面向对象的好习惯
2010/01/28 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
onkeydown事件解决按回车键直接提交数据的需求
2013/04/11 Javascript
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
2017/01/09 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
python实现数组插入新元素的方法
2015/05/22 Python
python实现简单ftp客户端的方法
2015/06/28 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
毕业生求职信
2014/06/10 职场文书
会计学毕业生求职信
2014/06/25 职场文书
巾帼志愿者活动方案
2014/08/17 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
节约用电通知
2015/04/25 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
vue使用watch监听属性变化
2022/04/30 Vue.js
Go语言怎么使用变长参数函数
2022/07/15 Golang