python拟合函数_Python-最小二乘法曲线拟合

行文思路:最小二乘法原理介绍

利用 leastsq() 函数进行最小二乘法拟合

拟合注意事项

利用curve_fit 进行最小二乘法拟合

总结:

参考文献

实现代码

一,最小二乘法拟合

最小二乘法是一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。优化是找到最小值或等式的数值解的问题。而线性回归就是要求样本回归函数尽可能好地拟合目标函数值,也就是说,这条直线应该尽可能的处于样本数据的中心位置。因此,选择最佳拟合曲线的标准可以确定为:使总的拟合误差(即总残差)达到最小。

假设有一组实验数据(xi,yi ), 事先知道它们之间应该满足某函数关系yi=f(xi),通过这些已知信息,需要确定函数f的一些参数。例如,如果函数f是线性函数f(x)=kx+b, 那么参数 k和b就是需要确定的值。

如果用p表示函数中需要确定的参数,那么目标就是找到一组p,使得下面的函数S的值最小:

equation?tex=S%28p%29%3D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%7B%28y_i-f%28x_i%2Cp%29%29%5E2+%7D

当误差最小的时候可以理解为此时的系数为最佳的拟合状态。

scipy.optimization 子模块提供了函数最小值(标量或多维)、曲线拟合和寻找等式的根的有用算法。在optimize模块中可以使用 leastsq() 对数据进行最小二乘拟合计算。leastsq() 函数传入误差计算函数和初始值,该初始值将作为误差计算函数的第一个参数传入。计算的结果是一个包含两个元素的元组,第一个元素是一个数组,表示拟合后的参数;第二个元素如果等于1、2、3、4中的其中一个整数,则拟合成功,否则将会返回 mesg。下面是官方的文档介绍,只截取了主要的参数部分。

代码实现:

1,导入模块:

import numpy as np

import matplotlib.pyplot as plt

from scipy.optimize import leastsq

2,一元二次方程的参数拟合,首先创建拟合数据。

x = np.linspace(-10,10,100) # 创建时间序列

p_value = [-2,5,10] # 原始数据的参数

noise = np.random.randn(len(x)) # 创建随机噪声

y = Fun(p_value,x)+noise*2 # 加上噪声的序列

3,通过函数定义拟合函数的形式。

这里可以拟合任意的函数形式,这要能把它的表达式给出。

def Fun(p,x): # 定义拟合函数形式

a1,a2,a3 = p

return a1*x**2+a2*x+a3

4,定义残差项。

一般最小二乘法是求拟合函数和目标函数差的平方,这里之所以没有平方是应为在拟合函数的内部进行,这里不显式的表示。

def error (p,x,y): # 拟合残差

return Fun(p,x)-y

5, 进行拟合。

其中参数p0 为最小二乘法拟合的初值,初值的选取对于拟合时间和计算量影响很大,有事并对结果产生一定的影响。args() 中是除了初始值之外error() 中的所有参数的集合输入。

para =leastsq(error, p0, args=(x,y)) # 进行拟合

y_fitted = Fun (para[0],x) # 画出拟合后的曲线

返回参数为一个包含拟合后参数的元组,可以通过中括号[] 取值的方式得到。

6,完整的代码如下:

import numpy as np

import matplotlib.pyplot as plt

from scipy.optimize import leastsq

def Fun(p,x): # 定义拟合函数形式

a1,a2,a3 = p

return a1*x**2+a2*x+a3

def error (p,x,y): # 拟合残差

return Fun(p,x)-y

def main():

x = np.linspace(-10,10,100) # 创建时间序列

p_value = [-2,5,10] # 原始数据的参数

noise = np.random.randn(len(x)) # 创建随机噪声

y = Fun(p_value,x)+noise*2 # 加上噪声的序列

p0 = [0.1,-0.01,100] # 拟合的初始参数设置

para =leastsq(error, p0, args=(x,y)) # 进行拟合

y_fitted = Fun (para[0],x) # 画出拟合后的曲线

plt.figure

plt.plot(x,y,'r', label = 'Original curve')

plt.plot(x,y_fitted,'-b', label ='Fitted curve')

plt.legend()

plt.show()

print (para[0])

if __name__=='__main__':

main()

最终拟合的参数结果:

[-1.99437662 5.03789895 10.00150115]

二, 使用curve_fit() 进行拟合

Note:使用 curve_fit(),主要的区别在于拟合函数的定义不同

def Fun(x, a1,a2,a3): # 定义拟合函数形式

return a1*x**2+a2*x+a3

完整的代码:

import numpy as np

import matplotlib.pyplot as plt

from scipy.optimize import curve_fit

def Fun(x,a1,a2,a3): # 定义拟合函数形式

return a1*x**2+a2*x+a3

def error (p,x,y): # 拟合残差

return Fun(p,x)-y

def main():

x = np.linspace(-10,10,100) # 创建时间序列

