计算logistic回归导数:
在程序中有两个for循环
简化成一个for循环
想要去掉下面的那个循环,不显式地把dw1、dw2等初始化为0,把dw变成一个nx*1维的向量
- 用 d w = n p . z e r o s ( ( n x , 1 ) ) dw=np.zeros((n_x,1)) dw=np.zeros((nx,1))代替dw1和dw2等于0的初始化
- 用 d w + = x i d z i dw+=x^i dz^i dw+=xidzi代替下面的for循环
- 用 d w / = m dw/=m dw/=m代替最后一行dw1和dw2除以m
向量化
设有m个样本,原本需要计算:
需要重复上述步骤m次
处理z1、z2…zm:
- 现把所有训练样本堆叠起来,定义一个nx×m的矩阵X作为训练的输入(nx,m):
- 构建一个1×m的矩阵,计算z1、z2…zm都在同一时间,结果可以发现它可以表示为:
Z
=
[
z
1
,
z
2
.
.
.
z
m
]
=
w
T
X
+
[
b
,
b
,
b
.
.
.
b
]
Z=[z^1,z^2...z^m]=w^TX+[b,b,b...b]
Z=[z1,z2...zm]=wTX+[b,b,b...b]
wT是一个行向量:
[b b b…b]是一个1×m的向量 - 最后得到一个1×m的行向量:
Z = [ z 1 , z 2 . . . z m ] = w T X + [ b , b , b . . . b ] = [ w T x 1 + b , w T x 2 + b . . . w T x m + b ] Z=[z^1,z^2...z^m]=w^TX+[b,b,b...b]=[w^Tx^1+b,w^Tx^2+b...w^Tx^m+b] Z=[z1,z2...zm]=wTX+[b,b,b...b]=[wTx1+b,wTx2+b...wTxm+b] - 最后行向量里的每一个元素,刚好是原始方法(本小节第一张图片中的三列公式)中的z1、z2…zm
- 使用numpy实现:
#Python此处的b是一个实数不是矩阵,但把前面的(w.T,X)向量和b相加时,Python会自动将b扩展成一个1×m的行向量
#上述过程在Python中称为 广播
Z=np.dot(w.T,X)+b
处理a1、a2…am:
- 将Z当做sigma函数的输入,同时计算所有a:
A = [ a 1 , a 2 . . . a m ] = σ ( z ) A=[a^1,a^2...a^m]=\sigma(z) A=[a1,a2...am]=σ(z)
以上,是正向传播一步迭代的向量化实现,同时处理所有m个样本