随机梯度下降法



随机梯度下降法

分类: Algorithm 98人阅读 评论(0) 收藏 举报

刚刚看完斯坦福大学机器学习第四讲(牛顿法),也对学习过程做一次总结吧。

一、误差准则函数与随机梯度下降:

数学一点将就是,对于给定的一个点集(X,Y),找到一条曲线或者曲面,对其进行拟合之。同时称X中的变量为特征(Feature),Y值为预测值。

如图:


一个典型的机器学习的过程,首先给出一组输入数据X,我们的算法会通过一系列的过程得到一个估计的函数,这个函数有能力对没有见过的新数据给出一个新的估计Y,也被称为构建一个模型。

我们用X1、X2...Xn 去描述feature里面的分量,用Y来描述我们的估计,得到一下模型:


我们需要一种机制去评价这个模型对数据的描述到底够不够准确,而采集的数据x、y通常来说是存在误差的(多数情况下误差服从高斯分布),于是,自然的,引入误差函数:


关键的一点是如何调整theta值,使误差函数J最小化。J函数构成一个曲面或者曲线,我们的目的是找到该曲面的最低点:


假设随机站在该曲面的一点,要以最快的速度到达最低点,我们当然会沿着坡度最大的方向往下走(梯度的反方向)

用数学描述就是一个求偏导数的过程:


这样,参数theta的更新过程描述为以下:

   (α表示算法的学习速率)

二、算法实现与测试:

通过一组数据拟合 y = theta1*x1 +theta2*x2

  1. #Python 3.3.5  
  2. # matrix_A  训练集  
  3. matrix_A = [[1,4], [2,5], [5,1], [4,2]]  
  4. Matrix_y = [19,26,19,20]  
  5. theta = [2,5]  
  6. #学习速率  
  7. leraing_rate = 0.005  
  8. loss = 50  
  9. iters = 1  
  10. Eps = 0.0001  
  11. while loss>Eps and iters <1000 :  
  12.     loss = 0  
  13.     for i in range(3) :  
  14.         h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]   
  15.         theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]  
  16.         theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]  
  17.     for i in range(3) :  
  18.         Error = 0  
  19.         Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]  
  20.         Error = Error*Error  
  21.         loss = loss +Error  
  22.     iters = iters +1  
  23. print ('theta=',theta)  
  24. print ('iters=',iters)  
#Python 3.3.5
# matrix_A  训练集
matrix_A = [[1,4], [2,5], [5,1], [4,2]]
Matrix_y = [19,26,19,20]
theta = [2,5]
#学习速率
leraing_rate = 0.005
loss = 50
iters = 1
Eps = 0.0001
while loss>Eps and iters <1000 :
    loss = 0
    for i in range(3) :
        h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] 
        theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]
        theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]
    for i in range(3) :
        Error = 0
        Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]
        Error = Error*Error
        loss = loss +Error
    iters = iters +1
print ('theta=',theta)
print ('iters=',iters)
求解结果:
  1. >>>   
  2. theta= [2.99809592161579454.001522800837675]  
  3. iters= 75  
>>> 
theta= [2.9980959216157945, 4.001522800837675]
iters= 75
但如果对输入数据添加一些噪声

  1. matrix_A = [[1.05,4], [2.1,5], [5,1], [4,2]]  
matrix_A = [[1.05,4], [2.1,5], [5,1], [4,2]]
求解结果为:

  1. >>>   
  2. theta= [3.00959506851977253.944718521027671]  
  3. iters= 1000  
>>> 
theta= [3.0095950685197725, 3.944718521027671]
iters= 1000
可见在有噪声的情况下,要及时调整模型误差精度、迭代次数上限,一期达到我们的需求。

以上图片和公式均摘自: 梯度下降法 http://blog.csdn.net/zbc1090549839/article/details/38149561

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值