【数学建模笔记】【第四讲(1)】拟合算法之最小二乘算法及其MATLAB实现
与插值问题不同,在拟合问题中不需要曲线一定经过给定的点。拟合问题的目标是寻求一个函数(曲线),使得该曲线在某种准则下与所
有的数据点最为接近,即曲线拟合的最好(最小化损失函数)
最小二乘法拟合算法及其MATLAB实现
-
-
- 1.最小二乘法的几何解释:
- 2.为什么不用四次方?
- 3.MATLAB求解最小二乘:
- 4. 如何评价拟合的好坏(拟合优度)
- 5.线性函数的定义与介绍
- 6.用MATLAB计算拟合优度
-
【插值和拟合的区别】
插值算法中,得到的多项式f(x)要经过所有样本点。但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象。
尽管我们可以选择分段的方法避免这种现象,但是更多时候我们更倾向于得到一个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即可,这就是拟合的思想。(拟合的结果是得到一个确定的曲线,而插值可以得到很多曲线,只不过是预测精度不大一样)

【结合MATLAB演示最小二乘法拟合】
给定一些数据点:
| x | y |
|---|---|
| 4.2 | 8.4 |
| 5.9 | 11.7 |
| 2.7 | 4.2 |
| 3.8 | 6.1 |
| 3.8 | 7.9 |
| 5.6 | 10.2 |
| 6.9 | 13.2 |
| 3.5 | 6.6 |
| 3.6 | 6 |
| 2.9 | 4.6 |
| 4.2 | 8.4 |
| 6.1 | 12 |
| 5.5 | 10.3 |
| 6.6 | 13.3 |
| 2.9 | 4.6 |
| 3.3 | 6.7 |
| 5.9 | 10.8 |
| 6 | 11.5 |
| 5.6 | 9.9 |
设这些样本点为
(
x
i
,
y
i
)
,
i
=
1
,
2
,
3
,
…
…
,
n
(x_i,y_i),i=1,2,3,……,n
(xi,yi),i=1,2,3,……,n
我们设置的拟合曲线为
y
=
k
x
+
b
y=kx+b
y=kx+b.
问题在于,当
k
k
k和
b
b
b取何值时,使得样本点和拟合曲线更接近?
我们使用MATLAB先将这些点画在图中:
在MATLAb的变量存储区新建x和y变量,然后把我们的数据复制进去:


新建好这两个变量之后,可以把两个变量选中,然后保存在和代码同一个目录的文件夹下,保存为mat文件:

这样我们如果删除了这两个变量,仍然可以通过load demo 来加重新加载这两个变量。
通过plot命令可以绘制出这个散点图:

那么如何确定拟合曲线呢?这里我们使用最小二乘法。
1.最小二乘法的几何解释:

第一种定义有绝对值,不容易求导,因此计算比较复杂。
所以我们往往使用第二种定义,这也正是最小二乘的思想。
2.为什么不用四次方?
- 避免极端数据对拟合曲线的影响。
- 最小二乘法得到的结果和MLE极大似然估计一致。
- 不用奇数次方的原因:误差会正负相抵。
求解最小二乘法:

详细证明可以看我写的超级好的手写版【doge】😎



3.MATLAB求解最小二乘:

对应的求
k
^
\hat{k}
k^和
b
^
\hat{b}
b^的MATLAb
代码是:
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))
求出
k
^
\hat{k}
k^和
b
^
\hat{b}
b^之后就可以画出这个拟合函数
y
=
k
^
x
+
b
^
y=\hat{k}x+\hat{b}
y=k^x+b^了:
% % 画出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')

