array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 【机器学习笔记08】分类器(softmax回归) - 爱码网

【参考资料】
【1】http://deeplearning.stanford.edu/wiki/index.php/Softmax回归
【2】《统计学习方法》
【3】《深度学习》花书 3.13
【4】http://deeplearning.stanford.edu/wiki/index.php/Softmax回归

基本定义

首先给出softmax的数学定义,如下:

hθ(x(i))=[p(y(i)=1x(i);θ)p(y(i)=2x(i);θ)p(y(i)=kx(i);θ)]=1j=1keθjTx(i)[eθ1Tx(i)eθ2Tx(i)eθkTx(i)] h_{\theta}(x^{(i)})=\begin{bmatrix} p(y^{(i)}=1|x^{(i)};\theta) \\ p(y^{(i)}=2|x^{(i)};\theta) \\ \vdots \\ p(y^{(i)}=k|x^{(i)};\theta) \end{bmatrix}=\dfrac{1}{\sum_{j=1}^ke^{\theta_j^Tx^{(i)}}}\begin{bmatrix} e^{\theta_1^Tx^{(i)}} \\ e^{\theta_2^Tx^{(i)}} \\ \vdots \\ e^{\theta_k^Tx^{(i)}} \end{bmatrix}

softmax是用于进行多目标分类的,也就是当我们得到一堆输入样本x(x是一个包含多个特征的向量)时,它可能属于类型A、也可能属于类型B。就想多层神经网络最后添加的softmax层一样,输出的是一个概率。比如输入的人脸,在输出时可以是张三的概率0.4,李四的概率0.6。

回到上面数学公式,模型hθ(x(i))h_{\theta}(x^{(i)})是这样一批条件概率的组合,即参数为 θ\theta(注意这里的θ\theta不是随机变量)下,输出x(i)x^{(i)}关于y(i)y^{(i)}为某一个分类的条件概率。后面增加j=1keθjTx(i)\sum_{j=1}^ke^{\theta_j^Tx^{(i)}}是为了做归一化,也就是所有概率加起来是1。

代价函数

这里要单独把代价函数拿出来,其实logistic回归的问题也一样,即要回答在概率情况下我们用什么样的方式来表示代价?好比在一个距离空间里我们用什么来定义距离。

1. 自信息

在信息论基础下,认为信息中包含一个事件,其发生概率越小越有用。例如“今天天晴”和“今天台风”相比,后者发生概率更小,信息量更大。用白话说就是大家都知道的就是废话。 自信息用数学公式表示如下: I(x)=lnP(x)I(x)=-ln P(x),单位是奈特(nats),即用概率1/e发生的事件。

2. 香农熵

自信息只是一个信息单个的,而我们定义整个分布的信息为香农熵(在连续时也称为微分熵):H(X)=EXP[I(X)]=EXp[log(P(X)]H(X) = E_{X \sim P}[I(X)]=-E_{X \sim p} [log(P(X)]也就是xP(x)ln(P(X))-\sum_xP(x)ln(P(X))

举例:对于二项分布其香农熵相对于概率p为: (1p)ln(1p)plog(p)-(1-p)*ln(1-p)-p*log(p)

3. KL散度

如果同一个随机变量有两种独立的概率分布P(X)和Q(X),则两种分布的差异定义为:DKL(PQ)=EXp[log(P(x)Q(x))]D_{KL}(P||Q) =-E_{X \sim p} [log(\dfrac{P(x)}{Q(x)})]
当KL散度为0时,则认为两者具有相同的分布形式。也可以写为DKL(PQ)=i=1nP(x)log(P(x)/Q(x))D_{KL}(P||Q)=\sum_{i=1}^nP(x)*log(P(x)/Q(x))

举例:
Dkl(observeduniform)=aD_{kl}(observed||uniform)=a 采用均匀分布来近似观察分布的KL散度为a
Dkl(observedbinominal)=bD_{kl}(observed||binominal)=b采用二项分布来近似观察分布的KL散度为b
若a > b,则认为二项分布与观测分布更加接近,因为KL散度更小。

对于softmax的代价损失函数及梯度

对于训练集{(x(1),y(1)),(x(2),y(2))...(x(m),y(m))}\left\{ (x^{(1)}, y^{(1)}),(x^{(2)}, y^{(2)})...(x^{(m)}, y^{(m)}) \right\},其中y(i){1,2,3...k}y^{(i)} \in \left\{1,2,3...k \right\}

我们定义参数θ\theta下,将x分类到y=jy=j的概率为:

p(y(i)=jx(i);θ)=eθjTx(i)l=1keθlTx(i)p(y^{(i)}=j|x^(i);\theta)=\dfrac{e^{\theta_j^Tx^{(i)}}}{\sum_{l=1}^ke^{\theta_l^Tx^{(i)}}}

通过上一部分香农熵的概念,我们定义softmax的损失函数如下:

J(θ)=1/mi=1mj=1k1{y(i)=j}log(p(y(i)=jx(i);θ))J(\theta)=-1/m\sum_{i=1}^m\sum_{j=1}^k1\left\{y^{(i)}=j\right\}log(p(y^{(i)}=j|x^(i);\theta)),对此公式求θ\theta偏导

【机器学习笔记08】分类器(softmax回归)

备注:上面那个推导实在没经历写latex公式,也比较简单,就是复合函数求导,希望以后还能看明白

softmax例子(基于sklearn)

# -*- coding: utf-8 -*-
import numpy  as np
import matplotlib.pyplot as plt
from   sklearn import linear_model


def _test_softmax():

    """
    虚拟构造数据,我们假设构造一个x1, x2的二维特征平面,其范围都是10
    假定x1为水平方向、x2为垂直方向
    存在两个分割线

        1)2*x1 + 5 = x2
        2)2*x1 - 5 = x2

        当特征点在直线1上方时,为分类1,在直线1和2之间时为分类2,在直线2下方时为分类3 
    """

    x1 = np.linspace(0, 10, 500)

    x2 = np.random.random_sample(500)*25

    y  = np.zeros(500)

    for i in range(0, 500) :
        if x2[i] >= (2 * x1[i] + 5):
            y[i] = 1
        elif x2[i] >= (2 * x1[i] - 5):
            y[i] = 2
        else :
            y[i] = 3

    #构造二维特征的输入矩阵
    h = np.transpose(np.vstack((x1, x2)))

    """
    构筑softmax回归模型
    """
    clf = linear_model.LogisticRegression(multi_class="multinomial", solver="lbfgs", C=10.0)
    clf.fit(h, y)

    """
    测试结果如下
    预测为: [1.] 各类概率为 [[1.00000000e+00 1.98641177e-24 5.38851421e-61]]
    预测为: [2.] 各类概率为 [[6.66670055e-10 9.99999985e-01 1.43504834e-08]]
    预测为: [3.] 各类概率为 [[1.52911535e-63 1.58007802e-21 1.00000000e+00]]
    """

    predict = clf.predict([[1, 20]])
    predict_pro = clf.predict_proba([[1, 20]])
    print('预测为:', predict, '各类概率为', predict_pro)

    predict = clf.predict([[10, 20]])
    predict_pro = clf.predict_proba([[10, 20]])
    print('预测为:', predict, '各类概率为', predict_pro)

    predict = clf.predict([[10, 2]])
    predict_pro = clf.predict_proba([[10, 2]])
    print('预测为:', predict, '各类概率为', predict_pro)

    pass

"""
说明:

softmax分类代码实现,对应的笔记《分类器(softmax回归)》

作者:fredric

日期:2018-9-4

"""
if __name__ == "__main__":

    _test_softmax()

相关文章: