R实现梯度下降法

基本思想

梯度下降法是用梯度来建立迭代关系式的迭代法。对于无约束优化问题argminf(x),其梯度下降法求解的迭代关系式为:

 将向量x的函数简化为一元函数及二元函数时的示意

 几个问题

1)梯度下降法的结束条件,一般采用:①迭代次数达到了最大设定;②损失函数降低幅度低于设定的阈值。

2)关于步长𝛼,过大时,初期下降的速度很快,但有可能越过最低点,如果“洼地”够大,会再折回并反复振荡,如果“洼地”不够大,则会冲过“洼地”。如果步长过小,则收敛的速度会很慢。因此,可以采取先大后小的策略调整步长,具体大小的调节可根据𝑓𝒙降低的幅度或者𝒙前进的幅度进行

3)关于特征归一化问题,梯度下降法应用于机器学习模型求解时,对特征的取值范围也是敏感的,当不同的特征值取值范围不一样时,相同的步长会导致尺度小的特征前进比较慢,从而走之字型路线,影响迭代的速度,甚至是不收敛

解线性回归问题

将线性回归问题中𝑚个样本的损失函数表示为:

 回归系数的更新过程如下:

 每个特征的回归系数w^(j) 来说:

 R中代码实现

beta=0.0000001
# 产生随机样本点
x1 <- runif(100,10,100)#均匀分布
x2 <- runif(100,10,100)
y <- 10+2*x1+5*x2+rnorm(100,0,1)
# 学习率
a=0.000025
# 样本量
m=length(x1)
# 迭代初值
t0=1
t1=1
t2=1
j=1/(2*m)*sum((t0+t1*x1+t2*x2-y)^2)
# 第一次迭代
temp0=t0-a*1/m*sum(t0+t1*x1+t2*x2-y)
temp1=t1-a*1/m*sum((t0+t1*x1+t2*x2-y)*x1)
temp2=t2-a*1/m*sum((t0+t1*x1+t2*x2-y)*x2)
# 代价函数
j[2]=1/(2*m)*sum((temp0+temp1*x1+temp2*x2-y)^2)

for(i in 2:50000000){
  # 保存上次的迭代值
  t0=temp0[i-1]
  t1=temp1[i-1]
  t2=temp2[i-1]
  # 进行下一次迭代
  temp0[i]=t0-a*1/m*sum(t0+t1*x1+t2*x2-y)
  temp1[i]=t1-a*1/m*sum((t0+t1*x1+t2*x2-y)*x1)
  temp2[i]=t2-a*1/m*sum((t0+t1*x1+t2*x2-y)*x2)
  # 代价函数
  j[i+1]=1/(2*m)*sum((temp0[i]+temp1[i]*x1+temp2[i]*x2-y)^2)
  if ( abs(j[i+1]-j[i])< beta ) {
      break
  }
}
# 迭代次数
paste("i:",i)
# 截距项
paste("t0:",temp0[i])
# 系数
paste("t1:",temp1[i])
paste("t2:",temp2[i])

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值