前言
最小二乘是学习很多原理绕不开的一个数学基础,比如之前在听高翔的视觉slam十四讲的时候就涉及到,当时也没太明白就感觉特别高深,但是在后期的学习过程中发现,这种数学基础是无法绕开的,所以打算学习一下看看这到底是个什么事,本文章讲的在我看来是特别易懂,但也可能是学习的不够深层次,发现有误或者有其他的观点的大佬们,欢迎批评指正。自己做了一些笔记,这个笔记的内容是听某站一个up主的讲解,链接在下面:https://www.bilibili.com/video/BV1M84y1N73X/?spm_id_from=333.337.search-card.all.click&vd_source=263a64ed56097192143bae1219c08852
抛出问题
在我们去学习最小二乘的时候,首先要清楚最小二乘是干嘛的。
用一个简单的例子去说明吧,给定以下x值以及其对应的f(x)值,我们将下面这个点在图像中画出来
x | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 |
f(x) | -3.2 | -2.1 | -1.2 | 0.1 | 0.9 | 2.1 | 3.3 | 4 |
上图中黑色的点是表格中数据描出来的点,我们可以看出来这些黑色的点是不在同一条直线上的,那我们如何找一条类似于图中红色的线去尽可能接近的将这些点表示出来,这就是用的最小二乘拟合。(当然也可以拟合二次三次甚至更高次的曲线),所以总结出最小二乘的目的:给定点x以及其对应的f(x),连结曲线,根据杂乱点连成的曲线拟合出一条最接近他的曲线。
如何进行最小二乘拟合的计算
这里的讲解我打算用两个具体的例子进行说明,便于大家更好的理解,更好的去进行最小二乘拟合的计算。
例1:本例就去解决上面数据的问题,问题是如何通过以上数据去拟合出一条y=ax+b的直线?
先给出公式:
我们再详细说一下这个公式怎么用:
0矩阵里面的值全为1,有n个x,就是n个1;
1矩阵里面的值就是将x的值全部写进去;
f 矩阵里面的值就是将f(x)的值全部写进去;
α0就是我们要算的x的0次方的系数,即b;
α1是我们要算的x的1次方的系数,即a;
根据公式,我们来计算这个例题。
0=(1,1,1,1,1,1,1,1)的转置,因为本题中有8个x值;
1=(-3,-2,-1,0,1,2,3,4)的转置,根据例题中给的x值将其全部代入;
f = (-3.2,-2.1,-1.2,0.1,0.9,2.1,3.3,4)的转置,根据例题中给的f(x)的值将其全部代入;
令α0 = b,α1 = a;
(0,
0)=1*1+1*1+1*1+···+1*1=8(一共是8个1*1相加);
(0,
1)=1*(-3)+1*(-2)+···+1*4=4(即
0的各项与
1的对应项相乘之和)
同理可求(1,
0)=4,(
1,
1)=44,(f,
0)=3.9,(f,
1)=46;
所以得到
即解一个二元一次方程组
解得a=1.048810,b=-0.036905,故拟合的直线为 y = 1.048810x - 0.036905
例2:给定下表数据,用二次多项式拟合数据(即y=ax方+bx+c)
x | -2 | -1 | 0 | 1 | 2 |
f(x) | 0 | 1 | 2 | 1 | 0 |
给出公式:
对参数进行一个解释,其实和上个例题总体差不多。
0矩阵里面的值全为1,有n个x,就是n个1;
1矩阵里面的值就是将x的值全部写进去;
2矩阵里面的值就是将x的平方值全部写进去;
f 矩阵里面的值就是将f(x)的值全部写进去;
α0就是我们要算的x的0次方的系数,即c;
α1是我们要算的x的1次方的系数,即b;
α2是我们要算的x的1次方的系数,即a;
于是我们将对应的值写进去,最后其实就是解一个三元一次方程组,下图是具体过程:
至此,我们求解二次多项式的拟合数据也完成了。
以此类推,那么如何求解三次多项式的拟合数据呢,基本方法是一样的,直接放图:
总结
至此例题就全部讲完了,相信大家应该对最小二乘拟合有了一个初步的认识,希望这篇blog对大家理解学习最小二乘有一定的帮助,也欢迎大家继续学习,讨论,纠错!