1.求根

二分法,牛顿法,简单迭代法

newton法

迭代公式

F(X)的雅克比矩阵

2.最小二乘拟合

最小二乘拟合是将包含统计不确定性的数据拟合为公式(“理论”)的首选方法。

已知数据点(xi, yi), 在函数空间

中寻找S*(xi),使得

其中

是点xi 处的权

在连续空间C[a, b] 中选定 n+1 个线性无关基函数,由它们生成的子空间记为

线性拟合

若存在

,使得

则称

为离散数据
在子空间
上的最小二乘拟合。

对于选定的基函数

,拟合曲线
是n+1 个参数的线性函数,称之为线性最小二乘。

然后要做的就是求 I 在极值点下的参数

通过求导寻找参数ak*

记m+1维向量:

用函数內积形式简记为

多项式拟合

其中

为权函数

实例

线性拟合

In 1929 Edwin Hubble examined the data in Table relating the radial velocity v of 24 extra galactic nebulae to their distance r from our galaxy. Although there was considerable scatter in the data, he fit them with a straight line:

对上面的数据做一个线性拟合

得到

y(x) = a0+a1 x a0 = 0.032 a1 = 0.9

非线性拟合

下面采用洛伦兹函数来拟合数据

Measured total cross sections in millibarns of neutron-carbon scattering as a function of neutron energy in KeVs.

洛伦兹函数的形式

简记为

对三个参数的偏导数分别为

利用最小二乘得到

使用牛顿迭代法寻找参数

