根据以下帖子整理:

一、用函数方式实现曲线拟合

http://www.cnblogs.com/linkr/p/3632032.html

https://blog.csdn.net/sinat_20265495/article/details/50043833

如何确定拟合的多项式阶数的N?

https://blog.csdn.net/it_beecoder/article/details/78779385

二、cftool工具箱拟合

https://blog.csdn.net/laobai1015/article/details/77537145

https://blog.csdn.net/sinat_20265495/article/details/50043833

三、如何评价拟合曲线好坏?

https://blog.csdn.net/u012035588/article/details/38

https://wenda.so.com/q/1534573717211596730809

一、用函数方式实现曲线拟合

这里简单的记下两种常用的拟合方法。

1 多项式拟合(polyfit和polyval)

polyfit可以对数据进行拟合(自定义用几次多项式),返回相应的参数,然后用polyval生成拟合后的数据点,下面的例子中我们对抛物线y=3x2+6x+5进行拟合。

x = -5:0.1:5;
y = 3*x.^2+6*x + 5 + randn(size(x));
p = polyfit(x,y,2);
yy = polyval(p,x);
plot(x,y,'.');
hold on;
plot(x,yy,'r','LineWidth',2)

polyfit(x,y,2)中x表示自变量,y表示因变量,2表示用二次曲线(抛物线)进行拟合,得到的p其实是对应的参数估计值,yy为拟合数据点。另外在实验中还加了一个随机噪声。结果如图:

2 高斯函数的曲线拟合

高斯曲线也是很常要拟合的曲线,这里介绍一种直接用代码使用cftool拟合工具的方法,这种方法可以对许多自定义的函数进行拟合(例如用来做多项式拟合,但是这种方法要麻烦很多,远没有前一种方法多项式拟合方便)。下面的是一个简单的例子,其中还可以进行更复杂的设置,具体请help fit和fittype.

f = fittype('a*exp(-((x-b)/c)^2)');
x = -10:0.2:10;
y = 5*exp(-((x)/4).^2)+randn(size(x))*0.1;
plot(x,y,'.')
[cfun,gof] = fit(x(:),y(:),f);
yy = cfun.a*exp(-((x-cfun.b)/cfun.c).^2);
hold on;plot(x,yy,'r','LineWidth',2);

结果如下图:

此外,高斯曲线的拟合也可以通过转化为多项式拟合的方法实现,先将被拟合数据y取对数,然后用多项式拟合求出对应的参数。代码如下:

x = -10:0.2:10;
y = 5*exp(-((x)/4).^2);
lny = log(y);
p = polyfit(x,lny,2);
gauss.c = sqrt(-1/p(1));
gauss.b = -p(2)/2/p(1);
gauss.a = exp(p(3)-p(1)*gauss.b^2);
yy = gauss.a*exp(-((x-gauss.b)/gauss.c).^2);
plot(x,y,'.');
hold on;
plot(x,yy,'r','LineWidth',2)

结果如图所示,但是这种方法似乎只在没有噪声干扰时效果较好,如果存在噪声的干扰的话,那么这个估计不是最佳的(因为对数运算使不同区间的噪声影响不同),右图为加了噪声之后的情况.

                

3.其他栗子

在matlab中,用polyfit函数来求得最小二乘拟合多项式的系数,再用polyval函数按所得的多项式计算所给点上的函数近似值。
例子:用一个三次多项式在区间[0:2*pi]内逼近函数sin(x)
在给定区间内均匀选取20个采样点并计算采样点的函数值,然后利用3次多项式逼近。
代码如下:
x=linspace(0,2*pi,20);
y=sin(x);
p=polyfit(x,y,3)
y1=polyval(p,x)
plot(x,y,':o',x,y1,'-*')
legend('sin(x)','fit')

图形:

如何确定多项式阶数N?

阶数确定方法一:

这种方法是最常用的确定方法,一般情况下,我们拟合函数的目的,就是为了调用,所以在用函数拟合之前会用matlab曲线拟合工具箱进行拟合函数阶数的确定,由其确定拟合的阶数,然后我们用这个函数命令在其他地方进行十分方便地调用,这是最常用的做法。我们往往拟合的是多个同类型的数据,所以确定好一组样本的次数之后,就可以对其他数据用同样的N进行拟合。

阶数确定方法二:

这种方法方法可以取代用cftool进行判断的过程,具体实现代码如下:

for i=1:5

y2=polyfit(x,y,i);

Y=polyval(y2,x);%计算拟合函数在x处的值。

if sum((Y-y).^2)<0.1

c=i

break;

end

end

运行以上程序,结果如下:

c=3

假设我们的误差平方和精度范围为0.1,那么通过以上程序,我们可以看到用3阶函数拟合,就可以达到精度要求。在多项式进行拟合的时候这个值我们在程序执行的过程中就直接可以调用。

说明:至于说用plot函数进行画图,肉眼观察拟合程度的那种笨方法,我们不推荐,这里也不赘述。

二、cftool工具箱拟合

1、运行Matlab软件。

在工作空间中存入变量的实验数据。具体如下:

可以直接用矩阵来存放数据,直接在命令窗口输入