那么有了拟合函数我们如何判断拟合的好不好呢?
4. 如何评价拟合的好坏(拟合优度)
拟合优度(可决系数)
R
2
R^2
R2
- 总体平方和
S
S
T
SST
SST:
Total sum of squares
:
S
S
T
=
∑
i
=
1
n
(
y
i
−
y
i
‾
)
2
\text{Total sum of squares}:SST=\sum_{i=1}^n(y_i-\overline{y_i})^2
Total sum of squares:SST=∑i=1n(yi−yi)2
- 误差平方和
S
S
E
SSE
SSE:
The sum of squares due to error
:
S
S
E
=
∑
i
=
1
n
(
y
i
−
y
i
^
)
2
\text{The sum of squares due to error}:SSE=\sum_{i=1}^n(y_i-\hat{y_i})^2
The sum of squares due to error:SSE=∑i=1n(yi−yi^)2
- 回归平方和
S
S
R
SSR
SSR:
Sum of squares of the regression:
:
S
S
R
=
∑
i
=
1
n
(
y
i
^
−
y
i
‾
)
2
\text{Sum of squares of the regression:}:SSR=\sum_{i=1}^n(\hat{y_i}-\overline{y_i})^2
Sum of squares of the regression::SSR=∑i=1n(yi^−yi)2
可以证明:
S
S
T
=
S
S
R
+
S
S
E
SST=SSR+SSE
SST=SSR+SSE(要用到我们求导得到的两个等式)
拟合优度:
0
<
=
R
2
=
S
S
R
S
S
T
=
S
S
T
−
S
S
E
S
S
T
=
1
−
S
S
E
S
S
T
<
=
1
0<=R^2= \frac{SSR}{SST}= \frac{SST-SSE}{SST}=1- \frac{SSE}{SST}<=1
0<=R2=SSTSSR=SSTSST−SSE=1−SSTSSE<=1
R
2
R^2
R2越接近1,说明误差平方和越接近0,误差越小说明拟合的越好。
注:
-
R
2
R^2
R2只能用于拟合函数是线性函数时拟合结果的评价,因为
S
S
T
=
S
S
R
+
S
S
E
SST=SSR+SSE
SST=SSR+SSE这个等式只有在拟合函数是线性的时候才成立,其证明如下图
- 线性函数和其他函数(例如复杂的指数函数)比较拟合的好坏,直接看
S
S
E
SSE
SSE即可。
- 拟合的函数越复杂(比如说次数越高),最后得出的拟合优度肯定是越小,SSE也越小(因为次数越高,到最后可能拟合函数穿过了所有的数据点,SSE就为0了),但是这与拟合的初衷相矛盾了,我们希望用一个简单的函数去打到一个相对很好的拟合效果。所以不要过度追求高阶次,复杂的拟合函数,而是要在简单拟合函数与
R
2
R^2
R2越小之间找到一个平衡点。
证明SST=SSE+SSR:

5.线性函数的定义与介绍
上面谈到了
R
2
R^2
R2只能用于拟合函数是线性函数时拟合结果的评价,那么什么是线性函数呢?只有一次函数是线性函数吗?其实不是的。
思考:
y
=
a
+
b
x
2
y=a+bx^2
y=a+bx2是线性函数吗?
是的。因为我们这里说的线性函数是指对参数为线性(线性于参数)。

如何判断线性于参数的函数?
在函数中,参数仅以一次方出现,且不能乘以或除以其他任何的参数,并不能出现参数的复合函数形式。
比如下面的三种函数都是线性于参数的函数:

而
y
=
a
(
x
−
b
)
2
,
y
=
a
s
i
n
(
b
+
c
x
)
y=\frac{a}{(x-b)^2},y=asin(b+cx)
y=(x−b)2a,y=asin(b+cx)等都不是线性于参数的函数,不能使用
R
2
R^2
R2。
6.用MATLAB计算拟合优度
-
S
S
T
=
∑
i
=
1
n
(
y
i
−
y
i
‾
)
2
SST=\sum_{i=1}^n(y_i-\overline{y_i})^2
SST=∑i=1n(yi−yi)2
S
S
E
=
∑
i
=
1
n
(
y
i
−
y
i
^
)
2
SSE=\sum_{i=1}^n(y_i-\hat{y_i})^2
SSE=∑i=1n(yi−yi^)2
S
S
R
=
∑
i
=
1
n
(
y
i
^
−
y
i
‾
)
2
SSR=\sum_{i=1}^n(\hat{y_i}-\overline{y_i})^2
SSR=∑i=1n(yi^−yi)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) % 总体平方和SST-SSE-SSR % 5.6843e-14 = 5.6843*10^-14 matlab浮点数计算的一个误差R_2 = SSR / SST
本篇文章就到这里啦,下一篇文章继续讲解MATLAB中拟合函数工具箱的使用。
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/47b7c4e9ca.html
