非监督特征学习与深度学习(二)----逻辑回归

来源:互联网 发布:网络信息安全的重要性 编辑:程序博客网 时间:2024/06/15 14:06

注:本文转载自https://github.com/ysh329/Chinese-UFLDL-Tutorial
因为github上的makedown格式显示的不够完全,看的非常不方便,因此放到CSDN上比较好查阅学习。

逻辑斯特回归(Logistic Regression)

在先前的学习中,学习了预测连续数值的方法(如预测房价,房价是连续值而不同于分类问题的离散值),如把输入值(如房屋大小)传给线性的函数。有时候,反而希望预测离散变量(Discrete Variable),如预测网格中像素强度是代表一个“0”位还是一个“1”位。此时,这便是一个分类问题,逻辑斯特回归(Logistic Regression)对于学习这样的(分类)决策来说是一种简单的方法。

在线性回归中,尝试使用线性函数 y=hθ(x)=θx 来对第 i 个样本 x(i) (房屋特征)预测其(可能的) y(i) 值(房价)。这显然不是一个解决二值类标签( y(i){0,1} )预测(问题)的好办法。在逻辑斯特回归(Logistic Regression)中,使用了一个(与先前学到的)不同的假设空间(Hypothesis Class)来尝试预测样本属于类 1 的概率,以及与其相对的类 0 的概率。具体而言,尝试使用如下形式的函数进行学习:

P(y=1x)=hθ(x)=11+exp(θx)σ(θx),

P(y=0x)=1P(y=1x)=1hθ(x).

函数 σ(z)=11+exp(z) 通常被称为 “ sigmoid ” 函数或 “ logistic ” (音译:逻辑斯特)函数——它是 S 型函数(因函数图像是 S 形状的),该函数输入值 θx 通过 S 型函数,被“挤”到 [0,1] 区间上,所以也可将其值看成是概率。我们的目标是找到一个 θ 值,使其能满足:当(输入的样本) x 属于 “1” 类的概率时,P(y=1x)=hθ(x) 的值很大;或者反之,当计算 x 属于 “0” 类的概率时,P(y=0x)=hθ(x) 的值很大。对于一组两类标记 {(x(i),y(i));i=1,...,m} 的训练样本,使用下面的成本函数(Cost Function)来评估这个假设 hθ 的好坏:

J(θ)=i(y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))).

需要注意的是,在上式的加和形式中,对每个训练样本,两项中只有一项是非零的(这取决于样本的真实类别标记 y(i) 是 0 还是 1 )。当 y(i)=1 时,最小化成本函数意味着需要使 hθ(x) 变大,而当 y(i)=0 时,(正如前文所讲)也想要 1hθ 变大。对于一个逻辑斯特回归(Logistic Regression)的完整解释以及成本函数(Cost Function)的推导过程,可以参考 CS229课程之监督学习 。

现在,有了评价拟合训练数据的假设(或称为“假设函数”) hθ 好坏的成本函数(Cost Function)。通过学习分类训练数据,最小化 J(θ) (的方法)来找参数 θ 的最优值。当完成了这一过程,便可对新的测试点通过计算所属“1”类和“0”类最可能的概率,进行分类。如果 P(y=1x)>P(y=0x) ,那么该样本就将标记为“1”类,否则(P(y=1x)<P(y=0x) )标记为“0”类。其实,这好比检查 hθ>0.5 是否成立。

为了最小化 J(θ) ,可以使用类似线性回归(Linear Regression)的工具。这需要提供一个可以在任意参数 θ 值时,可计算出 J(θ) 和(其微分结果的) θJ(θ) 的函数。在给定参数 θj 时, J(θ) 的微分结果是:

J(θ)θj=ix(i)j(hθ(x(i)y(i))).

若写成向量形式,其整个梯度可表示为:

θJ(θ)=ix(i)(hθ(x(i)y(i))).

除了当前的假设函数 hθ=σ(θx) ,这里的梯度计算与线性回归基本相同。

练习 1B(Exercise 1B)

本次练习的初学者代码已经在初学者代码(Starter Code)的 GitHub Rep 中的 ex1/ 目录中。

在本次练习中,您将会实现逻辑斯特回归(Logistic Regression)的目标函数(Objective Function)以及梯度计算(Gradient Computation),并使用您的代码从 MNIST 数据集 中,学习分类数字(“0”或“1”的)图像。如下是列举的一些数字图片样本:

使用 2828 像素规格来表示每个数字图像,将每张数字图像的格式变成有着 2828=784 个元素的向量 x(i) 的形式。其类标记是 y(i){0,1} 两种值中的一种。

您可以在初学者代码(Starter Code)中的 ex1/ex1b_logreg.m 文件中找到本次的练习。初学者代码(Starter Code)文件里将会给您显示如下任务:

  1. 调用 ex1_load_mnist.m 文件将 MNIST 训练与测试集数据载入。之后读入像素值到矩阵 X 中(第 i 个样本的第 j 个像素值就是 Xji=X(i)j ),同时为了标签行向量 y 具有零均值和单位方差,还需对像素强度做一些简单的标准化处理。尽管 MNIST 数据集 包含了10个不同的数字(09),但在本次练习中,只将读取其中的数字 0 和数字 1 —— ex1_load_mnist 函数将会为您做(数据载入)这些。

  2. 为了 θ0 可以作为截距项(Intercept Term),在代码将中对参数 θ 后面追加一行数值 1

  3. 代码将会调用 minFunc包 中的 logistic_regression.m 文件作为目标函数。您的任务是将 logistic_regression.m 文件中的代码补全,并使其返回目标函数值及其梯度值。

  4. minFunc包 (的计算)完成后,在训练集和测试集上的分类准确率将会打印出来。

(类似先前的)线性回归中的练习,您将会实现 logistic_regression.m,(该文件中的代码)在所有的训练样本 x(i) 上进行循环,计算出目标函数 J(θ;X,y) 的值。所得到的目标值将会保存在变量 f 中。你也需要计算梯度 θJ(θ;X,y) 并将其结果保存至变量 g 中。当你完成了这些任务,你将可以运行 ex1b_logreg.m 中的代码来训练分类器并测试它(的性能)。

如果您的代码工作正常,您将会发现您的分类器在训练集和测试集上能够达到100%的准确率!实际上,这是一个较简单的分类问题,因为数字 01 本身看起来就很不相同。在今后的练习中,想要得到像这样完美的结果其实是很困难的。

阅读全文
0 0
原创粉丝点击