本文主要给出批梯度下降法(BGD)与随机梯度下降法(SGD)的matlab实现,关于BGD与SGD的理论,可参考下文:
https://www.cnblogs.com/pinard/p/5970503.html
批梯度下降法(BGD)
// 批梯度下降法(BGD)
function [ theta,loss ] = BGD( x, y, alpha )
%批梯度下降
m=size(x,1);%记录样本总数
n=size(x,2);%记录样本特征数
xx=[ones(m,1),x];%将x前加入一列全1向量x0
theta=ones(n+1,1);%初始化参数theta
diff=xx*theta-y;
gradient=xx'*diff/m;%梯度方向
count=1;%记录运行次数
while all (abs(gradient)>0.00001)
theta=theta-alpha*gradient;%待求解参数theta朝梯度下降方向变化
diff=xx*theta-y;
gradient=xx'*diff/m;%梯度更新
count=count+1;
end
loss=(diff'*diff)/(2*m);%计算损失函数
end
随机梯度下降法(SGD)
// 随机梯度下降法(SGD)
function [ theta,loss ] = SGD( x,y,alpha )
%随机梯度下降
m=size(x,1);%记录样本总数
n=size(x,2);%记录样本特征数
xx=[ones(m,1),x];%将x前加入一列x0
theta=ones(n+1,1);%初始化参数theta
count=0;%记录循环次数
loop_max=10000;
while count<loop_max
count=count+1;
for i=1:m
diff=xx(i,:)*theta-y(i);
theta=theta-alpha*diff*xx(i,:)'/m;
end
gradient=xx'*(xx*theta-y)/m;
if all (abs(gradient)<0.0001)
break
end
end
diff1=xx*theta-y;
loss=diff1'*diff1/(2*m);%计算损失函数
end
调用
// 调用
x=[1;2;3;4;5];
y=[1.1;2.5;3.4;4.5;5.6];
alpha=0.01;
[theta1,loss1 ] = BGD( x, y, alpha );
[theta2,loss2 ] = SGD( x, y, alpha );
输出
theta1=[0.1202;1.0099]; loss1=0.0048;
theta2=[0.1206,1.0996]; loss2=0.0048;
绘图
蓝色线为BGD结果,红色线为SGD。由于二者估计的theta很接近,表现在图形上为蓝色线与红色线几乎重合。