文章目录

  • 第0部分:多项式拟合数学基础
    • 举例
  • 第一部分:多项式拟合
  • 第二部分
    • 最小二乘法拟合(参考python科学计算)
      • 使用幂律谱
      • 使用e指数
      • 三种方法总结
  • 第三部分:使用窗口平滑化处理(scipy.signal.convolve)

第0部分:多项式拟合数学基础

参考文献
多项式拟合采用的是最小二乘拟合




这里最重要的就是平方误差条件和公式(4)。
公式4表明,
1) 我们在计算系数a的时候可以直接通过矩阵来计算。
2) 对两条曲线和的拟合等于单独对两条曲线拟合的和。
比如,现在有两组数据(xi,yi)和(xi,zi)(x_i,y_i)和(x_i,z_i)(xi​,yi​)和(xi​,zi​),多项式对单组数据拟合和对(xi,yi+zi)(x_i,y_i+z_i)(xi​,yi​+zi​)的拟合是可以直接相加的,我们可以由(4)式子有

上面的图片告诉我们一个很重要的信息,即有自变量xix_ixi​组成的矩阵是一样的,那么我们在对(xi,yi+zi)(x_i,y_i+z_i)(xi​,yi​+zi​)的拟合系数等于单独对(xi,yi)(x_i,y_i)(xi​,yi​)的拟合系数与(xi,zi)(x_i,z_i)(xi​,zi​)的拟合系数的和。这表明当我们对两条曲线的和做拟合时得到的拟合曲线是pn(x)=∑k=0n(ak+bk)xkp_n(x)=\sum_{k=0}^n(a_k+b_k)x^kpn​(x)=∑k=0n​(ak​+bk​)xk,那么两条曲线与拟合曲线相减,剩余为wi=(y+z)i−pni(x)=(y+z)i−∑k=0n(ak+bk)xkw_i=(y+z)_i-p_n^i(x)=(y+z)_i-\sum_{k=0}^n(a_k+b_k)x^kwi​=(y+z)i​−pni​(x)=(y+z)i​−∑k=0n​(ak​+bk​)xk,如果要计算其中一条曲线被减了多少,或者要知道剩余中每条曲线分别还含有多少比例,那么可以放心大胆的再次使用这个nnn阶多项式单独对每条曲线进行fit再相减,即yyy的剩余为yi−∑k=0nakxky_i-\sum_{k=0}^na_kx^kyi​−∑k=0n​ak​xk,zzz的剩余为zi−∑k=0nbkxkz_i-\sum_{k=0}^nb_kx^kzi​−∑k=0n​bk​xk.这里要注意必须使用相同阶数,比如对(y+z)(y+z)(y+z)使用10阶多项式拟合,那么对单个成分也必须是10阶。

举例



第一部分:多项式拟合

  • 1)一次式
import numpy as np
import matplotlib.pyplot as pltx,y = [1,1.25,1.33,1.60,2.0,2.4,2.5,3.0,3.2],[1000,1100,1300,1500,1861.48\,2233.6,2326.64,2791.94,2978.09]
x,y = np.array(x),np.array(y) #变成数组形式,方便数学计算
z1 = np.polyfit(x,y,1)   #使用一次式拟合,使用N次式则将1改为N即可
p1 = np.poly1d(z1)    #一维
print(p1)         #输出p1的式子
y_fit = p1(x)      #fit之后的结果plt.scatter(x,y_fit,label='fit')    #画fit后的图
plt.scatter(x,y,label='data')    #画原始图plt.legend()
plt.show()

输出的一次函数形式:

得到的图像:

第二部分

最小二乘法拟合(参考python科学计算)

使用幂律谱

幂律谱有如下形式:
y=a×xby=a\times x^by=a×xb
如果用矢量p表示函数中需要确定的参数,则目标是找到一组p使得函数S的值最小:
S(p)=∑i=1m[yi−f(xi,p)]2S(\boldsymbol p)=\sum_{i=1}^{m}[y_i-f(x_i,\boldsymbol p)]^2S(p)=i=1∑m​[yi​−f(xi​,p)]2

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsqdef residuals(p):a,b = p    # p表示参数,所以这里有两个参数a,b(不可少)return Ad-(a*fsky**b)   #输出真实值与拟合值的差,这里使用的是幂律谱y_fit = a*x**bfsky = np.array([0.24,0.33,0.42,0.52,0.62,0.71])
Ad = np.array([0.48*34.3,0.45*47.3,0.50*74.7,0.53*120.1,0.53*190.7,0.53*315.4])popt = leastsq(residuals,[1,0])  #这里给出residual得到的数组的平方和,即上面公式的S(p)
#[1,0]分别是a,b的初始值
a,b = popt[0]   # 两个参数
x = np.linspace(0,1,10)
Ad_fit = a*x**bplt.scatter(fsky,Ad)
plt.plot(x,Ad_fit)
plt.show()


更新(2021.7.26)
更新对于log坐标下的幂律谱拟合
比如有个ℓ\ellℓ和CℓC_\ellCℓ​,它们在log坐标下的关系如下:

