二分分类
假若有一张图片作为输入,如图1所示。用户想输出识别此图的标签,如果是猫输出1,否则输出0,我们用y来表示输出的结果标签。
![](https://i-blog.csdnimg.cn/blog_migrate/fa720687b9d313a23939079d35727116.png)
计算机保存一张图片,要保存三个独立矩阵,分别对应图片中的红、绿、蓝三个颜色通道。如果输入的图片像素是64×64,就有三个64×64的矩阵分别对应图片中的红、绿、蓝三种像素的亮度。要把这些像素亮度值放进一个特征向量中,就要把这些像素值都提取出来放入一个特征向量x。为了把这些像素值提取出放入特征向量,我们会得到一列很长的列向量,把图片中所有的红、绿、蓝像素强度值都列出来,如果图片是64×64的,那么向量x的总维度64×64×3,因为这是三个矩阵的元素总量。
![](https://i-blog.csdnimg.cn/blog_migrate/d19fa7ec5db8dfc614458a7b82586bcc.png)
在二分分类问题中,目标是训练出一个分类器,它以图片的特征向量x作为输入,预测输出的结果标签y是1还是0,也就是预测图片中是否有猫。
Logistic回归
![](https://i-blog.csdnimg.cn/blog_migrate/ef1839e7739bc76d1e4fb97cb7cb77e8.png)
线性回归参数列表
- 输入值:n维特征向量x
- 权重:n维向量w
- 拦截器:实数b
- 输出值:y = (向量x的装置乘以向量x)+实数b
Logistic回归
线性回归的值通常为复数或者比1大得多,而这样的概率是没有意义的,我们希望y的值介于0和1之间,因此我们将sigmoid(z)函数作用于y上。如果线性回归的结果很大,则logistic回归的结果很接近1,相反线性回归的值很小或者为负数,则logistic回归的结果很接近0。
![](https://i-blog.csdnimg.cn/blog_migrate/643844461dee4bdea05b7d557e244c53.png)
Logistic回归损失函数
损失函数
损失函数又叫损失误差。损失函数可以用来衡量算法的运行情况,我们通常希望损失函数的值越小越好。它可以定义损失为y帽和y的差的平方,或者它们差的平方的二分之一。我们通过定义损失函数L来衡量你的预测输出值y帽和y的实际值有多接近。误差平方是一个合理的选择,但是用误差平方,梯度下降法就不太好用了。
![](https://i-blog.csdnimg.cn/blog_migrate/2b24472e66bf486fdf881e438753f26e.png)
在logistic回归中,我们会定义一个不同的损失函数,它起着与误差平方相似的作用。如果y=1,第二项为0,为了让损失函数尽可能小,我们让y帽尽可能大。如果y=0,第一项为0,为了让损失函数尽可能小,我们让y帽尽可能小。
成本函数
成本函数衡量的是模型在全体训练样本上的表现。它是所有训练样本的损失函数和的平均值,其中y帽是用一组特点的参数w和b通过logistic回归算法得到的预测输出值,y是基本真值标签。损失函数只适用于单个训练样本中参数w和b的效果,而成本函数则用于在全部训练集上衡量参数w和b的效果。因此,在训练logistic回归模型时,我们要找到合适的参数w和b,就需要让成本函数J尽可能的小。
![](https://i-blog.csdnimg.cn/blog_migrate/9c1fc709d503e57de661ba5dd11ee33c.png)
梯度下降法
![](https://i-blog.csdnimg.cn/blog_migrate/13b5dbd5b1c4422d3e0cd7fe7885e44c.png)
梯度下降法所做的就是从初始点开始朝最陡的下坡方向走一步,直至走到全局最优解或接近全局最优解。 在logistic回归中,即通过反复更新参数w和b的值,使得成本函数最小。
计算流程图
J = 3×(a+b×c)
![](https://i-blog.csdnimg.cn/blog_migrate/b694e81e390c181ca582b73e2fa65313.png)
一个计算流程图就是正向或者说从左到右的计算来计算成本函数J,如果需要优化函数,则方向。从右到左计算导数。
向量化
向量化通常是消除代码中显示for循环语句的艺术。深度学习中,在训练大量数据集时,深度学习算法表现才更加优越。因此代码运行速度快显得非常重要,否则如果它运行在一个大的数据集上面,你的代码可能花费很长时间去运行,你会发现你将要等待非常长的时间去得到结果。所以在深度学习领域中,向量化已经变成一个关键的技巧。
import numpy as np
import time
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c = np.dot(a,b)
toc = time.time()
#平均花费2毫秒
print(“Vectorized version:”+str(1000*(toc-tic))+ “ms”)
c = 0
tic = time.time()
for i in range(1000000)
c+= a[i]*b[i]
toc = time.time()
#平均花费500毫秒
print(“for loop:”+str(1000*(toc-tic))+ “ms”)
#经验法则是 只要有其它办法 就不要显示使用for循环
向量化logistic回归
#正向传播一步迭代的向量化实现
#同时处理所有m个训练样本
#X作为训练输入
#使用向量化高速计算激活函数
Z=np.dot(w.T,X)+b
#这里有个Python巧妙的地方,在这个地方b是一个实数,当是当你把这个
#向量加上这个实数时,Python会自动的把实数b,扩展成一个1×m的行向
#量,在Python中这叫做广播。
#后续可以通过向量化同时计算整个训练集预测值a
向量化logistic回归的梯度输出
for iter in range(1000):
Z = np.dot(w.T,X)+b
A = σ(Z)
#反向传播(导数)
dz = A - Y
dw = 1/m * np.dot(Z.T,X)
db = 1/m * np.sum(dz)
w = w - a*dw
b = b - a*db
Python中的广播
#广播是一种手段,可以让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])
cal = A.sum(axis=0) # axis=0意味着竖着相加
print(cal) #[59,239,155.4,76.9]
percentage = 100*A/cal.reshape(1,4)#矩阵A除以这个1乘4的矩阵
#广播的实质其实是一种向量扩展