梯度下降过程向量化

https://blog.csdn.net/ligang_csdn/article/details/53838743

关于θ更新过程的vectorization,Andrew Ng的课程中只是一带而过,没有具体的讲解。

《机器学习实战》连Cost函数及求梯度等都没有说明,所以更不可能说明vectorization了。但是,其中给出的实现代码确是实现了vectorization的,图4所示代码的32行中weights(也就是θ)的更新只用了一行代码,直接通过矩阵或者向量计算更新,没有用for循环,说明确实实现了vectorization,具体代码下一章分析。

文献[3]中也提到了vectorization,但是也是比较粗略,很简单的给出vectorization的结果为:

    

且不论该更新公式正确与否,这里的Σ(...)是一个求和的过程,显然需要一个for语句循环m次,所以根本没有完全的实现vectorization,不像《机器学习实战》的代码中一条语句就可以完成θ的更新。

下面说明一下我理解《机器学习实战》中代码实现的vectorization过程。

约定训练数据的矩阵形式如下,x的每一行为一条训练样本,而每一列为不同的特称取值:

约定待求的参数θ的矩阵形式为:

          

先求x.θ并记为A

hθ(x)-y并记为E

g(A)的参数A为一列向量,所以实现g函数时要支持列向量作为参数,并返回列向量。由上式可知hθ(x)-y可以由g(A)-y一次计算求得。

再来看一下(15)式的θ更新过程,当j=0时:

同样的可以写出θj

综合起来就是:

综上所述,vectorization后θ更新的步骤如下:

(1)求A=x.θ

(2)求E=g(A)-y

(3)求θ:=θ-α.x'.E,x'表示矩阵x的转置。

也可以综合起来写成:

前面已经提到过:1/m是可以省略的。

4. 代码分析

图4中是《机器学习实战》中给出的部分实现代码。

 

图4

sigmoid函数就是前文中的g(z)函数,参数inX可以是向量,因为程序中使用了Python的numpy。

gradAscent函数是梯度上升的实现函数,参数dataMatin和classLabels为训练数据,23和24行对训练数据做了处理,转换成numpy的矩阵类型,同时将横向量的classlabels转换成列向量labelMat,此时的dataMatrix和labelMat就是(18)式中的xy。alpha为学习步长,maxCycles为迭代次数。weights为n维(等于x的列数)列向量,就是(19)式中的θ

29行的for循环将更新θ的过程迭代maxCycles次,每循环一次更新一次。对比3.4节最后总结的向量化的θ更新步骤,30行相当于求了A=x.θg(A),31行相当于求了E=g(A)-y,32行相当于求θ:=θ-α.x'.E。所以这三行代码实际上与向量化的θ更新步骤是完全一致的。

总结一下,从上面代码分析可以看出,虽然只有十多行的代码,但是里面却隐含了太多的细节,如果没有相关基础确实是非常难以理解的。相信完整的阅读了本文,就应该没有问题了!^_^。

 

【参考文献】

[1]《机器学习实战》——【美】Peter Harington
[2] Stanford机器学习公开课(https://www.coursera.org/course/ml
[3] http://blog.csdn.net/abcjennifer/article/details/7716281
[4] http://www.cnblogs.com/tornadomeet/p/3395593.html
[5] http://blog.csdn.net/moodytong/article/details/9731283
[6] http://blog.csdn.net/jackie_zhu/article/details/8895270

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值