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

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

拟合注意事项

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

总结:

参考文献

实现代码

一,最小二乘法拟合

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

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

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

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

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(). 最小二乘法的两个拟合大体的步骤是一样的,定义拟合范式,传入拟合参数,开始拟合得出拟合结果。对于简单的拟合函数两者的差别很小,但是复杂的,需要具体的分析。文章还会继续的分析拟合结果的含义,让我们对拟合的结果有更加透彻的理解,随心拟合。

参考文献:

python数据拟合方法_Python-最小二乘法曲线拟合相关推荐

  1. python 财务分析可视化方法_Python数据可视化的四种简易方法

    Python数据可视化的四种简易方法 作者:PHPYuan 时间:2018-11-28 03:40:43 摘要: 本文讲述了热图.二维密度图.蜘蛛图.树形图这四种Python数据可视化方法. 数据可视 ...

  2. MATLAB在数学建模中的应用 随手笔记(二)----- 数据拟合方法

    声明:本篇文章只是个人知识点归纳总结,不代表全书内容,望各位大佬不喜勿喷.梳理顺序是按照书籍的实际顺序梳理. 作者:sumjess 目前内容:第一章 数学建模常规方法及其MATLAB实现---数据拟合 ...

  3. 小波函数的数据拟合方法

    http://www.doc88.com/p-0804368854890.html 1.数据拟合的最小二乘法 目前,数据拟合的常用方 法是最小二乘法,而基函数多采用n次多项式.切比晓夫多项 式.Ber ...

  4. matlab中离开网格的流量,数学建模【数据处理方法(一维、二维插值方法;数据拟合方法;插值and拟合的MATLAB实现)】...

    [学习网址:MOOC---郑州轻工业大学---数学建模与实验]数学建模专栏 笔记01[第1.2章][概述.软件介绍] 笔记02[第3章][数据处理方法] 笔记03[第4章][规划模型] 笔记04[第5 ...

  5. 基于MATLAB的多项式数据拟合方法研究-毕业论文

    摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式 ...

  6. python数据拟合

    python数据拟合 文章目录 python数据拟合 1.多项式拟合 1.1 多项式拟合描述 1.2 多项式拟合实现 2.自定义函数拟合 2.1 自定义函数拟合描述 2.1 自定义函数拟合的实现 1. ...

  7. Python数据拟合幂函数y=ax^b

    Python数据拟合--幂函数y=ax^b from scipy.optimize import curve_fit import numpy as np import matplotlib.pypl ...

  8. python的pandas方法_python使用Pandas处理数据的方法

    python使用Pandas处理数据的方法 发布时间:2020-06-17 13:50:10 来源:亿速云 阅读:119 作者:鸽子 Pandas是Python中非常常用的数据处理工具,使用起来非常方 ...

  9. python数据趋势算法_Python数据拟合与广义线性回归算法学习

    机器学习中的预测问题通常分为2类:回归与分类. 简单的说回归就是预测数值,而分类是给数据打上标签归类. 本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析. 本例中使用一个 ...

  10. python升维方法_python机器学习12:数据“升维”

    1.向数据集添加交互式特征 在实际应用中,常常会遇到数据集的特征不足的情况,要解决这个问题,就需要对数据集的特征进行扩充.这里我们介绍两种在统计建模中常用的方法---交互式特征(Interaction ...

最新文章

  1. python使用for循环打印99乘法表-Python中的九九乘法表(for循环)
  2. 批处理start命令学习
  3. 关于解决Path被大改,无法直接编辑恢复的问题
  4. 锂电池电量百分比计算_锂电池充放电理论及电量计算方法设计
  5. 程序员的基础和解决问题的思维很重要
  6. java 算数运算符
  7. 鱼C论坛_VIP二号光盘
  8. Ubuntu菜鸟入门(五)—— 一些编程相关工具
  9. 玩转树莓派——游戏主机模拟器
  10. sqlmap运行mysql命令_sqlmap命令总结
  11. Linux操作系统课后参考答案
  12. android答辩问题,安卓毕业设计答辩(流程、准备、模板及注意事项)
  13. robots协议文件的几种写法及示例
  14. 好莱坞十大经典动作片
  15. 三菱凌云3故障代码_三菱故障代码表
  16. GPS北斗校时服务器(时间服务器)在港口自动化系统应用
  17. Android 自定义 HorizontalScrollView 横向滑动效果
  18. 计算机组成原理---冯诺依曼体系结构及性能和功耗
  19. 用html和css设计QQ注册页面,html和css制作QQ企鹅教程
  20. 遵义微科技小程序商城直播系统,线下零售行业发展新趋势!

热门文章

  1. win10联想Y7000重启蓝牙消失报显卡错误代码43
  2. 电商数据分析基础指标体系
  3. [转]应该被记住的天才,写在图灵诞辰100周年
  4. 如何一次性保存html图片大小,保存网页图片的几种方法(批量)
  5. http://www.boobooke.com/bbs/thread-10284-1-1.html
  6. AutoCad二次开发-插入DWG参照 Teigha库
  7. 用axure整理,体检软件-----第一天
  8. 电子标签有哪些封装方式
  9. 软件测试是不是IT行业最容易学的 ,大概需要多长时间,就业前景好吗?
  10. 如何编辑修改PDF文件内容?修改方法很简单