• python机器学习——逻辑回归


    我们知道感知器算法对于不能完全线性分割的数据是无能为力的,在这一篇将会介绍另一种非常有效的二分类模型——逻辑回归。在分类任务中,它被广泛使用

    逻辑回归是一个分类模型,在实现之前我们先介绍几个概念:

    几率(odds ratio):

    [frac {p}{(1-p)} ]

    其中p表示样本为正例的概率,当然是我们来定义正例是什么,比如我们要预测某种疾病的发生概率,那么我们将患病的样本记为正例,不患病的样本记为负例。为了解释清楚逻辑回归的原理,我们先介绍几个概念。

    我们定义对数几率函数(logit function)为:

    [logit(p) = log frac {p}{(1-p)} ]

    对数几率函数的自变量p取值范围为0-1,通过函数将其转化到整个实数范围中,我们使用它来定义一个特征值和对数几率之间的线性关系为:

    [logit(p(y=1|x)) = w_0x_0+w_1x_1+...+w_mx_m = sum_i^nw_ix_i=w^Tx ]

    在这里,p(y=1|x)是某个样本属于类别1的条件概率。我们关心的是某个样本属于某个类别的概率,刚好是对数几率函数的反函数,我们称这个反函数为逻辑函数(logistics function),有时简写为sigmoid函数:

    [phi(z) = frac{1}{1+e^{-z}} ]

    其中z是权重向量w和输入向量x的线性组合:

    [z = w^Tx=w_0+w_1x_1+...+w_mx_m ]

    现在我们画出这个函数图像:

    import matplotlib.pyplot as plt
    
    import numpy as np
    
    def sigmoid(z):
        return 1.0 / (1.0 + np.exp(-z))
    
    z = np.arange(-7, 7, 0.1)
    
    phi_z = sigmoid(z)
    
    plt.plot(z, phi_z)
    plt.axvline(0.0, color='k')
    plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted')
    plt.yticks([0.0, 0.5, 1.0])
    plt.ylim(-0.1, 1.1)
    plt.xlabel('z')
    plt.ylabel('$phi (z)$')
    plt.show()
    

    可以看出当z接近于正无穷大时,函数值接近1,同样当z接近于负无穷大时,函数值接近0。所以我们知道sigmoid函数将一个实数输入转化为一个范围为0-1的一个输出。

    我们将逻辑函数将我们之前学过的Adaline联系起来,在Adaline中,我们的激活函数的函数值与输入值相同,而在逻辑函数中,激活函数为sigmoid函数。

    sigmoid函数的输出被解释为某个样本属于类别1的概率,用公式表示为:

    [hat y=egin{cases}1,quad phi(z)ge 0.5 \\0,quad otherwiseend{cases} ]

    也就是当函数值大于0.5时,表示某个样本属于类别1的概率大于0.5,于是我们就将此样本预测为类别1,否则为类别0。我们仔细观察上面的sigmoid函数图像,上式也等价于:

    [hat y=egin{cases}1,quad zge 0.0 \\0,quad otherwiseend{cases} ]

    逻辑回归的受欢迎之处就在于它可以预测发生某件事的概率,而不是预测这件事情是否发生。

    我们已经介绍了逻辑回归如何预测类别概率,接下来我们来看看逻辑回归如何更新权重参数w

    对于Adaline,我们的损失函数为:

    [J(w) = sum_ifrac12(phi(z^{(i)})-y^{(i)})^2 ]

    我们通过最小化这个损失函数来更新权重w。为了解释我们如何得到逻辑回归的损失函数,在构建逻辑回归模型时我们要最大化似然L(假设数据集中的所有样本都是互相独立的):

    [L(w)=P(y|x,w)=prod^n_{i=1}P(y^{(i)}|x^{(i)};w)=prod^n_{i=1}(phi(z^{(i)}))^{y^{(i)}}(1-phi(z^{(i)}))^{1-y^{(i)}} ]

    通常我们会最大化L的log形式,我们称之为对数似然函数

    [l(w)=logL(w)=sum_{i=1}^nleft[y^{(i)}log(phi(z^{(i)})+(1-y^{(i)})log(1-phi(z^{(i)})) ight] ]

    这样做有两个好处,一是当似然很小时,取对数减小了数字下溢的可能性,二是取对数后将乘法转化为了加法,可以更容易的得到函数的导数。现在我们可以使用一个梯度下降法来最大化对数似然函数,我们将上面的对数似然函数转化为求最小值的损失函数J:

    [J(w)=sum_{i=1}^nleft[-y^{(i)}log(phi(z^{(i)}))-(1-y^{(i)})log(1-phi(z^{(i)})) ight] ]

    为了更清晰的理解上式,我们假设对一个样本计算它的损失函数:

    [J(phi(z),y;w)=-ylog(phi(z))-(1-y)log(1-phi(z)) ]

    可以看出,当y=0时,式子的第一部分为0,当y=1时,式子的第二部分为0,也就是:

    [J(phi(z),y;w)=egin{cases}-log(phi(z)),quad if y=1 \\-log(1-phi(z)),quad if y=0end{cases} ]

    可以看出,当我们预测样本所属于的类别时,当预测类别是样本真实类别的概率越大时,损失越接近0,而当预测类别是真实类别的概率越小时,损失越接近无穷大。

    作为举例,我们这里对权重向量w中的一个分量进行更新,首先我们求此分量的偏导数:

    [frac{partial }{partial w_j}l(w) = left(yfrac{1}{phi(z)}-(1-y)frac{1}{1-phi(z)} ight)frac{partial }{partial w_j}phi(z) ]

    在继续下去之前,我们先计算一下sigmoid函数的偏导数:

    [frac{partial }{partial z}phi(z) = frac{partial }{partial z}frac{1}{1+e^{-z}}=frac{1}{(1+e^{-z})^2}e^{-z}=frac{1}{1+e^{-z}}(1-frac{1}{1+e^{-z}})\=phi(z)(1-phi(z)) ]

    现在我们继续:

    [left(yfrac{1}{phi(z)}-(1-y)frac{1}{1-phi(z)} ight)frac{partial }{partial w_j}phi(z)\=left(yfrac{1}{phi(z)}-(1-y)frac{1}{1-phi(z)} ight)phi(z)(1-phi(z))frac{partial }{partial w_j}z\=left(y(1-phi(z))-(1-y)phi(z) ight)x_j\=(y-phi(z))x_j ]

    所以我们的更新规则为:

    [w_j = w_j + etasum^n_{i=1}left(y^{(i)}-phi(z^{(i)}) ight)x_j^{(i)} ]

    因为我们要同时更新权重向量w的所有分量,所以我们更新规则为(此处w为向量):

    [w = w+Delta w\Delta w = eta abla l(w) ]

    因为最大化对数似然函数也就等价于最小化损失函数J,于是梯度下降更新规则为:

    [Delta w_j=-etafrac{partial J}{partial w_j}=etasum^n_{i=1}left(y^{(i)}-phi(z^{(i)}) ight)x^{(i)}_j\w=w+Delta w,Delta w=-eta abla J(w) ]

  • 相关阅读:
    华为移动HG8546M光猫路由器通过lan口再连接路由器
    Windows下使用Dev C++ 编写dll与使用dll(二)C++项目下的dll
    Windows下使用Dev C++ 编写dll与使用dll(一)C项目下的dll
    易语言之dll文件的编写与引入
    易语言之编写模块与引入模块
    Element ui 分页记录选中框
    MUI poppicker.js 增加搜索框
    element el-date-picker 去除自带的T格式
    element el-input小数保留两位小数,整数字符串去空格
    nginx vue三级目录配置
  • 原文地址:https://www.cnblogs.com/Xlgd/p/11880614.html
Copyright © 2020-2023  润新知