R实现梯度下降法

基本思想

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

R实现梯度下降法_第1张图片R实现梯度下降法_第2张图片

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

R实现梯度下降法_第3张图片

 几个问题

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

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

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

解线性回归问题

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

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

R实现梯度下降法_第4张图片

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

R实现梯度下降法_第5张图片

 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])

你可能感兴趣的:(机器学习,r语言)