与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好(最小化损失函数)。
拟合概念
拟合代码
代码:
clear;clc load data1 plot(x,y,'o') % 给x和y轴加上标签 xlabel('x的值') ylabel('y的值') 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 % 显示网格线 % % 画出y=kx+b的函数图像 plot(x,y) % % 传统的画法:模拟生成x和y的序列,比如要画出[0,5]上的图形 % xx = 2.5: 0.1 :7 % 间隔设置的越小画出来的图形越准确 % yy = k * xx + b % k和b都是已知值 % plot(xx,yy,'-') % 匿名函数的基本用法。 % handle = @(arglist) anonymous_function % 其中handle为调用匿名函数时使用的名字。 % arglist为匿名函数的输入参数,可以是一个,也可以是多个,用逗号分隔。 % anonymous_function为匿名函数的表达式。 % 举个小例子 % z=@(x,y) x^2+y^2; % z(1,2) % % ans = 5 % fplot函数可用于画出匿名一元函数的图形。 % fplot(f,xinterval) 将匿名函数f在指定区间xinterval绘图。xinterval = [xmin xmax] 表示定义域的范围 f=@(x) k*x+b; fplot(f,[2.5,7]); legend('样本数据','拟合函数','location','SouthEast') 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) % 总体平方和 SST-SSE-SSR % 5.6843e-14 = 5.6843*10^-14 matlab浮点数计算的一个误差 R_2 = SSR / SST
如果不是线性函数,直接看SSE
注意:此处所说的线性函数是对参数线性
拟合工具箱
首先选择数据
% (1) X data 选择 year
% (2) Y data 选择 population
% (3) 拟合方式选择:Custom Equation (自定义方程)
% (4) 修改下方的方框为:x = f(t) = xm/(1+(xm/3.9-1)*exp(-r*(t-1790)))
% (5) 左边的result一栏最上面显示:Fit computation did not converge:即没有找到收敛解,右边的拟合图形也表明拟合结果不理想
% (6) 点击Fit Options,修改非线性最小二乘估计法拟合的初始值(StartPoint), r修改为0.02,xm修改为500
% 有很多同学有疑惑,初始值为什么要这样设置?我们在未来学习微分方程模型和智能算法的课程时再来给大家介绍这里面蕴含的技巧。
% (7) 此时左边的result一览得到了拟合结果:r = 0.02735, xm = 342.4
% (8) 依次点击拟合工具箱的菜单栏最左边的文件—Generate Code(导出代码到时候可以放在你的论文附录),可以得到一个未命名的脚本文件
% (9) 在这个打开的脚本中按快捷键Ctrl+S,将这个文件保存到当前文件夹。
% (10) 在现在这个文件中调用这个函数得到参数的拟合值和预测的效果
clear;clc year = 1790:10:2000; population = [3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,150.7,179.3,204.0,226.5,251.4,281.4]; plot(year,population,'o') cftool % 拟合工具箱 % (1) X data 选择 year % (2) Y data 选择 population % (3) 拟合方式选择:Custom Equation (自定义方程) % (4) 修改下方的方框为:x = f(t) = xm/(1+(xm/3.9-1)*exp(-r*(t-1790))) % (5) 左边的result一栏最上面显示:Fit computation did not converge:即没有找到收敛解,右边的拟合图形也表明拟合结果不理想 % (6) 点击Fit Options,修改非线性最小二乘估计法拟合的初始值(StartPoint), r修改为0.02,xm修改为500 % 有很多同学有疑惑,初始值为什么要这样设置?我们在未来学习微分方程模型和智能算法的课程时再来给大家介绍这里面蕴含的技巧。 % (7) 此时左边的result一览得到了拟合结果:r = 0.02735, xm = 342.4 % (8) 依次点击拟合工具箱的菜单栏最左边的文件—Generate Code(导出代码到时候可以放在你的论文附录),可以得到一个未命名的脚本文件 % (9) 在这个打开的脚本中按快捷键Ctrl+S,将这个文件保存到当前文件夹。 % (10) 在现在这个文件中调用这个函数得到参数的拟合值和预测的效果 [fitresult, gof] = createFit(year, population) t = 2001:2030; xm = 342.4; r = 0.02735; predictions = xm./(1+(xm./3.9-1).*exp(-r.*(t-1790))); % 计算预测值(注意这里要写成点乘和点除,这样可以保证按照对应元素进行计算) figure(2) plot(year,population,'o',t,predictions,'.') % 绘制预测结果图