import math
import numpy as np
from numpy import *
import matplotlib.pyplot as plt
import matplotlibplt.figure(figsize=(20,16), dpi=100)
plt.rc('font',family='Times New Roman')
matplotlib.rcParams['font.family']='STSong'
plt.rcParams['axes.unicode_minus']=False
matplotlib.rcParams['font.size']=20ND=9
num =3
E=np.array([0, 13 ,25 ,38, 50, 63, 75, 87, 100])
S=np.array([10.6, 16.0, 45.0, 83.5, 52.8, 19.9, 10.8, 8.25, 4.7])
sig = np.ones_like(S)
#sig =np.array([9.34, 17.9, 41.5, 85.5, 51.5, 21.5, 10.8, 6.29, 4.14])    # Error bars
x = np.array([20000,40,220],dtype=float)
plt.plot(E, S, 'bo',markersize=20,alpha=0.4,label="采样数据点") plt.title('Least-Squares Fit of linear to Blue Data',fontsize=20)
plt.xlabel('E',fontsize=32);  plt.ylabel('$sigma$',fontsize=32);   plt.grid(True)
def Fun(x,num):                       F = np.zeros((num),dtype=float)for j in range(ND):F[0] += (S[j]-x[0]/((E[j]-x[1])**2+x[2]))/sig[j]**2/((E[j]-x[1])**2+x[2])F[1] += -2*x[0]*(E[j]-x[1])*(S[j]-x[0]/((E[j]-x[1])**2+x[2]))/sig[j]**2/((E[j]-x[1])**2+x[2])**2F[2] += -x[0]*(S[j]-x[0]/((E[j]-x[1])**2+x[2]))/sig[j]**2/((E[j]-x[1])**2+x[2])**2return Fdef dfun(x,num):                         df = np.zeros((num,num),dtype=float)dx = 0.00001                           # x1_plus = np.copy(x)x1_minus = np.copy(x)for i in range(0,num):             for j in range(0,num):x1_plus = np.copy(x)x1_minus = np.copy(x)x1_plus[j] = x1_plus[j]+dx/2           #x+dx x1_minus[j] = x1_minus[j]-dx/2df[i,j] = (Fun(x1_plus,num)[i]-Fun(x1_minus,num)[i])/dx   #f(x+dx)-f(x)/dxdf_1 = np.linalg.inv(df)                              #计算逆矩阵return df_1def Newton(x,num):x1 = np.copy(x)i = 0delta = np.copy(x)
#    dfun0=dfun(x,num)          while(np.sum(abs(delta)) > 1.e-6 and i < 100):  #控制循环次数x1 = x-np.dot(dfun(x,num),Fun(x,num))  #公式delta = x1-x                     x = x1i = i+1print(x,)return xa = Newton(x,num)
print(a)EX=np.linspace(0,100,1000)
G_E=x[0]/((EX-x[1])**2+x[2])
G = a[0]/((EX-a[1])**2+a[2])
points = a[0]/((E-a[1])**2+a[2])
plt.plot(EX, G_E,'k', linewidth=3.0,label="初猜曲线")
plt.plot(EX, G,'r:',linewidth=5.0,label="最终拟合曲线")
plt.plot(E, points, 'ro',markersize= 20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend()
plt.show()

results

[ 14956.38460591 38.99233378 177.84417855]

[ 16568.5542651 38.80318039 196.28768571]

[ 16786.04125645 38.81295456 198.89084396]

[ 16789.85161833 38.81293923 198.94072711]

[ 16789.85282055 38.81293926 198.94074454]

[ 16789.85282055 38.81293926 198.94074454]

[ 16789.85282055 38.81293926 198.94074454]

初值的选取很重要,因为在求解拟合参数时用的是牛顿法,如果选取的初值不合适则直接导致拟合参数不收敛,那就没法玩了。先把点描出来,然后根据洛伦兹函数估算出几个参数,首先是a2,a2是平方项(平方项说明它是对称函数)里面的,a2差不多就是平移量(40左右)。然后a3,a3差不多是半高宽一半的平方(200左右)。然后a1,a1是峰值(80)*a2,差不多是16000。

使用 scipy 库

import numpy as np
from scipy.optimize import leastsq
import pylab as pldef func(x, p):a1, a2, a3 = preturn a1/((x-a2)**2+a3)   def residuals(p, y, x):return y - func(x, p)x = np.linspace(0, 100, 1000)p0 = [16000,40, 200, ]
x0=np.array([0, 13 ,25 ,38, 50, 63, 75, 87, 100])
y0=np.array([10.6, 16.0, 45.0, 83.5, 52.8, 19.9, 10.8, 8.25, 4.7])
y1 = y0 + 2 * np.random.randn(len(x0))   plsq = leastsq(residuals, p0, args=(y1, x0))print (u"拟合参数", plsq[0])
plt.title(u'洛伦兹函数最小二乘法拟合',fontsize=20)
pl.plot(x0, y0, 'bo',markersize=20,alpha=0.4, label=u"真实数据")
pl.plot(x0, y1, 'y*', markersize=20,alpha=0.4, label=u"带噪声的实验数据")
pl.plot(x, func(x, plsq[0]), 'r:',linewidth=5.0, label=u"拟合曲线")
plt.plot(x, func(x, p0),'k', linewidth=3.0,label="初猜曲线")
plt.plot(x0, func(x0, plsq[0]), 'ro',markersize= 20)
plt.xlabel('E',fontsize=32);  plt.ylabel('$sigma$',fontsize=32);   plt.grid(True)
pl.legend()
pl.show()

ads s参数拟合_数据分析--拟合相关推荐

  1. 过度拟合_过度拟合和尺寸缩减的过度拟合的最终指南

    过度拟合 Let us consider that we are designing a machine learning model. A model is said to be a good ma ...

  2. 趋势预测方法(二)其他函数拟合_函数拟合

    其它函数拟合 a基本原理: 给出公式的大致情况,自动去拟合出最优的参数.这里的其它指的是除多项式以外的拟合情况,包括三角函数.对数,以及一些复杂的复合函数. b拟合原理: 总体思路类似于最小二乘法的拟 ...

  3. r语言岭回归参数选择_数据分析中常见的七种回归分析以及R语言实现(三)---岭回归...

    在我们平时做回归的时候,大部分都是假定自变量和因变量是线性,但有时候自变量和因变量可能是非线性的,这时候我们就可能需要多项式回归了,多项式回归就是自变量和因变量是非线性所做的一个回归模型,其表达式: ...

  4. java正交多项式拟合_正交多项式拟合-matlab

    任务概述 给定函数f(x)在m个采样点处的值f(xi)以及每个点的权重wi,求曲线拟合的正交多项式Pn(x)满足最小二乘误差||err||2=∑mi=1wi[f(xi)−Pn(xi)]2<TOL ...

  5. 高斯拟合原理_数据分析中的插值与拟合(2) —— 拟合

    引言 前文介绍了通过插值来估计未知数据的方法. 蒙特遇见卡罗:数据分析中的插值与拟合(1) -- 插值​zhuanlan.zhihu.com 拟合的方法应用非常广泛,数据处理.参数估计和统计学习等:可 ...

  6. 四参数拟合曲线_如何用GraphPad Prism 8.0对散点图进行拟合?

    1.Graphpad Prism 8.0进行线性拟合 本期主角Graphpad Prism 8.0闪亮登场了,先以Excel线性拟合的数据为例,基本步骤为:打开Graphpad Prism 8.0软件 ...

  7. lsqcurvefit拟合结果为复数_非线性拟合怎么转化为线性拟合?

    1. 前言 对于多项式函数,可以用最小二乘法求得精确的拟合结果,使得拟合函数具有全局最优的拟合误差:对于某些非线性函数,如指数函数 ,也可以对函数转化后,求得精确的拟合结果,如上述指数函数可转化为 , ...

  8. 误差函数拟合优缺点_欠拟合、过拟合及如何防止过拟合

    对于深度学习或机器学习模型而言,我们不仅要求它对训练数据集有很好的拟合(训练误差),同时也希望它可以对未知数据集(测试集)有很好的拟合结果(泛化能力),所产生的测试误差被称为泛化误差.度量泛化能力的好 ...

  9. c++ 显示三维散点图_【无机纳米材料科研制图——OriginLab 0209】Origin散点图线性拟合与非线性拟合...

    此篇,我们来分享对于散点图的线性拟合和非线性拟合. 一.线性拟合 1)绘制散点图. 如下图所示,我们随意编了一组数据,框选X.Y两列之后,点击Plot-->Symbol-->Scatter ...

