DeepLearning学习笔记(一):Logistic 回归

DeepLearning学习笔记(一):Logistic 回归

  Logistic 回归是一种用于解决监督学习(Supervised Learning)问题的学习算法,其输出y的值为0或1。Logistic回归的目的是使训练数据与其预测值之间的误差最小化。
  下面以Cat vs No-cat为例: 给定以一个nx维特征向量x表示的一张图片,这个算法将估计这张图中存在一只猫的概率,即y=1的概率:
  给定 x,计算y^=P(y=1|x),且 0≤y^≤1我们希望能有一个函数,能够表示出y^,如果进行最简单的线性拟合的话,规定一个nx维向量和一个值b作为参数,可得到:
这里写图片描述
  但由于y^为一个概率值,取值范围为[0,1],简单地进行线性拟合,得出的y^可能非常大,还可能为负值。这时,便需要一个sigmoid函数来对它的值域进行约束,sigmoid函数的表达式为:
这里写图片描述
其函数图像为:
这里写图片描述
由函数图像可知,sigmoid函数有几个很好的性质:
* 当z趋近于正无穷大时,σ(z) = 1
* 当z趋近于负无穷大时,σ(z) = 0
* 当z = 0时,σ(z) = 0.5
所以可以用sigmoid函数来约束y^的值域,此时:

这里写图片描述

成本函数

  为了训练logistic回归模型中的参数w和b,使得我们的模型输出值y^与真实值y尽可能基本一致,即尽可能准确地判断一张图是否为猫,我们需要定义一个成本函数(Cost Function)作为衡量的标准。

  用损失函数(Loss Function)来衡量预测值(y^(i))与真实值(y(i))之间的差异,换句话说,损失函数用来计算单个训练样本的错误。平方误差(Square Loss)是一种常用的损失函数:

这里写图片描述

  但在logistic回归中一般不使用这个损失函数,因为在训练参数过程中,使用这个损失函数将得到一个非凸函数,最终将存在很多局部最优解,这种情况下使用梯度下降(Gradient Descent)法无法找到最优解。所以在logistic回归中,一般采用log函数:

这里写图片描述

  对于一个单样本而言,误差函数L(损失函数)的定义如之前所述,而对于整体的训练集而言,用代价函数J来进行描述:

这里写图片描述

  从上式可以函数,代价函数的计算方式实际上是训练集中每个训练样本的损失函数的平均值。因此,对于一个逻辑回归问题而言,我们就是期望寻找恰当的w和b,使得最终的J尽可能的小。此时,我们可以把逻辑回归视作是一个非常小型的神经网络。

梯度下降法

  利用梯度下降法去训练w和b参数,如下图所示,假设w和b都是一个标量(Ps:实际中w是一个矢量),那么J可能取到的值是由w和b生成的曲面上的点,J的最小值,也就是对应着该曲面的底点。
这里写图片描述
  标量场中某一点上的梯度指向标量场增长最快的方向,梯度的长度是这个最大的变化率。 在空间坐标中以w,b为轴画出损失函数J(w,b)的三维图像,可知这个函数为一个凸函数。为了找到合适的参数,先将w和b赋一个初始值,正如图中的小红点。logistic回归中,通常将参数值初始化为0。梯度下降就是从起始点开始,试图在最陡峭的下降方向下坡,以便尽可能快地下坡到达最低点,这个下坡的方向便是此点的梯度值。
这里写图片描述
  以上图为例,当w位于最优点右侧时,其随着宽度的增加,高度也在不断增加,因此斜率是正数,即dw>0。因此,在迭代过程中,w的值会不断减小(w:=w-adw)。
而当w位于最优点左侧时,其随着宽度的增加,高度确在不断减小,因此斜率是负数,即dw<0。因此,在迭代过程中,w的值会不断增加(w:=w-adw)。
在实际代价函数中,J是关于w和b的函数,所以实际上,每次的迭代过程如下:
这里写图片描述
  其中的”:=“意思为赋值,α为学习率,通常为一个小于1的数,用来控制梯度下降过程中每一次移动的规格,相当于迈的步子大小。α的不宜太小也不宜过大:太小会使迭代次数增加,容易陷入局部最优解;太大容易错过最优解。

Python实现

  使用Python编写一个logistic回归分类器来识别猫,以此来了解如何使用神经网络的思维方式来进行这项任务,识别过程如图:
这里写图片描述

其中用到的Python包有:
* numpy是使用Python进行科学计算的基础包。
* matplotlib是Python中著名的绘图库。
* h5py在Python提供读取HDF5二进制数据格式文件的接口,本次的训练及测试图片集是以HDF5储存的。
* PIL(Python Image Library)为Python提供图像处理功能。
* scipy是基于NumPy来做高等数学、信号处理、优化、统计和许多其它科学任务的拓展库。

实现过程:
#导入所需要的包
import numpy as np                     #numpy:Python科学计算中最重要的库
import matplotlib.pyplot as plt        #mathplotlib:Python画图的库
import h5py                            #h5py:Python与H5文件交互的库
import scipy                           #Python科学计算相关的库
from PIL import Image                 #Python图像相关的库
from scipy import ndimage

#设置matplotlib在行内显示图片
%matplotlib inline 
 """
    # 加载数据集
    数据说明:
    对于训练集的标签而言,对于猫,标记为1,否则标记为0。
    每一个图像的维度都是(num_px, num_px, 3),其中,长宽相同,3表示是RGB图像。
    train_set_x_orig和test_set_x_orig中,包含_orig是由于我们稍候需要对图像进行预处理,预处理后的变量将会通过
    train_dataset["train_set_x"][:] ===》命名为train_set_x和train_set_y。
    注:数据存储方式采用的是hdf5格式
"""
def load_dataset():
    train_dataset = h5py.File('datasets/train_catvnoncat.h5', "r")  #读取H5文件 读取训练数据,共209张图片
    train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features 原始训练集(209*64*64*3)
    train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels  原始训练集的标签集(y=0非猫,y=1是猫)(209*1)

    test_dataset = h5py.File('datasets/test_catvno
  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值