最小二乘法浅析
为什么要讨论这个方法,因为在智能车制作的过程中经常遇到求斜率这样的问题,但由于数据是离散的,普通方法不是很方便,效果也不是太好,这个时候最小二乘法就可以派上用场,比如用于曲线拟合,使用最小二乘法来拟合这些离散的点,拟合了之后就可以根据曲线来补线,通过这种方法来补线的效果应该还是不错的,当然用处一定不止这一点,其他需求或场景就需要根据自己的想法来使用了,我们今天主要讲讲方法的原理和拟合的方法,接下来进入正文。
一、什么是最小二乘法
最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。简单的说,这里的“二乘”指的是用平方来度量观测点与估计点的远近(在古汉语中“平方”称为“二乘”),“最小”指的是参数的估计值要保证各个观测点与估计点的距离的平方和达到最小。如下图所示是一个线性拟合,红色的线代表观测点与估计点的距离,使得这些距离的平方和最小这样就是最小二乘法。
二、直线拟合计算
三、直线拟合matlab仿真
我们使用matlab来实际验证一下,代码如下:
%录入X轴数据
for a = 1:30
x(a) = a-1;
end
%录入Y轴数据
y=[1,2,3,8,6,9,5,4,8,5,9,19,16,12,15,24,22,36,40,40,32,32,36,39,52,52,56,57,62,69];
figure
plot(x,y,'.');%画点
hold on
b = ( mean(x*y(:)) - mean(x(:)).*mean(y(:)) )/( mean(x*x(:))-mean(x(:))^2 );%求直线斜率
a = mean(y(:))-b*mean(x(:));%求直线常数
y1 = a+b*x;%直线表达式
plot(x,y1);
hold off
拟合效果图如下:
四、多项式的曲线拟合计算
五、曲线matlab仿真
我们使用matlab来实际验证一下,代码如下:
%录入X轴数据
for a = 1:30
x(a) = a-1;
end
%录入Y轴数据
y=[1,2,3,6,6,7,8,9,8,10,9,19,16,14,15,24,28,36,40,40,42,41,37,39,52,52,56,57,62,69];
figure
plot(x,y,'.');%画点
hold on
k=3;%阶数 阶数可以在1-5之间更改看效果,记得每次更改了之后clear workspace然后在运行
%X数据录入
for a = 0:k
for i = 1:30
X(i,(a+1)) = x(i).^(a);
end
end
Y = y';
A = (X'*X)^-1*X'*Y;%求矩阵系数A
A = A';%转置矩阵方便使用
z = 0:0.1:30;
if k==5
y1 = A(1)+A(2).*z+A(3).*z.^2+A(4).*z.^3+A(5).*z.^4+A(6).*z.^5;%最后表达式用于绘图
elseif k==4
y1 = A(1)+A(2).*z+A(3).*z.^2+A(4).*z.^3+A(5).*z.^4;%最后表达式用于绘图
elseif k==3
y1 = A(1)+A(2).*z+A(3).*z.^2+A(4).*z.^3;%最后表达式用于绘图
elseif k==2
y1 = A(1)+A(2).*z+A(3).*z.^2;%最后表达式用于绘图
elseif k==1
y1 = A(1)+A(2).*z;%最后表达式用于绘图
end
plot(z,y1);
hold off
曲线拟合效果图效果图如下:
一阶:
三阶:
五阶:
六、总结
总结一句话:不管你用什么曲线拟合,可以用多项式、直线等,只要能使得每个误差的平方和最小即可。
可能有的人看到公式什么的就头疼,其实掌握这个算法其实只要理解“平方和为最小”基本就掌握最主要的思想了,具体怎么运算都是学过的数学知识,只需要将这个过程用程序表达出来就能实现想要的效果,所以想到这里才恍然大悟,原来程序员是翻译专业,将所学的数学、逻辑等按程序语言的语法,翻译成正确的代码,就完成了程序员的工作。