最新文章

  1. 图解OpenAI的秘密武器GPT-2:可视化Transformer语言模型
  2. 使用GridView自带分页的代码
  3. viso 画背景框_3分钟漫画教程 | Q版漫画少女线稿,画完暖暖的
  4. MFC消息响应函数OnPaint
  5. sklearn自学指南(part60)--神经网络模型(无监督)
  6. .NET Core IdentityServer4实战 第六章-Consent授权页
  7. c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...
  8. spring学习(44):p名称空间注入
  9. java 多线程日志_多线程 打印的日志出现重复行
  10. ajax中tooltip,工具提示插件——tooltip
  11. 二次封装dojo slider
  12. BZOJ.3165.[HEOI2013]Segment(李超线段树)
  13. SoyNet:大豆叶部病害分类(研究思路清晰)
  14. 八大排序算法之希尔排序
  15. 论文笔记_CV_AD_Visual Perception for Autonomous Driving
  16. 华为ensp ftp 上传下载
  17. java毕业设计题目大全
  18. 偷窥Play Framework 2.0
  19. Linux中安装JDK并配置环境变量
  20. 惠普m1216硒鼓清零步骤_hpm1213nf清零

热门文章

  1. bash: ./install_software: Permission denied
  2. 第三周笔记 c++ Boolan
  3. angular 实现无限极联动下拉
  4. STM32的串口DMA收发以及双缓冲区的实现
  5. 数组用法以及引用类型和值类型
  6. 配置kerberos_Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 Kerberos的整合...
  7. java高并发日志_高并发下log4j的性能瓶颈
  8. 中日文字编码转换_关于编码你必须知道的知识和技巧
  9. python创建应用程序窗口_如何设置pythonwxwidgets应用程序窗口的类名?
  10. 执行一次怎么会写入两次数据_Java进阶知识:一文详解缓存Redis的持久化机制,新手看完也会用