现在要用幂律谱拟合这条曲线,由于是在ipython环境,所以就直接这么写了

使用e指数

e指数有如下形式
y=a×eb×xy=a\times e^{b\times x}y=a×eb×x

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsqdef residuals(p):a,b = preturn Ad-(a*np.exp(b*fsky))fsky = np.array([0.24,0.33,0.42,0.52,0.62,0.71])
Ad = np.array([0.48*34.3,0.45*47.3,0.50*74.7,0.53*120.1,0.53*190.7,0.53*315.4])popt = leastsq(residuals,[1,0])
a,b = popt[0]
x = np.linspace(0,1,10)
Ad_fit = a*np.exp(b*x)plt.scatter(fsky,Ad)
plt.plot(x,Ad_fit)
plt.show()

三种方法总结

将上面提到的三种方法统一写在下面的这个代码中,对输入fsky, Ad做拟合

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsqdef polynomial_fit(x,y,N):return np.polyfit(x,y,N)def exponential(p):a,b = preturn Ad-(a*np.exp(b*fsky))def power_law(p):a,b = preturn Ad-(a*fsky**b)fsky = np.array([0.24,0.33,0.42,0.52,0.62,0.71])
Ad = np.array([0.48*34.3,0.45*47.3,0.50*74.7,0.53*120.1,0.53*190.7,0.53*315.4])
# x range
x = np.linspace(0,1,100)# polynomial_fit
popt_poly = polynomial_fit(fsky,Ad,3)
p1 = np.poly1d(popt_poly)
Ad_poly = p1(x)
print(p1)#exponential form
popt_exp = leastsq(exponential,[1,0])
a_exp,b_exp = popt_exp[0]
#power law
popt_power_law = leastsq(power_law,[1,0])
a_pow,b_pow = popt_power_law[0]Ad_fit_exp = a_exp*np.exp(b_exp*x)
Ad_fit_pow = a_pow*x**b_pow#plt.figure()
plt.scatter(fsky,Ad)
plt.plot(x,Ad_poly,label='polynomial fit')
plt.plot(x,Ad_fit_exp,label='exponential fit')
plt.plot(x,Ad_fit_pow,label='power_law fit')
plt.xlabel('fsky')
plt.ylabel('Ad')plt.legend()
plt.show()



例题:拟合中国GDP最近10年的增速,计算多少年可以赶上美国

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsqdef residuals(p):a,b = p    # p表示参数,所以这里有两个参数a,b(不可少)return(Ad-(a*(fsky-2001)**b))   #输出真实值与拟合值的差,这里使用的是幂律谱y_fit = a*x**bfsky = np.array([2010,2011,2012,2013,2014,2015,2016,2017,2018,2019])  #这里是时间,我就直接使用sky表示了
Ad = np.array([10.9,9.5,7.9,7.8,7.3,6.9,6.7,6.8,6.6,6.3])#这里是中国GDP最近10年增速popt = leastsq(residuals,[1,1])  #这里给出residual得到的数组的平方和,即S(p)
a,b = popt[0]   # 两个参数
x = np.arange(2010,2030)
Ad_fit = a*(x-2001)**bdef residualss(p):c,d = preturn(Ad-(c*np.exp(d*(fsky-2001))))popts = leastsq(residualss,[1,0])
c,d = popts[0]
Ad_fit1 = c*np.exp(d*(x-2001))plt.plot(x,Ad_fit1,'k',label='exponential fit')
plt.scatter(fsky,Ad)
plt.plot(x,Ad_fit,'r',label='power_law fit')
plt.legend()
plt.show()


这种情况需要到2038年

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsq#power law 形式
def residuals(p):a,b = p    # p表示参数,所以这里有两个参数a,b(不可少)return(Ad-(a*(fsky-2001)**b))   #输出真实值与拟合值的差,这里使用的是幂律谱y_fit = a*x**bfsky = np.array([2010,2011,2012,2013,2014,2015,2016,2017,2018,2019])
Ad = np.array([10.9,9.5,7.9,7.8,7.3,6.9,6.7,6.8,6.6,6.3])popt = leastsq(residuals,[1,1])  #这里给出residual得到的数组的平方和,即S(p)
a,b = popt[0]   # 两个参数
x = np.arange(2010,2040)
Ad_fit = a*(x-2001)**b#e指数形式
def residualss(p):c,d = preturn(Ad-(c*np.exp(d*(fsky-2001))))popts = leastsq(residualss,[1,0])
c,d = popts[0]
Ad_fit1 = c*np.exp(d*(x-2001))plt.plot(x,Ad_fit,'r',label='power_law fit')
plt.plot(x,Ad_fit1,'k',label='exponential fit')
plt.scatter(fsky,Ad)plt.legend()
plt.show()x1 = np.arange(2018,2045)
w = a*(x1-2001)**b
#使用power law 形式,乘以0.001是从百分比化成小数
#计算需要用到append函数来保存
y1 = [13.6]
w = 13.6
for i in range(2019,2045):w = w*(1+0.01*a*(i-2001)**b)y1.append(w)
y1 = y1
y2 = 20.5*np.power(1+0.023,x1-2018)
plt.figure()
plt.plot(x1,y1,label='China')
plt.plot(x1,y2,label='United States')
plt.legend()
plt.show()

