利用向量化同时计算m个训练数据的梯度
- 定义一个 dZ = [ dz(1) dz(2) … dz(m) ]
- A = [ a(1) … a(m) ]
- Y = [ y(1) … y(m) ]
- dZ = A - Y = [ a(1)-y(1) a(2)-y(2) … a(m)-y(m) ]
仅需一行代码,就可以完成所有的这些计算,而去掉了繁琐的“for循环”。 - db = 1/m × ∑mi=1 dz(i) = 1/m × np.sum(dz)
- dw = 1/m × X × dzT
- 如上所述,可以得到一个更高效的Logistic回归实现方法,下面来看看最原始的Logistic回归实现方式:
- 更高效的Logistic回归:
Z = wT + b = np.dot(w.T,X) + b
A = σ(Z)
dZ = A - Y
dw = 1/m × dZT
db = 1/m × np.sum(dZ)
w := w - α × dw
b := b - α × dw - 当然,如果想要对梯度下降进行多次迭代,将还会需要一个最外层的for循环用来控制迭代次数,这个for循环是无法去掉的。
Python中的广播
- 一个关于广播的例子
目标是计算四种食物中,卡路里有多少百分比来自碳水,蛋白和脂肪。能够不用循环实现嘛?实际上,将表格看作一个三行四列的矩阵A,Python的numpy中内置了“对矩阵的每一列求和,结果存放到一个一维行向量中”,以及“将每一行的元素除以某一行向量中对应位置的元素,将结果存放到矩阵中”等等的“复杂”方法,下面我们来看看如何使用它们。 - 输入矩阵A:
- 利用sum和
axis = 0
的组合对列进行求和:
- 使用
reshape()
方法重新组合矩阵/向量
一些细节:axis = 0
代表着让python在竖直方向上求和。而设置axis = 1
则是在水品方向上求和。
- 如何让一个3×4的矩阵A除以一个1×4的向量cal
与上式相近,Python会进行广播,以完成计算。