MATLAB拟合算法

与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好(最小化损失函数)。

插值算法中,得到的多项式f(x)要经过所有样本点。但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象。尽管我们可以选择分段的方法避免这种现象,但是更多时候我们更倾向于得到一个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即可,这就是拟合的思想。(拟合的结果是得到一个确定的曲线)

先给出一组例子:

clear;clc;
x = 0.1:0.1:1;
y = [1.978,2.45,3.28,6.16,7.34,7.66,9.58,9.48,9.3,11.2];
plot(x,y,'o')
xlabel('x的值');
ylabel('y的值');

MATLAB拟合算法_第1张图片

设这些样本点为(xi,yi),i=1,2,…,n,我们可以设置拟合曲线为y = k*x+b

利用最小二乘法:MATLAB拟合算法_第2张图片

n = size(x,1);
k = (n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.*x)-sum(x)*sum(x))
b = (sum(x.*x)*sum(y)-sum(x).*sum(x.*y))/(n*sum(x.*x)-sum(x).*sum(x))
hold on 
grid on 
f=@(x) k*x+b;
fplot(f,[0,1]);
legend('样本数据','拟合函数','location','SouthEast')
hold off 

利用一元线性函数,得到拟合出来的图像 :MATLAB拟合算法_第3张图片

得出结果后,如何知道自己拟合数据图形的好坏呢?

这里需要用到拟合优度R²,与R²有关的三个系数SSR、SSE、SST:MATLAB拟合算法_第4张图片

可以证明:SST = SSE + SSR 

 R² =SSR/SST(R²越接近1,说明误差平方和越接近0,误差越小说明拟合的越好。注意:R2只能用于拟合函数是线性函数时,拟合结果的评价,线性函数和其他函数(例如复杂的指数函数〉比较拟合的好坏,直接看SSE即可,假如R2是个负数,说明拟合效果不好)

(我们这里说的线性函数是指对参数为线性(线性于参数)。)

因此引入一个概念:

1、对变量为线性

对线性的第一种并且也许是更“自然”的一种解释是,¥的条件期望值是X;的线性函数。从几何意义上说,这时回归曲线是一条直线。按照这种解释,诸如 E(Y|X)=β1+β2*X²的回归函数,由于变量X以幂或指数⒉出现,就不是线性的。

2、对参数为线性

对线性的第二种解释是,Y的条件期望E(Y│X)是参数β的一个线性函数;它可以是或不是变量X的线性函数。2对于这种解释,E(Y |X)=β1+β2*X²就是一个线性(于参数〉回归模型。为了看出这-一点,让我们假设X取值为3。因此,E(Y |X=3)=β1+9β2,显然它是β和的线性函数。

计算拟合优度的代码:

y_hat = k *x+b;                     % y的拟合值
SSR = sum ( (y _hat-mean (y) ) .^2) %回归平方和
SSE = sum( (y _hat-y).^2)           %误差平方和
SST = sum ( (y-mean(y) ).^2)        %总体平方和
R_2 = SSR / SST

以上是利用最小二乘法的思想对数据进行拟合,matlab中也有自带的“拟合工具箱”:cftool

进入曲线拟合工具箱界面“Curve Fitting tool”
(1)点击“Data”按钮,弹出“Data”窗口;
(2)利用X data和Y data的下拉菜单读入数据x,y,可修改数据集名“Data set name”,然后点击“Create data set”按钮,退出“Data”窗口,返回工具箱界面,这时会自动画出数据集的曲线图;
(3)点击“Fitting”按钮,弹出“Fitting”窗口;
(4)点击“New fit”按钮,可修改拟合项目名称“Fit name”,通过“Data set”下拉菜单选择数据集,然后通过下拉菜单“Type of fit”选择拟合曲线的类型,工具箱提供的拟合类型有:

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框中得到拟合结果,如下例:

general model:
f(x) = a*x*x+b*x
Coefficients (with 95% confidence bounds):
a = 0.009194 (0.009019, 0.00937)
b = 1.78e-011 (fixed at bound)
Goodness of fit:
SSE: 6.146
R-square: 0.997
Adjusted R-square: 0.997
RMSE: 0.8263

同时,也会在工具箱窗口中显示拟合曲线。

这样,就完成一次曲线拟合啦,十分方便快捷。当然,如果你觉得拟合效果不好,还可以在“Fitting”窗口点击“New fit”按钮,按照步骤(4)~(5)进行一次新的拟合。
不过,需要注意的是,cftool 工具箱只能进行单个变量的曲线拟合,即待拟合的公式中,变量只能有一个。对于混合型的曲线,例如 y = a*x + b/x ,工具箱的拟合效果并不好。、

如果在正式数模比赛中,利用拟合工具箱拟合出来的曲线,可以通过以下步骤将拟合出曲线的代码导出:Curve Fitting Tool ->文件 ->Generate Code ->再使用保存快捷键Ctrl+S即可

你可能感兴趣的:(记录我的学习过程,matlab,算法,矩阵)