逻辑回归(Logistic Regression)(吴恩达机器学习)

6、 逻辑回归(Logistic Regression)

6.1 分类问题

参考文档: 6 - 1 - Classification (8 min).mkv
        在这个以及接下来的几个视频中,开始介绍分类问题。
        在分类问题中,你要预测的变量 y 是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。
        在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问题的例子有:判断一封电子邮件是否是垃圾邮件;判断一次金融交易是否是欺诈;之前我们也谈到了肿瘤分类问题的例子,区别一个肿瘤是恶性的还是良性的。
在这里插入图片描述

        我们从二元的分类问题开始讨论。
        我们将因变量**(dependent variable**)可能属于的两个类分别称为负向类(negative class)和正向类(positive class),则因变量 ,其中 0 表示负向类,1 表示正向类。
在这里插入图片描述
在这里插入图片描述
        如果我们要用线性回归算法来解决一个分类问题,对于分类, y 取值为 0 或者1,但如果你使用的是线性回归,那么假设函数的输出值可能远大于 1,或者远小于0,即使所有训练样本的标签 y 都等于 0 或 1。尽管我们知道标签应该取值0 或者1,但是如果算法得到的值远大于1或者远小于0的话,就会感觉很奇怪。所以我们在接下来的要研究的算法就叫做逻辑回归算法,这个算法的性质是:它的输出值永远在0到 1 之间。
        顺便说一下,逻辑回归算法是分类算法,我们将它作为分类算法使用。有时候可能因为这个算法的名字中出现了“回归”使你感到困惑,但逻辑回归算法实际上是一种分类算法,它适用于标签 y 取值离散的情况,如:1 0 0 1。
        接下来的视频中,我们将开始学习逻辑回归算法的细节。

6.2 假说表示

参考视频: 6 - 2 - Hypothesis Representation (7 min).mkv
        在这段视频中,我要给你展示假设函数的表达式,也就是说,在分类问题中,要用什么样的函数来表示我们的假设。此前我们说过,希望我们的分类器的输出值在0和1之间,因此,我们希望想出一个满足某个性质的假设函数,这个性质是它的预测值要在0和1之间。
        回顾在一开始提到的乳腺癌分类问题,我们可以用线性回归的方法求出适合数据的一条直线:
在这里插入图片描述
        根据线性回归模型我们只能预测连续的值,然而对于分类问题,我们需要输出0或1,我们可以预测:
        当h_θ (x)>=0.5时,预测 y=1。
        当h_θ (x)<0.5时,预测 y=0 。
        对于上图所示的数据,这样的一个线性模型似乎能很好地完成分类任务。假使我们又观测到一个非常大尺寸的恶性肿瘤,将其作为实例加入到我们的训练集中来,这将使得我们获得一条新的直线。
在这里插入图片描述
        这时,再使用0.5作为阀值来预测肿瘤是良性还是恶性便不合适了。可以看出,线性回归模型,因为其预测的值可以超越[0,1]的范围,并不适合解决这样的问题。
        我们引入一个新的模型,逻辑回归,该模型的输出变量范围始终在0和1之间。 逻辑回归模型的假设是:
在这里插入图片描述
其中: X 代表特征向量 g 代表逻辑函数(logistic function)是一个常用的逻辑函数为S形函数(Sigmoid function),公式为:
在这里插入图片描述
        python代码实现:

import numpy as np
def sigmoid(z):
   return 1 / (1 + np.exp(-z))

        该函数的图像为:
在这里插入图片描述
        合起来,我们得到逻辑回归模型的假设:
        对模型的理解:
在这里插入图片描述
        h_θ (x)的作用是,对于给定的输入变量,根据选择的参数计算输出变量=1的可能性(estimated probablity)即
在这里插入图片描述
        例如,如果对于给定的x,通过已经确定的参数计算得出h_θ (x)=0.7,则表示有70%的几率y为正向类,相应地y为负向类的几率为1-0.7=0.3。

6.3 判定边界

参考视频: 6 - 3 - Decision Boundary (15 min).mkv
        现在讲下决策边界(decision boundary)的概念。这个概念能更好地帮助我们理解逻辑回归的假设函数在计算什么。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
        假使我们的数据呈现这样的分布情况,怎样的模型才能适合呢?
在这里插入图片描述
        因为需要用曲线才能分隔 y=0 的区域和 y=1 的区域,我们需要二次方特征:
在这里插入图片描述
则我们得到的判定边界恰好是圆点在原点且半径为1的圆形。
        我们可以用非常复杂的模型来适应非常复杂形状的判定边界。

6.4 代价函数

参考视频: 6 - 4 - Cost Function (11 min).mkv
        在这段视频中,我们要介绍如何拟合逻辑回归模型的参数θ。具体来说,我要定义用来拟合参数的优化目标或者叫代价函数,这便是监督学习问题中的逻辑回归模型的拟合问题。
在这里插入图片描述
        对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将:
在这里插入图片描述
带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convexfunction)。
在这里插入图片描述
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
在这里插入图片描述
在这里插入图片描述
Python代码实现:

