(数学建模)最⼩⼆乘法(第⼀章)多项式拟合实例(matlab实现)
⼀、什么是最⼩⼆乘法
最⼩⼆乘法在⽣活中的例⼦:
拿测⼀个⼈的⾝⾼为例,现实⽣活中我们⽆法⽤测量仪器完全准确地测得⼀个⼈的⾝⾼,相应地,⽤任何仪器测量都会存在误差。当然,我们求某⼈的⾝⾼时也不需要完全准确,我们只要使误差在⼀定范围之内就⾏了。⽐如我们⽣活中并不认为1.831⽶和1.832⽶⾝⾼的⼈有什么区别。但是我们会觉得1.83⽶的⼈和1.85⽶的⼈有所差别,⽐如很多⼥⽣会更喜欢⾝⾼为后者的男⽣,因⽽我们要把测量⾝⾼的误差控制在0.01⽶以内。这⾥我们⽤v代表误差。
那么这就引出了⼀个问题,如何来降低误差。
matlab求导很直观的想法就是去求样本的平均数,⽐如测五次同⼀个⼈的⾝⾼,求五个样本的平均数,然后就认为这个平均数就是这个⼈的⾝⾼。那么问题来了,为什么要⽤算数平均数,⽽不是中位数、⼏何平均数还有调和平均数之类的。
要解决这个问题,⾸先我们得假设⼀个值就是这个⼈的准确⾝⾼。⽐如我们假设某个值y就是⾝⾼的准确值,那么误差v就是 |y-yi| ,(yi代表样本,就是每次的⾝⾼测量值)(如下图)
⿊⾊直线长度即代表误差⼤⼩,既然是长度,那就是⼀个绝对值,但由于|y-yi|不⽅便计算,故⽽直接⽤平⽅来代表这个误差,误差为(y-yi)^2,总误差v即所有样本误差之和,因此最⼩⼆乘法的⽬标就是求出使总误差v尽量⼩的y。
要求总误差v的最⼩值,我们对v求导,使导数为0,此时对应的y恰好就是样本yi的算数平均数。
⼆、最⼩⼆乘法的应⽤
上⾯的测⾝⾼只展⽰了最⼩⼆乘法的⼀个简单的应⽤,事实上,最⼩⼆乘法为我们提供了⼀个思路:我们可以先假设⼀个“准确值y”,然后⽤这个准确值和其它样本,将误差表⽰出来,再对误差求导,以此求出误差最⼩时的y,这个y画成线,就可以代表样本中变量的关系。(如下图)
这⾥我们就⽤蓝线拟合了红⾊的点,我们也就可以⽤蓝线的⽅程来表⽰横轴的变量和纵轴的变量之间的关系(本例⼦为y=2*x)。
下⾯我们再举⼀个例⼦:
matlab⾥⾯的polyfit函数可以⽤最⼩⼆乘法来对给定的数据进⾏拟合,其有三个参数ployfit(x,y,n)表⽰⽤最⾼次数为n次幂的函数来拟合y与x的关系。(如上图就是⽤了⼀次函数y=2*x来进⾏拟合)
我们随便输⼊⼀些数据,如代码所⽰:
clear all
clc
x=[0.3 0.35 0.4 0.7 0.92 1.2 1.92 2.4 2.8 3.6 4.5];
y=[1 3 2 4 5 7 6 7 6 9 10];
plot(x,y,'bo');
axis([-1 6 0 11]);
(x和y的散点图如下图)
我们对其进⾏拟合:
先⽤最⾼次为⼀次幂的⽅法。
⼀次幂就是y=a*x+b,polyfit函数求的就是a和b的值,更⾼次幂依次类推。代码如下:
clear all
clc
x=[0.3 0.35 0.4 0.7 0.92 1.2 1.92 2.4 2.8 3.6 4.5];
y=[1 3 2 4 5 7 6 7 6 9 10];
p1=polyfit(x,y,1) %求拟合曲线的参数。这⾥的1代表⽤1次函数拟合
y2=polyval(p1,x) %求拟合曲线下,y的值
figure;
plot(x,y,'ro');
hold on;
plot(x,y2,'b-');
axis([0 5 0 12]);
这其中,p1=polyfit(x,y,1) 是核⼼语句,⽤于求拟合曲线的参数。这⾥的1代表⽤1次函数拟合(曲线见上图)。当我们把1变为2或者更⼤
时,
值得注意的是,选取次数的时候,次数长度不得超过length(x)-1。
三、作者
Bowen
本笔记中所有代码和图均为原创,转载请注明出处,谢谢合作。笔者⽔平有限,欢迎⼤家⼀起交流学习。
发布评论