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

根据以下帖子整理:

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

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为拟合数据点。另外在实验中还加了一个随机噪声。结果如图:

image

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);

结果如下图:

image

此外,高斯曲线的拟合也可以通过转化为多项式拟合的方法实现,先将被拟合数据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)

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

image                image

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,但是对于拟合到什么程度,才算满意没有严格的标准来进行界定。

猜你喜欢

转载自blog.csdn.net/Mo18312723429/article/details/85804617