x=[数据x1,数据x2,...,数据xn];

y=[数据y1,数据y2,...,数据yn];

当数据较多时,可以从excel,txt等文件中导入。

2、把数据存入工作空间后,在命令窗口中输入cftool,回车运行。

3、在这个拟合工具窗口的左边,选择变量,即分别选择x,y。

4、选择拟合的曲线类型,一般是线性拟合,高斯曲线,平滑曲线等,根据需要选择。

选择完后会自动完成拟合,并且给出拟合函数表达式。

5、点击菜单栏中的“file”,选择“print to figure"进行画图。

6、在图形窗口中,可以对图形显示模式进行修改,如添加标题,坐标名称等。

7、最后得到比较完整的图形曲线。点击”file"中的“save"进行保存。

这个过程中有一个注意事项:x和y的数据维度必须保持一致。

工具箱里的提供的拟合类型:

Custom Equations:用户自定义的函数类型
Exponential:指数逼近,有2种类型, a*exp(b*x) 、 a*exp(b*x) + c*exp(d*x) 
Fourier:傅立叶逼近,有7种类型,基础型是 a0 + a1*cos(x*w) + b1*sin(x*w)
Gaussian:高斯逼近,有8种类型,基础型是 a1*exp(-((x-b1)/c1)^2)
Interpolant:插值逼近,有4种类型,linear、nearest neighbor、cubic spline、shape-preserving
Polynomial:多形式逼近,有9种类型,linear ~、quadratic ~、cubic ~、4-9th degree ~
Power:幂逼近,有2种类型,a*x^b 、a*x^b + c
Rational:有理数逼近,分子、分母共有的类型是linear ~、quadratic ~、cubic ~、4-5th degree ~;此外,分子还包括constant型
Smoothing Spline:平滑逼近
Sum of Sin Functions:正弦曲线逼近,有8种类型,基础型是 a1*sin(b1*x + c1)
Weibull:只有一种,a*b*x^(b-1)*exp(-a*x^b)
选择好所需的拟合曲线类型及其子类型,并进行相关设置:
——如果是非自定义的类型,根据实际需要点击“Fit options”按钮,设置拟合算法、修改待估计参数的上下限等参数;
——如果选Custom Equations,点击“New”按钮,弹出自定义函数等式窗口,有“Linear Equations线性等式”和“General Equations构造等式”两种标签。
在本例中选Custom Equations,点击“New”按钮,选择“General Equations”标签,输入函数类型y=a*x*x + b*x,设置参数a、b的上下限,然后点击OK。
(5)类型设置完成后,点击“Apply”按钮,就可以在Results框中得到拟合结果,
同时,也会在工具箱窗口中显示拟合曲线如下图:

三、如何评价拟合曲线好坏?

(一)第一种方法

Matlab拟合好坏常用指标

用过Matlab的拟合、优化和统计等工具箱的网友,会经常遇到下面几个名词:

SSE(和方差、误差平方和):The sum of squares due to error

MSE(均方差、方差):Mean squared error

RMSE(均方根、标准差):Root mean squared error

R-square(确定系数):Coefficient of determination  Adjusted R-square:Degree-of-freedom adjusted coefficient of determination

下面我对以上几个名词进行详细的解释下,相信能给大家带来一定的帮助!!   一、SSE(和方差)  该统计参数计算的是拟合数据和原始数据对应点的误差的平方和,计算公式如下

一、SSE(和方差)

该统计参数计算的是拟合数据和原始数据对应点的误差的平方和。

SSE越接近于0,说明模型选择和拟合更好,数据预测也越成功。接下来的MSE和RMSE因为和SSE是同出一宗,所以效果一样。

二、MSE(均方差)  该统计参数是预测数据和原始数据对应点误差的平方和的均值,也就是SSE/n,和SSE没有太大的区别。

三、RMSE(均方根)  该统计参数,也叫回归系统的拟合标准差,是MSE的平方根。

在这之前,我们所有的误差参数都是基于预测值(y_hat)和原始值(y)之间的误差(即点对点)。从下面开始是所有的误差都是相对原始数据平均值(y_ba)而展开的(即点对全)!!!

四、R-square(确定系数)  在讲确定系数之前,我们需要介绍另外两个参数SSR和SST,因为确定系数就是由它们两个决定的

(1)SSR:Sum   of squares of the regression,即预测数据与原始数据均值之差的平方和,公式如下

(2)SST:Total sum of squares,即原始数据和均值之差的平方和,公式如下    细心的网友会发现,SST=SSE+SSR,呵呵只是一个有趣的问题。而我们的“确定系数”是定义为SSR和SST的比值,故

其实“确定系数”是通过数据的变化来表征一个拟合的好坏。由上面的表达式可以知道“确定系数”的正常取值范围为[0   1],越接近1,表明方程的变量对y的解释能力越强,这个模型对数据拟合的也较好。

(二)第二种方法

一是看相关系数如何越接近1越好,一般要求大于0.9,统计量的概率一般要小于0.05,所做的模型才可以使用。

此外残差的置信区间应该包括0,但是对于拟合到什么程度,才算满意没有严格的标准来进行界定。

