一、前言

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


插值和拟合的区别:插值算法中,得到的多项式 f ( x ) f(x) f(x)要经过所有的样本点。但是如果样本点过多,得到的多项式会次数很高,从而导致龙格现象。尽管可以采用分段的方法避免这种现象,大使更多的时候更倾向于得到一个确定的曲线,尽管这条曲线不能经过所有的样本点,但只要保证误差足够小即可,这就是拟合的思想(拟合的结果就是得到一个确定的曲线)。


二、最小二乘法

设样本点为 ( x i , y i ) , i = 1 , 2 , … , n (x_i,y_i),i=1,2,…,n (xi​,yi​),i=1,2,…,n,假设拟合曲线为 y = k x + b y=kx+b y=kx+b

利用最小二乘法求定义求拟合曲线的方法为:
y ^ i = k x i + b \hat{y}_i=kx_i+b y^​i​=kxi​+b

其中: k ^ i , b ^ i = a r g min ⁡ k , b ( ∑ i = 1 n ( y i − y ^ i ) 2 ) \text{其中:}\hat{k}_i,\hat{b}_i=\underset{k,b}{arg\min}\left( \sum_{i=1}^n{\left( y_i-\hat{y}_i \right) ^2} \right) 其中:k^i​,b^i​=k,bargmin​(i=1∑n​(yi​−y^​i​)2)


三、求解最小二乘法

设样本点为 ( x i , y i ) , i = 1 , 2 , … , n (x_i,y_i),i=1,2,…,n (xi​,yi​),i=1,2,…,n,设置拟合曲线为 y = k x + b y=kx+b y=kx+b,令拟合值为 y ^ i = k x i + b \hat{y}_i=kx_i+b y^​i​=kxi​+b

那么:
k ^ i , b ^ i = a r g min ⁡ k , b ( ∑ i = 1 n ( y i − y ^ i ) 2 ) = a r g min ⁡ k , b ( ∑ i = 1 n ( y i − k x i − b ) 2 ) \hat{k}_i,\hat{b}_i=\underset{k,b}{arg\min}\left( \sum_{i=1}^n{\left( y_i-\hat{y}_i \right) ^2} \right) =\underset{k,b}{arg\min}\left( \sum_{i=1}^n{\left( y_i-kx_i-b \right) ^2} \right) k^i​,b^i​=k,bargmin​(i=1∑n​(yi​−y^​i​)2)=k,bargmin​(i=1∑n​(yi​−kxi​−b)2)
令 L = ( ∑ i = 1 n ( y i − k x i − b ) 2 ) L=\left( \sum_{i=1}^n{\left( y_i-kx_i-b \right) ^2} \right) L=(∑i=1n​(yi​−kxi​−b)2),要找 k k k, b b b使得L最小,在机器学习中 L L L被称之为损失函数,在回归中也常被称之为残差平方和

求解满足要求的 k k k, b b b步骤如下:


四、MATLAB实现最小二乘法拟合

拟合的原始数据为:

x = 4.2,5.9,2.7,3.8,3.8,5.6,6.9,3.5,3.6,2.9,4.2,6.1,5.5,6.6,2.9,3.3,5.9,6,5.6;

y = 8.4,11.7,4.2,6.1,7.9,10.2,13.2,6.6,6,4.6,8.4,12,10.3,13.3,4.6,6.7,10.8,11.5,9.9

相关源代码:

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

代码运行结果如下所示:


五、评价拟合的好坏

几个相关指标

总体平方和SST: S S T = ∑ i = 1 n ( y i − y ˉ ) 2 SST=\sum_{i=1}^n{\left( y_i-\bar{y} \right)}^2 SST=∑i=1n​(yi​−yˉ​)2

误差平方和SSE: S S E = ∑ i = 1 n ( y i − y ^ i ) 2 SSE=\sum_{i=1}^n{\left( y_i-\hat{y}_i \right)}^2 SSE=∑i=1n​(yi​−y^​i​)2

回归平方和SSR: S S R = ∑ i = 1 n ( y ^ i − y ˉ ) 2 SSR=\sum_{i=1}^n{\left( \hat{y}_i-\bar{y} \right)}^2 SSR=∑i=1n​(y^​i​−yˉ​)2

可以证明得到: S S T = S S E + S S R SST=SSE+SSR SST=SSE+SSR

拟合优度(可决系数): 0 ⩽ R 2 = S S R S S T = S S T − S S E S S T = 1 − S S T − S S E S S T ⩽ 1 0 \leqslant \,\,R^2=\frac{SSR}{SST}=\frac{SST-SSE}{SST}=1-\frac{SST-SSE}{SST}\,\,\leqslant \,\,1 0⩽R2=SSTSSR​=SSTSST−SSE​=1−SSTSST−SSE​⩽1

说明: R 2 R^2 R2越接近于1,说明误差平方和月接近0,误差越小说明拟合的越好

注意: R 2 R^2 R2只能用于拟合函数是线性函数时(对参数为线性),拟合结果的评价。如果是比较线性函数和其他函数(例如复杂的指数函数)之间拟合的好坏,直接看 S S E SSE SSE指标即可


六 、计算拟合优度的代码

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

七、MATLAB中一个好用的曲线拟合工具箱


八 、 利用拟合工具预测美国人口

下表给出而来进2个世界的美国人口统计数据(单位:百万人),请使用下面给定的拟合函数预测后30年美国的人口数

