zoukankan      html  css  js  c++  java
  • Logistic Regression 的简单推导

    Logistic regression 将 sigmoid 函数 $s(x) = frac{1}{1+e^{-x}}$ 视为样本属于正例($y=1$)的概率。给定一个参数向量 $ heta$,所有训练样本都属于它们被标记的类别的概率为 $$L( heta) = prod_i (s(x_i^T heta))^{y_i}(1-s(x_i^T heta))^{1-y_i}$$ 其中 $x_i$ 表示第 $i$ 个训练样本的各个特征组成的向量,$y_i$ 表示第 $i$ 个训练样本的“答案分类”,是一个为 0 或者为 1 的数值。对上式取对数并加上负号,就获得了 logistic regression 的损失函数 $$J( heta) = -sum_i (y_i ext{log}(s(x_i^T heta)) + (1-y_i) ext{log}(1-s(x_i^T heta)))$$ 显然 $J( heta)$ 越小,$L( heta)$ 就越大。也就是说,logistic regression 使用了极大似然估计法,作为训练 $ heta$ 的标准。

    我们可以通过求出 $J( heta)$ 的梯度,再使用梯度下降法从而求出 $ heta$ 的最优值。当然,这就要求 $J( heta)$ 是一个凸函数。以下对这些内容进行简单推导。

    代价函数是否为凸函数

    首先将代价函数展开并进行整理,我们可以发现 $$J( heta) = -sum_i (y_ix_i^T heta - ext{log}(1+e^{x_i^T heta}))$$

    接下来我们证明 $J( heta)$ 为凸函数。为了简化问题,我们转而证明 $J(x) = -yx+ ext{log}(1+e^x)$ 是凸函数(其中 $x$ 和 $y$ 均为数值)。很容易发现两者的证明是等价的。

    要证明 $J(x)$ 为凸函数,我们可以观察它的二次导数:$$J^{''}(x) = frac{e^x(1+e^x)-(e^x)^2}{(1+e^x)^2} = frac{e^x}{(1+e^x)^2}$$ 容易发现 $J(x)$ 的二次导数非负,可以证明 $J(x)$ 是凸函数,也就证明了 $J( heta)$ 是凸函数,可以使用梯度下降法进行优化。

    梯度的计算

    接下来我们计算 $ abla_ heta J( heta)$:$$ abla_ heta J( heta) = sum_i abla_ heta ext{log}(1+e^{x_i^T heta}) - sum_i abla_ heta y_ix_i^T heta$$ 对第二项使用 $ ext{tr}(ABC) = ext{tr}(CAB)$ 有(注意到 $y_i$ 是数值,并不需要交换顺序): $$ abla_ heta y_ix_i^T heta = abla_ heta ext{tr}( heta y_ix_i^T) = y_ix_i$$ 对第一项使用链式求导法则有:$$ abla_ heta ext{log}(1+e^{x_i^T heta}) = frac{e^{x_i^T heta}}{1+e^{x_i^T heta}} abla_ heta x_i^T heta = s(x_i^T heta)x_i$$ 所以我们有:$$ abla_ heta J( heta) = sum_i(s(x_i^T heta) - y_i)x_i$$ 这样我们就可以使用梯度下降法求出最优的 $ heta$ 了。

  • 相关阅读:
    模板之导入include
    模板之继承
    jQuery ajax简单用法
    Django 路由系统URL
    Django 的简单使用
    python selenium web自动化的三种等待的区别
    Django的数据库介绍
    Django 安装与介绍
    插件轮播
    bootstrap 简单使用(实现图标和按钮下拉)
  • 原文地址:https://www.cnblogs.com/tsreaper/p/logistic-regression.html
Copyright © 2011-2022 走看看