day14 逻辑回归向量化展示
向量化 Logistic 回归的梯度输出
回顾
前面我们已经通过初始化dw为一个列向量去除了第二个for循环
J=0;dw=np.zeros((n,1));db=0;
for i = 1 to m
z(i) = wx(i)+b;
a(i) = sigmoid(z(i));
J += -[y(i)log(a(i))+(1-y(i))log(1-a(i));
dz(i) = a(i)-y(i);
dw += x(i)dz(i);
db += dz(i);
J/= m;
dw/= m;
db/= m;
w=w-alpha*dw
b=b-alpha*db
并且我们知道第一个for循环的目的是对m个训练样本做相同的运算并累加起来。
本节内容
首先明确我们要求的东西是dw、db、J ,并且我们知道dw、db都需要得出dz才能求出。
- dz(i) = a(i) - y(i) ,为了去除对m个训练样本的循环,我们可以设置dz、a、y为矩阵,可以一步矩阵运算直接完成对原本m个训练样本的计算。
-
db += dz(i) 、db/= m ,我们得出dz矩阵表达式,那么就可以直接使用numpy库的函数计算
-
dw += x(i)dz(i) 、dw/= m ,前面我们已经通过dw矩阵化去除了第二个for循环,也就是解决dw纵向的循环,
但是dw横向还有一个m累加的循环问题。
-
逻辑回归向量化,并换成代码形式
python中的广播
代码:
import numpy as np
A = np.array([[56.0,0.0,4.4,68.0],
[1.2,104.0,52.0,8.0],
[1.8,135.0,99.0,0.9]])
print("原矩阵:")
print(A)
cal = A.sum(axis=0)
print("按列求和运算后:")
print(cal)
percentage = 100 * A / cal.reshape(1,4)
print("比例:")
print(percentage)
注:
-
axis用来指明将要进行的运算是沿着哪个轴执行,在numpy中,0轴是垂直的,也就是列,而1轴是水平的,也就是行
-
cal在此已经是1*4,使用reshape的原因,是如果在计算过程中我们不确定变量的维度时,采用reshape可以确保得到我们想要的类型,并且这个操作并不耗时
-
矩阵同型复制(广播)
关于 Python Numpy 的说明
使用数据结构时不要用一维数组,而应该采用向量或矩阵的方法。
1.生成的是一个称作a的一维数组,此时a的shape(形状)是一个(5,) 的结构,在矩阵运算时会产生很多麻烦
a=np.random.randn(5)
2.定义的是一个向量,此时a的shape(形状)是一个(5,1) 的结构
a=np.random.randn(5,1)
3.不完全确定一个向量的维度,可以通过断言语句来确保是你想要的维度(通过reshape)
assert(a.shape==(5,1))
a=a.reshape((5,1))
参考:https://www.cnblogs.com/xiaojianliu/articles/9485235.html