梯度下降法求解线性回归问题的matlab实现

本文主要给出批梯度下降法(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
蓝色线为BGD结果,红色线为SGD。由于二者估计的theta很接近,表现在图形上为蓝色线与红色线几乎重合。

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值