向量化更多例子 (More Vectorization Examples)
从上节视频中,你知道了怎样通过numpy内置函数和避开显式的循环(loop)的方式进行向量化,从而有效提高代码速度。
下面来看更多例子。需要记住的经验之谈:当你在编写神经网络或逻辑回归时,都要尽可能避免使用显式的for循环,虽然有时候完全无法避免使用for循环,但如果你能使用内置函数,这通常会比直接使用for循环更快。
让我们看另外一个例子。如果你想计算向量 ,即是由矩阵乘以而得。根据矩阵乘法定义: 。因此实现非向量化的代码如下:
# 非向量化的实现方式
u = np.zeros(n,1)
# 用两层for循环计算向量u(根据矩阵乘法法则),遍历i,j
for i ...:
for j ...:
u[i] += A[i][j] * v[j]
对比,下面是向量化的实现,消除了两层for循环:
# 向量化实现
u = np.dot(A,v)
下面通过另一个例子继续了解向量化。假设你在内存中已经有一个向量,你想要对向量中的每个元素进行指数运算,下面如图展示了非向量化,对比向量化的方法:
实际上,Python和Numpy中由很多内置函数,只需调用一个函数就可以完成这些向量的计算。所以当想写for循环的时候,先看看能不能通过调用Numpy中内置函数避免for循环。
那么,将刚才所学到的内容,运用在逻辑回归的梯度下降上,看看我们是否能简化两个for循环过程中的某一步。
在这例子我们有n个特征值,如果你有超过两个特征时,需要循环等等,所以的实际值1,2,......,。
下面我们想要消除第二个循环,在第一行,这样我们就不显示的初始化,把它们定义成向量,设置u = np.zeros(,1) 。接着去掉对单个元素使用for循环,并使用向量的计算 。最后,使用 dw /= m 。现在我们通过将两层循环转成一层循环。
希望这个视频给了你一点向量化感觉,减少一层循环会使你代码更快,但事实上我们能做得更好。所以在下个视频,我们将进一步的讲解逻辑回归进行向量化,你将会看到更好的监督学习结果。在训练中不需要使用任何 for 循环,你也可以写出代码去运行整个训练集。