老师好,您看看这里是不是写错了

来源:6-7 scikit-learn中的随机梯度下降法

lemonlxn

2019-02-28

老师好,对随机梯度求导数的时候。
您看看这里是不是写错了。
第一张图是 return X_b_i.T.dot(X_b_i.dot(theta) - y_i) * 2.
第二张图是 return X_b_i * (X_b_i.dot(theta) - y_i) * 2.
图片描述
图片描述

写回答

1回答

liuyubobobo

2019-03-01

啊哦,之前竟然没有发现这里的代码不一致。不过,这两个写法都是正确的:)


关键在于,对于随机梯度下降法来说,X_b_i是一个向量(一维数组)。所以,X_b_i.dot(theta)是一个数字,X_b_i.dot(theta) - y_i 也是一个数字,假设我记为a,之后,就是要用这个数字和X_b_i这个向量做乘法。这两种写法都能正确的得到这个结果,(其实是一个向量的标量乘法)。实验如下:


1)设立X_b_i为[1, 2, 3, 4], a = 3

//img.mukewang.com/szimg/5c7820fe00010bb803970056.jpg


2)实验return X_b_i * (X_b_i.dot(theta) - y_i) * 2.的写法

//img.mukewang.com/szimg/5c78210400017c3f03090118.jpg


3)实验return X_b_i.T.dot(X_b_i.dot(theta) - y_i) * 2的写法

//img.mukewang.com/szimg/5c7822590001bdb502940123.jpg


4)res1和res2是一样的:)


不过在这里,从规范书写的角度,我更偏向使用*而非dot,因为dot更容易让别人认为是向量和向量之间的内积;或者矩阵和向量,或者矩阵和矩阵之间的乘法。而这里本质是一个标量乘法,使用*更好,语义更清楚。(更不用提还有.T,在这里处理一个一维向量,完全没必要。但依然是,虽然没必要,确实可以的,逻辑上没有错:))


Jupyter Notebook中我用了dot,应该是从批量梯度下降法的代码直接修改的,修改到结果正确了就没有继续了,所以没有充分考虑程序的表意问题。py文件中的写法更好(应该是我从头写的。。。)


抱歉了!:)赞一下你的认真!


继续加油!:)

2
2
lemonlxn
谢谢老师,您有心了。
2019-03-01
共2条回复

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5893 学习 · 2454 问题

查看课程