与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好(最小化损失函数)。
插值算法中,得到的多项式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的值');

设这些样本点为(xi,yi),i=1,2,…,n,我们可以设置拟合曲线为y = k*x+b
利用最小二乘法:
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
利用一元线性函数,得到拟合出来的图像 :
得出结果后,如何知道自己拟合数据图形的好坏呢?
这里需要用到拟合优度R²,与R²有关的三个系数SSR、SSE、SST:
可以证明: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
(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
同时,也会在工具箱窗口中显示拟合曲线。
如果在正式数模比赛中,利用拟合工具箱拟合出来的曲线,可以通过以下步骤将拟合出曲线的代码导出:Curve Fitting Tool ->文件 ->Generate Code ->再使用保存快捷键Ctrl+S即可
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227929.html原文链接:https://javaforall.net
