假设线性回归方程为:
y为实际值,为了使得拟合最佳,则要实现:
注:1/2是为了计算方便,无实际意义。
方法一:梯度下降法
引入了梯度下降法,使得每一步都是向下降速度最快的那个方向,而最终也一定会收敛。(获得的是局部最优)
每一次求导选择方向最小,负方向。
具体算法如下:
每一次迭代更新一次系数:
注:=表示的是赋值的意思
经过不断的迭代之后,
α实际上是learning rate,也就是决定了步长的大小
但是越接近局部最优的时候,步长会不断地调整变小。
因为θ中有多个参数,所以每次迭代对于每个参数都需要进行梯度下降,直到J(θ)收敛到最小值。
这个方法叫做batch gradient descent。
当样本数量比较小的时候可以使用此方法,但当样本数量很大时,该方法的工作量很大,因为每一个样本每一个方向都计算了,计算量很大。
故有了随机梯度下降法,不考察所有的数据,没那么精确,总是在局部最优附近徘徊。
每一次至考虑一个样本点的最优,而不是所有样本点的误差和,收敛过程比较曲折。
几个简单的MATLAB代码例子:
1、简单的hense矩阵:
function x=fsxhesse(f,a,b)
syms x1 x2;
% fsxhesse函数 求函数的hesse矩阵;
% 本程序仅是简单的求二次函数的hesse矩阵!;
% x=fsxhesse(f)为输入函数 f为二次函数 x1,x2为自变量;
% fsx TJPU 2008.6.15
x1=a;x2=b;
fx=diff(f,'x1'); %求f对x1偏导数
fy=diff(f,'x2'); %求f对x2偏导数
fxx=diff(fx,'x1'); %求二阶偏导数 对x1再对x1
fxy=diff(fx,'x2'); %求二阶偏导数 对x1再对x2
fyx=diff(fy,'x1'); %求二阶偏导数 对x2再对x1
fyy=diff(fy,'x2'); %求二阶偏导数 对x2再对x2
fxx=subs(fxx); %将符号变量转化为数值
fxy=subs(fxy);
fyx=subs(fyx);
fyy=subs(fyy);
x=[fxx,fxy;fyx,fyy]; %求hesse矩阵
% v=[a,b];
% df=jacobian(f,v);%雅克比矩阵
% df
% df=df.'; %转置
% df
% G=jacobian(df,v);
% x=G;
2、最速下降法
function x=fsxsteep(G,f,e,a,b)
% fsxsteep函数 最速下降法
% x=fsxsteep(f,e,a,b)为输入函数 f为函数 e为允许误差 (a,b)为初始点;
% fsx TJPU 2008.6.15
x1=a;x2=b;
%Q=fsxhesse(f,x1,x2);
Q=G;
x0=[x1 x2]';
fx1=diff(f,'x1'); %对x1求偏导数
fx2=diff(f,'x2'); %对x2求偏导数
g=[fx1 fx2]'; %梯度
g1=subs(g); %把符号变量转为数值
g
g1
d=-g1;
k=0;
while (abs(norm(g1))>=e) %norm(g1)为g1的2范数,即sqrt(x1^2+x2^2)
% for k=0:200
t=(-d)'*d/((-d)'*Q*d);%步长
%t=1/30;
x0=x0-t*g1; %迭代更新,搜索到的点
v=x0;
vpa(x0,10)%精度的位数
a=[1 0]*x0;
b=[0 1]*x0;
x1=a;
x2=b;
g1=subs(g);
d=-g1;
k=k+1;
end;
x=v;
k
3、例子:
syms x1 x2 x3;
x=[1,0.3;1,0.45;1,0.5;1,0.7];
y=[1;2;3;4];
% x=[1,1;1,2;1,4;1,4;1,5;1,7;1,7];
% y=[2;4;6;8;9;13;14];
X=[x1,x2];
fx=0;
X
X'
hh=x1.^2;
hh
for i=1:4
fx=fx+(X*(x(i,:)).'-y(i,1)).^2;
end
fx
v=[x1,x2];
df=jacobian(fx,v);
df=df.';
G=jacobian(df,v);
z=fsxsteep(G,fx,1e-4,6,1)
a=vpa(z(1,1),5);
a
b=vpa(z(2,1),5);
b
x3=0:5;
f=a+b*x3;
f
figure(1);
plot(x3,f);
i=1;
for i=1:4
text(x(i,2),y(i),'*');
y(i)
end
x1=-50:2:50;x2=2*x1;
[x1,x2]=meshgrid(x1,x2);
%Z= (x1 + 2*x2 - 2).^2 + (x1 + 3*x2 - 2).^2 + (x1 + 4*x2 - 5/2).^2 + (x1 + x2 - 1).^2;
%Z=x1.^2+10*x2.^2;
fx
fx=(x1 + x2/2 - 3).^2 + (x1 + (3*x2)/10 - 1).^2 + (x1 + (7*x2)/10 - 4).^2 + (x1 + (9*x2)/20 - 2).^2;
figure(2);
surf(x1,x2,fx)
text(10,10,100,'*****');
figure(3);
contour(x1,x2,fx,100);
text(10,10,'***');
方法二:最小二乘法
将训练特征表示为 X 矩阵,结果表示成 y 向量,仍然是线性回归模型,误差函数不变。那么
θ 可以直接由下面公式得出
但要求X是满秩的,求矩阵的逆也比较慢
用误差函数为平方和的概率解释
假设预测结果和实际结果之间存在误差,
一般来讲,误差满足平均值为 0 的高斯分布,也就是正态分布。那么 x 和 y 的条件概率也就是
为了要实现模型能够在全部样本上预测最准,也就是概率积最大。这个概率积成为最大似然估计。我们希望在最大似然估计得到最大值时确定 θ。那么需要对最大似然估计公式求导,求导结果是