import numpy as np
def cost(theta, X, y):
  theta = np.matrix(theta)
  X = np.matrix(X)
  y = np.matrix(y)
  first = np.multiply(-y, np.log(sigmoid(X* theta.T)))
  second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T)))
  return np.sum(first - second) / (len(X))

        在得到这样一个代价函数以后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:
在这里插入图片描述
        在这个视频中,我们定义了单训练样本的代价函数,凸性分析的内容是超出这门课的范围的,但是可以证明我们所选的代价值函数会给我们一个凸优化问题。代价函数J(θ)会是一个凸函数,并且没有局部最优值。
推导过程:
在这里插入图片描述
在这里插入图片描述
注:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的h_θ (x)=g(θ^T X)
与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法之前,进行特征缩放依旧是非常必要的。
        一些梯度下降算法之外的选择: 除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS) ,fminunc是 matlab和octave 中都带的一个最小值优化函数,使用时我们需要提供代价函数和每个参数的求导,下面是 octave 中使用 fminunc 函数的代码示例:

function [jVal, gradient] = costFunction(theta)
    jVal = [...code to compute J(theta)...];
    gradient = [...code to compute derivative of J(theta)...];
end
options = optimset('GradObj', 'on', 'MaxIter', '100');
initialTheta = zeros(2,1);
    
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);

        在下一个视频中,我们会把单训练样本的代价函数的这些理念进一步发展,然后给出整个训练集的代价函数的定义,我们还会找到一种比我们目前用的更简单的写法,基于这些推导出的结果,我们将应用梯度下降法得到我们的逻辑回归算法。

6.5 简化的成本函数和梯度下降

参考视频: 6 - 5 - Simplified Cost Function and Gradient Descent (10 min).mkv
        在这段视频中,我们将会找出一种稍微简单一点的方法来写代价函数,来替换我们现在用的方法。同时我们还要弄清楚如何运用梯度下降法,来拟合出逻辑回归的参数。因此,听了这节课,你就应该知道如何实现一个完整的逻辑回归算法。
        这就是逻辑回归的代价函数:
在这里插入图片描述
        所以我们想要尽量减小这一项,这将我们将得到某个参数θ。
        如果我们给出一个新的样本,假如某个特征 x,我们可以用拟合训练样本的参数θ,来输出对假设的预测。
        另外,我们假设的输出,实际上就是这个概率值:p(y=1|x;θ),就是关于 x以θ为参数,y=1 的概率,你可以认为我们的假设就是估计 y=1 的概率,所以,接下来就是弄清楚如何最大限度地最小化代价函数J(θ),作为一个关于θ的函数,这样我们才能为训练集拟合出参数θ。
        最小化代价函数的方法,是使用梯度下降法(gradient descent)。这是我们的代价函数:
在这里插入图片描述
如果我们要最小化这个关于θ的函数值,这就是我们通常用的梯度下降法的模板。
在这里插入图片描述
        我们要反复更新每个参数,用这个式子来更新,就是用它自己减去学习率 α 乘以后面的微分项。求导后得到:
在这里插入图片描述
在这里插入图片描述
        现在,如果你把这个更新规则和我们之前用在线性回归上的进行比较的话,你会惊讶地发现,这个式子正是我们用来做线性回归梯度下降的。
        那么,线性回归和逻辑回归是同一个算法吗?要回答这个问题,我们要观察逻辑回归看看发生了哪些变化。实际上,假设的定义发生了变化。
        对于线性回归假设函数:
在这里插入图片描述
        因此,即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是两个完全不同的东西。
        在先前的视频中,当我们在谈论线性回归的梯度下降法时,我们谈到了如何监控梯度下降法以确保其收敛,我通常也把同样的方法用在逻辑回归中,来监测梯度下降,以确保它正常收敛。
        当使用梯度下降法来实现逻辑回归时,我们有这些不同的参数θ,就是θ_0 θ_1 θ_2 一直到θ_n,我们需要用这个表达式来更新这些参数。我们还可以使用 for循环来更新这些参数值,用 for i=1 to n,或者 for i=1 to n+1。当然,不用 for循环也是可以的,理想情况下,我们更提倡使用向量化的实现,可以把所有这些 n个参数同时更新。
        最后还有一点,我们之前在谈线性回归时讲到的特征缩放,我们看到了特征缩放是如何提高梯度下降的收敛速度的,这个特征缩放的方法,也适用于逻辑回归。如果你的特征范围差距很大的话,那么应用特征缩放的方法,同样也可以让逻辑回归中,梯度下降收敛更快。
        就是这样,现在你知道如何实现逻辑回归,这是一种非常强大,甚至可能世界上使用最广泛的一种分类算法。
所有巧合的是要么是上天注定要么是一个人偷偷的在努力。
在这里插入图片描述
个人微信公众号,专注于学习资源、笔记分享,欢迎关注。我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活,,如果觉得有点用的话,请不要吝啬你手中点赞的权力,谢谢我亲爱的读者朋友
五角钱的程序员,专注于学习资源、笔记分享。

The higher we soar, the smaller we appear to those who cannot fly.

我们飞得越高,我们在那些不能飞的人眼中的形象就越渺小。

猜你喜欢

转载自blog.csdn.net/youif/article/details/105579249