您的位置:首页 > 编程语言 > MATLAB

最小二乘法推导和证明(matlab代码实现)

2017-10-08 11:48 573 查看
声明: 仅个人小记

前言

数据理论上是呈现线性关系,但是实际数据往往不是满足线性关系,但大体上的趋势呈现出线性关系。这个时候,我们最终希望得到的是唯一的线性关系,而不是一堆实验数据,所以产生了用一堆实验数据来确立理论上的线性关系的这样的问题。这样的问题,我记得在初中,高中物理里面经常用到,做实验得到很多组电流和电压的数据值,然后画在二维坐标上,往往,这些电流电压数据值并不在一条直线上,但大体上都有固定的一个趋势,面对这种情况,我们并不是把实际的电流电压连成折线,而是手动根据标号的数据点来拟合出一条直线。

情境引入:





最好的拟合情况:



糟糕的拟合情况:







上面的图展现出了我们想要探究的问题,即,确定哪条直线是最好的拟合直线,而本文探究的最小二乘法就是一种确立最好的拟合直线的方法。

注意: 上面的图展示的只有两个变元的情况,而实际情况中,多元的情况比比皆是。最小二乘法适用于多元的情况。

显然,这里的不仅仅是一元函数问题,而是多元函数问题。最小二乘法主要涉及多元微分学里的极值,最值问题。

最小二乘法

1. 最小二乘法思想简洁,公式也不复杂,如下



2. 最小二乘法处理二元情况



证明最好的拟合直线一定存在

实际意义上,我们能容易感受到一定会有一条直线,使得偏差平方和最小。

但是从数学角度上,最好的拟合直线一定存在就是意味着多元函数一定有极小值,一定有最小值。也就是意味着Hessian矩阵一定为正定的

注: Hessian矩阵用来判定极值的性质的,判定极大值、极小值、还是非极值、还是不确定。本例中相应Hessian矩阵如下:







还有一个需要讨论并证明的是:



我们要处理的对象转为数学中的多元微分函数,而寻求最好的拟合直线问题转化为数学上求解多元微分函数的最小值问题

Matlab代码



% 最小二乘法目的是得到一条最好的拟合直线

% d*a+e*b = u
% p*a+q*b = v
% 其中p == d

n = 6;
x = zeros(1,n);
y = zeros(1,n);
%x(1,1:n/2) = round(rand(1,n/2)*50);
%y(1,1:n/2) = round(rand(1,n/2)*50);

%x(1,(n/2+1):n) = round(rand(1,n/2)*50+50);
%y(1,(n/2+1):n) = round(rand(1,n/2)*50+50);

%x = round(rand(1,n)*100);
%y = round(rand(1,n)*100);

x = [1.3 1.9 3.2 4.1 5.2 6.3];
y = [2.3 4.1 6.3 8.2 10.3 11.8];
%x = 1:100;
%y(:) = 50+2*x;
plot(x,y,'g*')

d = 0; e = 0; u = 0; p = 0; q = 0; v = 0;
for i = 1:n
d = d + 2*x(i)*x(i);
e = e + 2*x(i);
u = u + 2*x(i)*y(i);
v = v + 2*y(i);
end
p = e;
q = 2*n;

% 利用克拉默法则来解方程组
D = det([d e; p q]);
a = det([u e; v q])/D;
b = det([d u; p v])/D;

% 绘制出最好的拟合直线
t = min(x):0.1:max(x);
g = a*t+b;
hold on
plot(t,g,'r')
hold off


代码运行结果展示





补充

最小二乘法是可以直接推向多元情况,上述只是探讨了两个变元的情况,最小二乘法确立了最好的拟合直线y = ax+b(两个待定参数)。如果是三个变元,那么我们就是用最小二乘法来确立最好的拟合平面z=ax+by+c(三个待定参数)。如果是n个变元,我们就是用最小二乘法来确立最好的拟合超平面,超平面方程中含n个待定参数。

2017年10月8日 14:29:01 By Jack Lu
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息