a1,a2,a3 = [-2,5,10] # 原始数据的参数

noise = np.random.randn(len(x)) # 创建随机噪声

y = Fun(x,a1,a2,a3)+noise*2 # 加上噪声的序列

para,pcov=curve_fit(Fun,x,y)

y_fitted = Fun(x,para[0],para[1],para[2]) # 画出拟合后的曲线

plt.figure

plt.plot(x,y,'r', label = 'Original curve')

plt.plot(x,y_fitted,'-b', label ='Fitted curve')

plt.legend()

plt.show()

print (para)

if __name__=='__main__':

main()

拟合结果

最终的拟合结果参数为:

[-2.00309373 5.00945061 10.30565526]

三, 多项式拟合

代码实现:

def main():

x = np.linspace(-10,10,100) # 创建时间序列

a1,a2,a3 = [-2,5,10] # 原始数据的参数

noise = np.random.randn(len(x)) # 创建随机噪声

y = Fun(x,a1,a2,a3)+noise*2 # 加上噪声的序列

plt.plot(x,y)

para=np.polyfit(x, y, deg = 2)

y_fitted = Fun(x,para[0],para[1],para[2])

plt.figure

plt.plot(x,y,'ro', label = 'Original curve')

plt.plot(x,y_fitted,'-b', label ='Fitted curve')

plt.legend()

plt.show()

print(para)

if __name__=='__main__':

main()

拟合结果为:

[-2.00532192 5.01626878 10.07612899]

总结:

本文主要讲了最小二乘法拟合曲线的实现方法,使用 leastsq() 和 curve_fit(),最后讲解了多项式的拟合poly.fit(). 最小二乘法的两个拟合大体的步骤是一样的,定义拟合范式,传入拟合参数,开始拟合得出拟合结果。对于简单的拟合函数两者的差别很小,但是复杂的,需要具体的分析。文章还会继续的分析拟合结果的含义,让我们对拟合的结果有更加透彻的理解,随心拟合。

参考文献:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络提高网络安全意识,提升网络安全意识 共创清朗网络环境

为增强公众网络安全意识,提高网络安全防护技能。近期,徐家营街道围绕“网络安全为人民、网络安全靠人民”活动主题,组织开展了“2020国家网络安全宣传周”活动,保障用户合法权益,维护国家网络安全。一、广泛宣传引导。…

base cap 分布式_干货分享:基于本地消息表的分布式事务解决方案总结

前段时间学习了分布式事务的几种方案,下面主要总结下基于本地消息表实现可靠消息最终一致性的分布式事务方案。1,什么是分布式事务?在传统架构中往往是一个单体架构,一个系统就对应一个war包,然后这个系统也只有一个数…

google protobuf_protobuf 指南

简介安装语言定义特殊指令定义服务JSON 支持选项生成代码基础类型更新 messageGolang 下使用参考简介Protocol Buffers 是 google 出品的一种数据交换格式, 缩写为 protobuf.主要介绍 proto3 版本和 Golang 下的使用.安装protobuf 分为编译器和运行时两部分. 编译器直接使用预编…

计算机无法装补丁,电脑无法安装kb4012212补丁如何处理|电脑无法安装kb4012212补丁的处理方法...

最近,不少用户的电脑都被《永恒之蓝》病毒侵袭,因此微软官方推出了预防补丁 — kb4012212,正常系统只要安装该补丁就能避免电脑遭到伤害。不过,有用户反馈自己遇到了电脑无法安装kb4012212补丁的情况,该怎么办呢&#…

mysql在哪里写代码_[译] 如何写好 Go 代码

原文:https://scene-si.org/2018/07/24/writing-great-go-code/我写了多年的 Go 微服务,并在写完两本关于 (API Foundations in Go 和 12 Factor Applications with Docker and Go) 主题的书之后,有了一些关于如何写好 Go 代码的想法但首先&a…

学画画软件app推荐_路由器管理软件哪个好?6款路由器管理APP推荐_软件评测

无限网络应用越来越广泛,由此应运而生了许多可以蹭网的软件,家里的网速突然变慢了,也许就是隔壁的小哥哥小姐姐在蹭网络,那么如何避免被蹭网?今天小编给各位小伙伴推荐几款路由器管理软件,发现网络变慢了&a…

各个图标的意思_冬奥体育图标设计团队负责人林存真:每一个图标要画100稿以上...

林存真中央美术学院设计学院副院长、北京冬奥组委文化活动部形象景观艺术总监、北京冬奥会体育图标设计团队负责人。12月31日晚,北京2022年冬奥会和冬残奥会体育图标正式发布。在体育图标发布前夕,新京报记者采访了北京冬奥会体育图标设计团队的负责人&a…

delphi制作上下开幕效果_2019中超联赛揭幕战在深圳举行 现场开幕式亮点多多

