zoukankan      html  css  js  c++  java
  • 分类算法之逻辑回归(Logistic Regression

    分类算法之逻辑回归(Logistic Regression)

    1.二分类问题

    现在有一家医院,想要对病人的病情进行分析,其中有一项就是关于良性恶性肿瘤的判断,现在有一批数据集是关于肿瘤大小的,任务就是根据肿瘤的大小来判定是良性还是恶性。这就是一个很典型的二分类问题,即输出的结果只有两个值----良性和恶性(通常用数字0和1表示)。如图1所示,我们可以做一个直观的判定肿瘤大小大于5,即为恶心肿瘤(输出为1);小于等于5,即为良性肿瘤(输出为0)。

    图1

    2.分类问题的本质

    分类问题本质上属于有监督学习,给定一个已知分类的数据集,然后通过分类算法来让计算机对数据集进行学习,这样计算机就可以对数据进行预测。以肿瘤的例子来说,已有数据集如图1所示,现在要对一个病人的病情进行诊断,那么计算机只需要将该病人的肿瘤大小和5进行比较,然后就可以推断出是恶性还是良性。分类问题和回归问题有一定的相似性,都是通过对数据集的学习来对未知结果进行预测,区别在于输出值不同。回归问题的输出值是连续值(例如房子的价格),分类问题的输出值是离散值(例如恶性或者良性)。既然分类问题和回归问题有一定的相似性,那么我们能不能在回归的基础上进行分类呢?答案是可以的。一种可行的思路是,先用线性拟合,然后对线性拟合的预测结果值进行量化,即将连续值量化为离散值。

    3.分类问题的假设函数

    分类问题虽然和回归问题有一定的类似,但是我们并不能直接使用回归问题中的假设函数作为分类问题的假设函数。还是以图1的例子为例,如果我们采用一元线性函数(即(h(x) = heta_0+ heta_1x))去进行拟合的话,结果可能是这样子的:$h_ heta(x) = dfrac{5}{33}x-frac{1}{3} $,体现在图片中就是:

    图2

    这样,你可能会做这样的一个判断:对于这个线性拟合的假设函数,给定一个肿瘤的大小,只要将其带入假设函数,并将其输出值和0.5进行比较,如果大于0.5,就输出1;小于0.5,就输出0。在图1的数据集中,这种方法确实可以。但是如果将数据集更改一下,如图3所示,此时线性拟合的结果就会有所不同:

    图3

    如果采用相同的方法,那么就会把大小为6的情况进行误判为良好。所以,我们不能单纯地通过将线性拟合的输出值与某一个阈值进行比较这种方式来进行量化。对于逻辑回归,我们的量化函数为Sigmoid函数(也称Logistic函数,S函数)。其数学表达式为:(S(x) = dfrac{1}{1+e^{-x}}) ,其图像如图4:

    图4

    可以看到S函数的输出值就是0和1,在逻辑回归中,我们采用S函数来对线性拟合的输出值进行量化,所以逻辑回归的假设函数为:

    [h_ heta(x)=dfrac{1}{1+e^{- heta^Tx}}=dfrac{1}{1+e^{-sum_{i=0}^n heta_ix_i}} ag{3.1} ]

    其中,(x)为增广特征向量(1*(n+1)维),( heta)为增广权向量(1*(n+1)维)。这个假设函数所表示的数学含义是:对于特定的样本(x)与参数矩阵( heta),分类为1的概率(假设y只有0和1两类),也就即(h_ heta(x) = P(y=1|x; heta))。根据其数学意义,我们可以这样认为:如果(h_ heta(x)>0.5),则判定y = 1;如果(h_ heta(x)<0.5),则判定y = 0。

    4.逻辑回归的代价函数(Cost Function)

    代价函数(成本函数),也就是损失函数。在逻辑回归中,代价函数并不是采用均方误差(主要原因是,逻辑回归的均方误差并不是一个凸函数,并不方便使用梯度下降法),而是通过极大似然法求解出来的一个函数,其数学表达式为:

    [J( heta)= dfrac{1}{m}sum_{i=1}^m[-yln(h_ heta(x))-(1-y)ln(1-h_ heta(x))] ag{4.1} ]

    这个函数看起来有点复杂,我们将它一步步进行拆分来理解,我们将每个样本点与假设函数之间的误差记为(Cost(h_ heta(x),y)=-yln(h_ heta(x))-(1-y)ln(1-h_ heta(x))),这样代价函数就可以理解为误差的均值。下面我们再详细看一下这个误差函数,由于y的取值只能是0或者1,我们可以将误差函数写成分段函数的形式:

    [Cost(h_ heta(x),y)=egin{cases} -ln(h_ heta(x)),quad &y = 1 \ -(1-y)ln(1-h_ heta(x)), &y=0 end{cases} ag{4.2} ]

    4.2式和4.1式是等价的,依据4.2式,不难得出:当y=1时,如果判定为y=1(即(h_ heta(x) = 1)),误差为0;如果误判为y=0((即h_ heta(x) = 0)),误差将会是正无穷大。当y=0时,如果判定为y=0(即(h_ heta(x) = 0)),误差为0;如果误判为y=1(即(h_ heta(x) = 1)),误差将会是正无穷大。(注意:(h_ heta(x) = 1)表示y等于1的概率为1,等价于认为y=1;(h_ heta(x) = 0)表示y等于1的概率为0,等价于认为y=0)

    如果用矩阵来表示代价函数,就是:

    [J( heta)=-dfrac{1}{m}Y^Tln(h_ heta(X))-(E-Y)^Tln(E-h_ heta(X)) ag{4.3} ]

    其中(Y)为样本真实值组成的列向量(m*1维),(X)为增广样本矩阵((1+n)*m维),E为全1列向量(m*1维)。

    5.逻辑回归使用梯度下降法

    逻辑回归的代价函数和线性回归的损失函数一样,都是凸函数,所以我们可以采用梯度下降法来求参数矩阵( heta)使得代价函数(J( heta))取得最小值。其具体算法与线性回归中的梯度下降法(可以参考我的另一篇博客线性回归之梯度下降法)并没有太大区别,只是对应的偏导有所不同。逻辑回归的代价函数的偏导为:

    [dfrac{partial J( heta)}{ heta_i} = dfrac{1}{m}sum_{j=1}^m(h_ heta(x^{(j)})-y^{(j)})x_i^{(j)} = dfrac{1}{m}sum_{j=1}^m(dfrac{1}{1+e^{-sum_{i=0}^n heta_ix_i^{(j)}}}-y^{(j)})x_i^{(j)}quad (i=0,1,dots,n) ag{5.1} ]

    对应的参数更新规则为:

    [ heta_i = heta_i-alphadfrac{partial J( heta)}{ heta_i} = heta_i-alphadfrac{1}{m}sum_{j=1}^m(h_ heta(x^{(j)})-y^{(j)})x_i^{(j)}quad (i=0,1,dots,n) ag{5.2} ]

    如果用矩阵表示就是:

    [dfrac{partial J( heta)}{ heta} = dfrac{1}{m}X^T(h_ heta(X)-Y),quad heta= heta-alphadfrac{1}{m}X^T(h_ heta(X)-Y) ag{5.3} ]

    其中,(alpha)为迭代步长。

    6.多元逻辑回归

    对于多元逻辑回归,一种可行的思路是将其简化为二元。例如,如果数据集的分类包含1,2,3这三个类别。如果现在要判断一个样本是不是类1,我们可以将数据集看作是两类----即1类和非1类(将类2和类3),这样我们就可以求得针对类1的假设函数(h^{(1)}_ heta(x)),同理还有(h^{(2)}_ heta(x))(h^{(3)}_ heta(x))。这样我们的判定规则就变为:

    [if quad max{h^{(i)}_ heta(x)} = h^{(j)}_ heta(x), then quad y = jquad(i,j=1,2,3) ag{6.1} ]

    7.小结

    虽然逻辑回归中带有“回归”二字,但其实它是一个分类算法。逻辑回归的思想和模式识别中的判别函数非常相似,两者可以结合起来进行学习。

    参考链接:

    逻辑回归原理小结

  • 相关阅读:
    Authentication for the REST APIs
    Authentication for the REST APIs
    泛型转Datatable
    Web API 返回json文件的2中不用方式
    Robotframework自定义关键字库
    python通过接口上传图片造测试数据
    robot framework(2) 环境搭建
    RobotFrameWork(1) 关键字驱动测试框架
    python发送带附件的邮件
    解决adb连接海马玩模拟器
  • 原文地址:https://www.cnblogs.com/liyier/p/11823772.html
Copyright © 2011-2022 走看看