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

img

并且我们知道第一个for循环的目的是对m个训练样本做相同的运算并累加起来。

本节内容

首先明确我们要求的东西是dw、db、J ,并且我们知道dw、db都需要得出dz才能求出。

  1. dz(i) = a(i) - y(i) ,为了去除对m个训练样本的循环,我们可以设置dz、a、y为矩阵,可以一步矩阵运算直接完成对原本m个训练样本的计算。

image-20210205151502081

  1. db += dz(i) 、db/= m ,我们得出dz矩阵表达式,那么就可以直接使用numpy库的函数计算

    image-20210205151845618

  2. dw += x(i)dz(i) 、dw/= m ,前面我们已经通过dw矩阵化去除了第二个for循环,也就是解决dw纵向的循环,

    但是dw横向还有一个m累加的循环问题。

    image-20210205153311075

    image-20210205153950686

  3. 逻辑回归向量化,并换成代码形式

    image-20210205154145527

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)

image-20210205155925384

注:

  1. axis用来指明将要进行的运算是沿着哪个轴执行,在numpy中,0轴是垂直的,也就是列,而1轴是水平的,也就是行

  2. cal在此已经是1*4,使用reshape的原因,是如果在计算过程中我们不确定变量的维度时,采用reshape可以确保得到我们想要的类型,并且这个操作并不耗时

  3. 矩阵同型复制(广播)

    img

    image-20210205163448737

关于 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

posted @ 2021-01-20 00:12  晨起  阅读(101)  评论(0编辑  收藏  举报