第三部分:使用窗口平滑化处理(scipy.signal.convolve)

如果信号噪声比较多,或者图片/数组中高频部分多,那么可以考虑使用scipy的卷积来平滑smooth,

#convolution (smoothing)
win = signal.hann(10)
y1 = signal.convolve(y,win,mode='same')/sum(win)

下图蓝色是平滑前,黄色是平滑后,可以降低噪声水平

python数据拟合fit相关推荐

  1. python数据拟合

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

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

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

  3. python数据拟合固定参数_如何将数据拟合到非理想二极管方程(隐式非线性函数)并检索参数 - python...

    散乱数据图 我需要将(x,y)-数据拟合到具有两个变量(x和y)的方程式中,并检索5个未知参数. 我正在编写一个脚本,以处理来自简单.txt文件的IV数据(电流电压),并将其拟合为称为非理想二极管方程 ...

  4. python数据拟合怎么做的,python如何实现数据的线性拟合

    实验室老师让给数据画一张线性拟合图.不会matlab,就琢磨着用python.参照了网上的一些文章,查看了帮助文档,成功的写了出来 这里用到了三个库 import numpy as np import ...

  5. python数据拟合固定参数_固定某些参数的双峰高斯分布拟合

    经过几次调整,我就能使您的分布适合数据: >像使用w一样,您隐含了一个约束,即0< = w< =1.fit()方法使用的求解器不知道此约束,因此w可能会​​得到不合理的值.处理此类约 ...

  6. python 数据拟合 预测_GitHub - wanng-ide/Python-WeChat-Predict: 用现有的数据对微信公众号的一些数据做一个预测,主要采用多项式拟合来构建模型。...

    Python-WeChat-Predict 用现有的数据对微信公众号的一些数据做一个预测,主要采用多项式拟合来构建模型. 概述 项目主要内容是对32个微信公众号在30天的数据进行处理,初始数据全部保存 ...

  7. Python小白的数学建模课-23.数据拟合全集

    拟合是用一个连续函数(曲线)靠近给定的离散数据,使其与给定的数据相吻合. 数据拟合的算法相对比较简单,但调用不同工具和方法时的函数定义和参数设置有所差异,往往使小白感到困惑. 本文基于 Scipy 工 ...

  8. python多项式拟合:np.polyfit 和 np.polyld

    python数据拟合主要可采用numpy库,库的安装可直接用pip install numpy等. 这段代码可以直接用,但是要用自己的值 #多项式拟合 y = data_jiedian_2 #输入自己 ...

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

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

最新文章

  1. 移动磁盘由于IO设备错误,要怎样寻回文件
  2. Arcgis for JS之Cluster聚类分析的实现
  3. 146. LRU Cache
  4. 我们的系统检测到您的计算机网络中存在异常流量_如何建立我们的网络防线?入侵检测,确保我们的网络安全...
  5. echarts中矢量图片路径设置
  6. matlab实现神经网络
  7. 装完系统还要装什么_一键重装系统后需要干嘛
  8. 网络科学论坛纪要-2012
  9. 李沐动手学深度学习V2-注意力评分函数
  10. autoexec.bat文件的所在位置
  11. Linux之进程的前后台切换
  12. 用Android实现计算器
  13. C# USB转串口编程 - 查找COM口
  14. Android View学习笔记(三):Scroller的原理剖析及使用(上)
  15. 抖音去水印小程序太坑了,每天只能下载一个还要钱。还是自己用Python写一个得劲
  16. 如何从手机远程控制uTorrent
  17. 燕十八ajax笔记,燕十八php視频教程笔记(PHP基础部分).doc
  18. 三星新款Galaxy Watch采用捷德移动安全eSIM技术实现无缝连接
  19. 4N25光耦合器:简单的应用电路
  20. TTS中英文混合朗读的完全设计实现

热门文章

  1. 第十五届全国大学生智能汽车竞赛线上比赛流程规范
  2. wcf返回json android,WCF返回JSON的详细配置
  3. java多态 降低代码耦合性_深度分析:理解Java中的多态机制,一篇直接帮你掌握!...
  4. 怎样增加混凝土粘聚性_改善中低强度等级混凝土粘聚性的方法
  5. Kernel i2c gpio spi pinctrl platform 分析讲解 (未完待续)
  6. postmessage 消息接收延迟_微信为什么会突然延迟接收消息?原来是它们搞的鬼!...
  7. ie不再询问加载java_fireFox IE刷新不提示
  8. Python2安装教程(以最终版本Python2.7.18为例)
  9. “输入字符不是 MATLAB 语句或表达式中的有效字符”的解决办法
  10. 新版 Edge 浏览器或将拥有两个不同的浏览器内核