1790 1800 1810 1820 1830 1840 1850 1860
人口 3.9 5.3 7.2 9.6 12.9 17.1 13.2 31.4
1870 1880 1890 1900 1910 1920 1930 1940
人口 38.6 50.2 62.9 76.0 92.0 106.5 123.2 131.7
1950 1960 1970 1980 1990 2000
人口 150.7 179.3 204.0 226.5 251.4 281.4

拟合函数如下:

x ( t ) = x m 1 + ( x m 3.9 − 1 ) e − r ( t − 1790 ) x\left( t \right) =\frac{x_m}{1+\left( \frac{x_m}{3.9}-1 \right) e^{-r\left( t-1790 \right)}} x(t)=1+(3.9xm​​−1)e−r(t−1790)xm​​

x m x_m xm​和 r r r是两个拟合参数, t t t表示年份, x ( t ) x(t) x(t)表示第 t t t年的人口

代码参考:

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,'.')  % 绘制预测结果图

拟合结果:


更多有关于拟合算法的经典获奖论文,关注公众号,回复,“拟合算法”,即可免费领取!!!

【4.0】 数学建模中拟合算法详解|内附清晰图片和详细代码实现相关推荐

  1. 相位 unwrap 与 wrap 算法详解(附代码)

    相位 unwrap 与 wrap 算法详解(附代码) 最近接手了一个项目,光通信方面的,我负责编写初测结果的数据处理算法,其中有一个算法叫做 unwrap 与 wrap,之前没有听说过.通过询问同事与 ...

  2. 二分查找算法详解(附代码)

    二分查找算法详解(附代码) 注: 现有一个升序 不重复的数组 查询target是否在此数组中并返回序号 使用条件 使用二分算法的两个条件: 有序 不重复 混淆处 二分算法两种方式容易弄混淆的地方:就是 ...

  3. DIV css中cursor属性详解-鼠标移到图片变换鼠标形状 (转)

    css中cursor属性详解-鼠标移到图片变换鼠标形状 语法:  cursor : auto | all-scroll | col-resize| crosshair | default | hand ...

  4. C语言实现扫雷完整算法详解~(附完整代码~)

    扫雷是一个常见小游戏,那么如何用C语言实现扫雷呢?学习了二维数组之后,我们可将扫雷的网格区域存储为二维数组,从而使用C语言实现扫雷. 目录 1.算法基本思路 2.算法详解 1.初始化数组与打印数组 2 ...

  5. 快速排序算法详解(原理,时间复杂度,实现代码)

    快速排序算法详解(原理.实现和时间复杂度) 快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出. 快 ...

  6. python中的字符串详解(附实现文字跑马灯效果)

    python中的字符串详解 1.什么是字符串 ​ 相信大家对字符串应该是再熟悉不过了吧,因为日常生活中的一句话,或是路边的一则广告,其实它都相当于一个字符串,而顾名思义,字符串也就是一串串的由零个或多 ...

  7. 数学建模4 拟合算法

    1.插值与拟合 插值算法中,得到的多项式f(x)要经过所有样本点.但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象.尽管我们可以选择分段的方法避免这种现象,但是更多时候我们倾向于得到一个确定 ...

  8. 数学建模-4.拟合算法

    拟合算法 区别于插值算法 拟合问题中不需要曲线一定经过给定点 拟合问题的目标是求出一个函数曲线,其在某种准则下与所有数据点最接近,即曲线拟合的最好(最小化损失函数) 引例 最小二乘法求解 下一步,求出 ...

  9. 【数学建模】拟合算法+Matlab实现

    学习内容: 提示:这里可以添加要学的内容 例如: 1. 了解拟合算法基本内容 2. 使用Matlab实现拟合算法 学习时间: 2020.12.09 学习产出: 1.matlab实现拟合算法的几个小例子 ...

最新文章

  1. 人脸识别的未来:对智慧城市有何影响
  2. 《游戏大师Chris Crawford谈互动叙事》一第 9 章 互动小说
  3. .NET 将文本转换成语音 (转)
  4. WCF发布到IIS7问题的解决方案
  5. 近5年133个Java面试问题列表
  6. LeetCode 1506. Find Root of N-Ary Tree(异或)
  7. Java word 内容读取
  8. (转)Struts2快速入门
  9. java 如何判断操作系统是Linux还是Windows
  10. POJ 3262 Protecting the Flowers 贪心(性价比)
  11. DG Lecture 2 part 2: points, vectors, directional derivative
  12. 4.自定义的Spring Boot Starters
  13. Ubuntu 14.04 Ruby 2.3.3 安装
  14. android思维导图软件推荐,免费好用还跨平台!这5款主流思维导图软件,每一个都让人怒赞...
  15. Minidwep-gtk字典 破 WPA
  16. 北斗卫星导航系统BDS的星座和信号
  17. 计算机win10无法打开小键盘,win10系统下小键盘数字键不能用怎么办_win10电脑小键盘数字键不能用如何解决...
  18. 8051单片机实现与GSM通讯
  19. 51 单片机晶振电路原理
  20. Windows 7 旗舰版 64位 (纯净版)

热门文章

  1. python模糊搜索_python模糊查询
  2. 如何让ps选框工具显示宽高,如何恢复原始ps界面
  3. http 响应头里content-length 的几种情况
  4. 新手做自媒体必备!0粉丝博主也可以接广告变现!
  5. 万物皆可NFT,元宇宙中的NFT到底是什么?
  6. react将字符串转义成html语句
  7. 英语名词的复数加s后如何发音
  8. 英文的设置和英文,数字的换行
  9. Kingston DataTraveler G3 4G 量产成功
  10. Ext4.2 使用iframe实现页面四宫格布局