3月2日晚,2019中超联赛开幕式在深圳大运中心体育场举行。随着中国足协党委书记杜兆才正式宣布2019年中超联赛开幕,以“超精彩”为口号的2019新赛季中超联赛正式打响。本赛季中超联赛是出台“注资帽”、“薪酬帽”、“奖金帽”、“转会帽”之后的第一个赛…

ae正在发生崩溃_AE错误:正在发生崩溃的解决方法,原创问题解决方案

AE在使用过程中,可能会出现一些问题。有的问题是莫名其妙出现。例如刚刚还在正常使用AE软件,下一次再打开的时候就会出现问题。今天给大家说的是如何去解决after effects错误:正在发生崩溃这个问题 。该问题所提供的解决方法为实际操作过,并成功解决。所以才写出来给大家提…

计算机二级公共,计算机二级公共基础知识

计算机二级公共基础知识计算机二级考试包括计算机基础知识。虽然分值不高但是我们还是要把握好每一分。下面百分网小编整理了相关计算机二级公共基础知识,希望大家喜欢。计算机二级公共基础知识1.1栈和队列1、栈及其基本运算栈是限定在一端进行插入与删除运算的线性…

echarts map 点击地图区域变色_绘制炫酷的地图,不只是pyecharts.map!

导读:地图可视化是一种非常直观的数据分析结果展现形式,python有很多可视化库可以实现,pyecharts就是很多python爱好者喜爱的实现地图可视化方法之一。不可否认,pyecharts绘制的地图实现方便、图形美观而且支持交互,但…

金蝶kis专业版公网访问_金蝶KIS云专业版—【账务处理】进阶操作101问

对KIS专业版【账务处理】模块日常操作之外的各种问题进行回答,帮助老师们快速进阶此模块的操作,提高软件的便利性。1.专业版资产负债表如何移动表页位置?【操作步骤】 1、单击【报表与分析】-【资产负债表】;2、单击左上角菜单栏【…

es集群搭建_滴滴Elasticsearch 集群跨版本升级与平台重构之路

前不久,滴滴ES团队将维护的30多个ES集群,3500多个ES节点,8PB的数据,从2.3.3跨大版本无缝升级到6.6.1。在对用户查询写入基本零影响和改动的前提下,解决了ES跨大版本协议不兼容、文件格式不兼容、mapping不兼容等难题&a…

电子工程可以报考二建_非工程类专业也能报考二建吗?

非工程类专业也能报考二建吗?2020年非工程类专业能考二级建造师的省份汇总整理!2020年二级建造师考试报名公告陆续公布中,目前江西、陕西、江苏三省公布了报名时间,其他省份报名时间暂时未确定。四川省已经受疫情影响推迟五月的考…

计算机考试中英文打字题,计算机信息技术(五笔及中英文打字测试试题)

计算机信息技术(五笔及中英文打字测试试题) (14页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!14.9 积分第一章基本知识习题答案一、填空题1. 计算机信息高新技术考试划分为五、四、三、二、_ 5个等…

pil python 安装_20行Python代码给微信头像戴帽子

作者 | Leauky,北理工硕士在读,非CS专业的Python爱好者。朋友圈里微信官方要求戴圣诞帽的活动曾经火爆一时,有些会玩的小伙伴都悄咪咪地用美图秀秀一类的 app 给自己头像 p 一顶,然后可高兴地表示“哎呀好神奇hhhh”,呆…

arcgis 属性表 汇总_Arcgis中遥感影像地理配准、矢量化与地图制作

目的:将遥感图像进行地理配准、矢量化,并且制作地图。要求:对的遥感图像进行地理配准;矢量化建筑物、绿地、道路、水体等主要地物要素;对各类地物要素进行符号化设置并对其名称进行标注;添加指北针、比例尺…

怎么查看计算机的系统内存大小,Windows10系统怎么查看电脑内存大小

很多用户在升级到windows10系统之后,因为很多界面和操作都跟之前的Windows系统不一样,所以很多操作都不知道要如何下手,比如想要查看电脑内存大小的时候却不知道要怎么操作,其实方法很简单,下面给大家介绍一下Windows1…

java类初始化顺序_《To Be a Better Javaer》-- Java 基础篇 vol.2:面向对象

Java是面向对象的高级编程语言,面向对象的特征如下:面向对象具有抽象、封装、继承、多态等特性;面向对象可以将复杂的业务逻辑简单化,增强代码复用性;面向对象是一种常见的思想,比较符合人们的思考习惯。面…

计算机开机时间停在上次关机,怎么在电脑开机的时候查看上次关机前的操作

满意答案wencai242013.09.05采纳率:51% 等级:12已帮助:12606人1.看计算机在哪天运行过~运行了多久!(系统安装在c盘)找到c:\windows\SchedLgU.txt文件 里面有你自这个系统产生以来曾经工作过的时间,包括哪天开了机 开机时间 关机…