写在前文,懒编正准备参加数学建模并负责编程部分,写文章的初衷是为了加深自己的记忆。当然,如果可以帮助到其他人我也是很开心的。我主要介绍的是拟合算法的应用,所以接下来的文章更适合和我有一样工作的同学浏览。
今天学习了一个新算法——拟合算法
经过学习,发现拟合算法在数学建模中可以进行预测。
下面我们来瞅瞅这神奇的算法。
1、插值算法和拟合算法的区别
前面介绍过插值法,插值算法和拟合算法在某些方面好像是类似的,但其实却大有不同。
比如有几个已知点。
插值是按照一定的规律将几个点用线串起来,即寻求串的规律最好。但如果样本点过多,那么这个多项式次数过高,会造成龙格现象。而拟合是寻求一个曲线使得该曲线在某种准则下与所有的数据点最为接近,即曲线拟合的最好。只要保证拟合误差足够小就可。
2、引例及知识点
2.1、题目说明
用matlab生成两组数据:x(1-10之间的[10,1]的矩阵)和y(1-20之间的[10,1]的矩阵)
我们设置拟合曲线为y = kx + b(x的次数越高,拟合的误差SSE(这个参数后文有介绍)越小,但是我们一般选取简单的模型,所以在SSE相差不多的情况下,选取低阶的拟合曲线)
求样本点和拟合曲线最接近时,k和b的值
2.2、解题步骤
用matlab实现拟合有两种办法,一种是用上面我给出的公式去进行计算,另外一种就是用cftool工具箱
(matlab中的cftool可以实现拟合)所谓“有便宜不占wbd”(hhh开玩笑) 我这里用cftool实现一下,因为真的很方便。
直接在命令行输入“cftool”运行就可以!
① 在界面左侧这里输入x和y。然后cftool可以直接使用一次函数进行拟合。
② 如果要设置其他拟合方式可以在界面右侧的这里进行选择
③ 在界面右侧会生成这样一个图像(会发现点和曲线其实差的很远,这是因为我的x和y是随机生成的)
④ 然后所求的k和b matlab 直接就可以算出来(p1就是k,p2就是b)
这里发现出现了一个SSE和R—square
接下来来解释一下这两个重要的参数,此俩其实是评价拟合的好坏的两个参数
2.3、解释SSE、R—squre
① SSE是误差平方和。根据它的名字就可以看出来,我们可以根据这个参数来评价拟合的好坏。SSE越小,拟合的程度越好。(SSE也是可以算出来的,有公式,我这里就不介绍了)
② R—squre是拟合优度。这个参数越接近1,说明误差平方和越接近0,拟合程度越好。
这里特别要注意的一点是:既然两个参数都能评判拟合程度的好坏。那选哪个呢?
R—squre只能用于拟合函数是线性函数(相对于参数而言而不是变量)时,而SSE适用于所有情形。
所以当我们的拟合函数不是线性函数时,用SSE评价就好了。
3、实例
3.1、题目说明
下表是中国人口数据(数据是捏造的),请预测后10年的中国人口
年份 | 人口(百万) |
---|---|
2009 | 133126 |
2010 | 133770 |
2011 | 134413 |
2012 | 135069 |
2013 | 135738 |
2014 | 136427 |
2015 | 137122 |
2016 | 137866 |
2017 | 138639 |
2018 | 139539 |
2019 | 140000 |
3.2、解题
①== 一次函数拟合==
代码如下:(预测的人口用图像画出来)
运行结果如下:
可以看出,由于我们原本数据就接近符合一次函数,之后预测的人口是按照一次函数增长的。
SSE 为:
发现SSE是92460,这个数相对于我们原本的数字来说是一个1/10倍的关系。
② 傅里叶拟合(这里我是随便挑选了一个模型进行尝试)
代码如下:
运行结果如下:
SSE为:
发现这个数字比用一次函数进行预测的误差平方和小了,也就是说傅里叶拟合与一次函数拟合相比更适合本题预测。
注:
其他各个函数拟合都可以进行试验,选择SSE最小的即可。
本文参考清风老师数学建模视频
https://www.bilibili.com/video/BV1DW411s7wi?p=6