ads s参数拟合_数据分析--拟合
1.求根
二分法,牛顿法,简单迭代法
newton法
迭代公式
F(X)的雅克比矩阵
2.最小二乘拟合
最小二乘拟合是将包含统计不确定性的数据拟合为公式(“理论”)的首选方法。
已知数据点(xi, yi), 在函数空间
其中
在连续空间C[a, b] 中选定 n+1 个线性无关基函数,由它们生成的子空间记为
线性拟合
若存在
则称
对于选定的基函数
记
通过求导寻找参数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参数拟合_数据分析--拟合相关推荐
- 过度拟合_过度拟合和尺寸缩减的过度拟合的最终指南
过度拟合 Let us consider that we are designing a machine learning model. A model is said to be a good ma ...
- 趋势预测方法(二)其他函数拟合_函数拟合
其它函数拟合 a基本原理: 给出公式的大致情况,自动去拟合出最优的参数.这里的其它指的是除多项式以外的拟合情况,包括三角函数.对数,以及一些复杂的复合函数. b拟合原理: 总体思路类似于最小二乘法的拟 ...
- r语言岭回归参数选择_数据分析中常见的七种回归分析以及R语言实现(三)---岭回归...
在我们平时做回归的时候,大部分都是假定自变量和因变量是线性,但有时候自变量和因变量可能是非线性的,这时候我们就可能需要多项式回归了,多项式回归就是自变量和因变量是非线性所做的一个回归模型,其表达式: ...
- java正交多项式拟合_正交多项式拟合-matlab
任务概述 给定函数f(x)在m个采样点处的值f(xi)以及每个点的权重wi,求曲线拟合的正交多项式Pn(x)满足最小二乘误差||err||2=∑mi=1wi[f(xi)−Pn(xi)]2<TOL ...
- 高斯拟合原理_数据分析中的插值与拟合(2) —— 拟合
引言 前文介绍了通过插值来估计未知数据的方法. 蒙特遇见卡罗:数据分析中的插值与拟合(1) -- 插值zhuanlan.zhihu.com 拟合的方法应用非常广泛,数据处理.参数估计和统计学习等:可 ...
- 四参数拟合曲线_如何用GraphPad Prism 8.0对散点图进行拟合?
1.Graphpad Prism 8.0进行线性拟合 本期主角Graphpad Prism 8.0闪亮登场了,先以Excel线性拟合的数据为例,基本步骤为:打开Graphpad Prism 8.0软件 ...
- lsqcurvefit拟合结果为复数_非线性拟合怎么转化为线性拟合?
1. 前言 对于多项式函数,可以用最小二乘法求得精确的拟合结果,使得拟合函数具有全局最优的拟合误差:对于某些非线性函数,如指数函数 ,也可以对函数转化后,求得精确的拟合结果,如上述指数函数可转化为 , ...
- 误差函数拟合优缺点_欠拟合、过拟合及如何防止过拟合
对于深度学习或机器学习模型而言,我们不仅要求它对训练数据集有很好的拟合(训练误差),同时也希望它可以对未知数据集(测试集)有很好的拟合结果(泛化能力),所产生的测试误差被称为泛化误差.度量泛化能力的好 ...
- c++ 显示三维散点图_【无机纳米材料科研制图——OriginLab 0209】Origin散点图线性拟合与非线性拟合...
此篇,我们来分享对于散点图的线性拟合和非线性拟合. 一.线性拟合 1)绘制散点图. 如下图所示,我们随意编了一组数据,框选X.Y两列之后,点击Plot-->Symbol-->Scatter ...
最新文章
- 图解OpenAI的秘密武器GPT-2:可视化Transformer语言模型
- 使用GridView自带分页的代码
- viso 画背景框_3分钟漫画教程 | Q版漫画少女线稿,画完暖暖的
- MFC消息响应函数OnPaint
- sklearn自学指南(part60)--神经网络模型(无监督)
- .NET Core IdentityServer4实战 第六章-Consent授权页
- c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...
- spring学习(44):p名称空间注入
- java 多线程日志_多线程 打印的日志出现重复行
- ajax中tooltip,工具提示插件——tooltip
- 二次封装dojo slider
- BZOJ.3165.[HEOI2013]Segment(李超线段树)
- SoyNet:大豆叶部病害分类(研究思路清晰)
- 八大排序算法之希尔排序
- 论文笔记_CV_AD_Visual Perception for Autonomous Driving
- 华为ensp ftp 上传下载
- java毕业设计题目大全
- 偷窥Play Framework 2.0
- Linux中安装JDK并配置环境变量
- 惠普m1216硒鼓清零步骤_hpm1213nf清零
热门文章
- bash: ./install_software: Permission denied
- 第三周笔记 c++ Boolan
- angular 实现无限极联动下拉
- STM32的串口DMA收发以及双缓冲区的实现
- 数组用法以及引用类型和值类型
- 配置kerberos_Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 Kerberos的整合...
- java高并发日志_高并发下log4j的性能瓶颈
- 中日文字编码转换_关于编码你必须知道的知识和技巧
- python创建应用程序窗口_如何设置pythonwxwidgets应用程序窗口的类名?
- 执行一次怎么会写入两次数据_Java进阶知识:一文详解缓存Redis的持久化机制,新手看完也会用