MATLAB 利用三点进行函数曲线拟合 + 如何评价拟合曲线好坏相关推荐

  1. MATLAB利用散点进行函数曲线拟合

    Matlab是一个很强大的数据处理软件,是人们进行数据分析的得力助手.一般我们做社会调研或科学研究时,会得到很多实验数据.当需要研究两个变量之间的关系时,经常要用到曲线拟合.曲线拟合不仅能给出拟合后的 ...

  2. matlab:<三>freqz函数

    [转载:博客] 一 函数调用介绍 MATLAB提供了专门用于求离散系统频响特性的函数freqz(),调用freqz()的格式有以下几种: (1)[H,w]=freqz(B,A,N);  %N默认值为5 ...

  3. 七参数坐标转换 matlab,利用三点法求解空间坐标系转换所需的七参数

    同一个物体的点云在不同坐标系中的坐标表示不同,有时候需要将其进行转换到同一坐标系中进行处理,经典的方法为七参数法(7-parameters),用matlab实现如下: %PS.好久不用matlab了, ...

  4. matlab——利用intlinprog和linprog函数求线性规划问题最优解

    函数简介 intlinprog和linprog都是matlab自带的两种函数,功能大体相同.都是用来求解线性规划问题的最优解,只是intlinprog用于求整数解而已. 线性规划问题 下图是一个线性规 ...

  5. matlab pup,matlab利用bar函数画不同颜色直方图

    matlab利用bar函数画直方图,参考文献[1]是matlab官方提供的help文档.里面提供了bar函数的基本用法,但是没有说明如何在同一张图中,为每个bar设置不同的颜色. 例子代码: myda ...

  6. matlab与simulink结合,code-matlab 利用SIMULINK和M函数相结合的方式仿真BFSK 调制在 联合开发网 - pudn.com...

    code-matlab 所属分类:matlab例程 开发工具:matlab 文件大小:15KB 下载次数:48 上传日期:2014-05-16 15:27:09 上 传 者:陈思远 说明:  利用SI ...

  7. matlab利用bar函数画不同颜色直方图

    matlab利用bar函数画直方图,参考文献[1]是matlab官方提供的help文档.里面提供了bar函数的基本用法,但是没有说明如何在同一张图中,为每个bar设置不同的颜色. 例子代码: myda ...

  8. 遍历图像 找最小外接矩形 matlab,2018a版本MatLab利用regionprops函数获取图片中物体轮廓最小外接矩形...

    2018a版本MatLab利用regionprops函数获取图片中物体最小外接矩形 本次内容,用于介绍利用matlab中的regionprops函数来获取图像区域中的物体的最小外接矩形信息(位置(x, ...

  9. matlab利用函数 编程求,MATLAB 函数编写方法与应用

    试探结构: MATLAB 从 5.2 版本开始提供了一种新的试探式语句结构,其一般的形式为: try 语句段1 catch 语句段2 end 本语句结构首先试探性地执行语句段 1,如果在此段语句执行过 ...

最新文章

  1. Tensorflow--Debug
  2. 简单工厂抽象工厂工厂方法_让工厂美丽
  3. Unable to locate the default servlet for serving static content. Please set the 'defaultServletName'
  4. Shell编程 之 while循环 和 until循环 和 总结
  5. ssm返回oracle序列,SSM之JSON通用返回格式
  6. maven中如何打jar包
  7. 计算机公共课3-字处理软件Word 2010
  8. 移动磁盘显示数据错误循环冗余检查数据怎样恢复
  9. between ..... and 用法
  10. navicat for mysql 12 破解工具 亲测可用
  11. 这是一个秘密,是一个秘密
  12. Error starting stream. VIDIOC_STREAMON: Protocol error Unable to use mmap. Using read instead. Unabl
  13. 层次聚类算法之single-linkage和complete-linkage(C语言实现)
  14. Postgresql的Listen-Notify机制
  15. 谈谈对Spring IOC(控制反转)的理解
  16. unity把公共方法在Inspector 界面上实现一个按钮点击直接调用的最快最方便的方式
  17. 在 JavaScript 中按字母顺序排序 - 如何在 JS 中按名称排序
  18. 百度关键字优化精灵下载-批量免费百度关键词优化软件
  19. 冬枣的功效与作用及营养价值
  20. win10解除限制网速的方法【系统天地】

热门文章

  1. Python学习笔记3—第3章 列表简介
  2. 网页设计与制作(一)
  3. 手动生成token_生成 Token
  4. linux+usb刻录,如何在Ubuntu上安装Etcher-开源USB刻录机工具
  5. 我的世界java版如何装mod_Java版 Mod(模组)API下载 | Mod安装教程 [1.13.2-1.2.5]
  6. 一个屌丝程序猿的人生(六十五)
  7. 后渗透篇:常见backdoor和persistence方式方法
  8. 用C语言将 cobalt strike的木马,写入启动项
  9. php有赞sdk,youzan-sdk/README.md at master · imhui/youzan-sdk · GitHub
  10. 免费ocr 吊打百度收费ocr 摄像头直接图片识别文字,本地搭建ocr服务器