zoukankan      html  css  js  c++  java
  • 信息熵

    一、通俗解释

    熵是衡量“信息量“大小的一个数值。什么叫”信息量“?举个例子。

    假设你现在玩一个猜硬币正反面的游戏,有个人扔一次硬币,你猜正反面,猜对了可以拿100块钱,猜错了就没有钱。

    现在有一个能预知未来的人,他知道本次抛硬币的结果,并且他愿意告诉你,只要你给他一定数量的钱。

    那么在如下四种情况下,如果他告诉你下一次硬币抛出的是”正面“,你愿意付多少钱给他呢?

    1. 你知道此硬币100%会出正面;(比如这枚硬币两边都是正面)

    2. 你知道此硬币50%会出正面;

    3. 你知道此硬币80%会出正面。

    第一种情况显然你不会给他一分钱的,因为你已经知道该硬币永远都会出正面,他说会出正面跟没说一样;

    第二种情况你可能愿意最多给他50元,因为你随便猜正反面,期望收益是50,所以你给超过50元就亏了;

    同理,第三种情况你最多只愿意给他20元。由此可见,一条信息的信息量大小是有区别的,直白点说“信息量”大概就是你知道这条信息以后的“惊讶程度”。

    比如第四种情况,你肯定会去猜反面,但是你发现下次扔出的是正面,你就会想“卧槽居然扔出的是正面”,这你就会觉得“信息量太大,受不了”。

    信息熵的定义是:如果一个事件发生的概率是p(x),则其信息熵为H=logfrac{1}{p(x)} ,你可以验证一下:如果这件事发生的概率是1,则其信息熵H=0,意思就是说了跟没说一样;

    如果这件事发生的概率无穷小,比如“中国队拿了世界杯冠军”,那么它的信息熵H趋于无穷,你听到这个消息的时候心里就会有无数个“卧槽”。

    刚才所说的是针对一个事件的信息熵,那么如果是一个随机变量的话,信息熵描述的就是它的不确定程度,这就是为什么它叫做“熵”。

    针对一个随机变量的信息熵定义是,如果变量A有k种可能取值,第i 种的发生概率为p(i),则A的熵为每种可能的信息熵的加权平均数(或者说是熵的期望),即H(A)=sum_ip(i)logfrac{1}{p(i)}

    比如你扔一个骰子,正常情况下扔出1-6的可能性都是1/6,那么H=log6;但是如果你已经事先知道这骰子其实只能扔出1,那么扔骰子这件事的熵就是0,你扔了和没扔一样。

    随机变量的熵也描述了,你做一次这个实验,对你而言能获得的信息量有多少。如果这个实验你每次做全是一个结果,那你还做它干啥?差不多就是这个意思。可以证明,当且仅当这k种可能性发生概率均等的时候,事件A的熵是最高的。

    那么为啥要取个log?直接1/p(i)不行么?我觉得其他答案解释的比较好。

    我个人理解,取log的好处有两点,

    一是它可以表示“描述这件事所有可能性的最短平均编码长度”。比如你做一个实验,有4种可能的结果,如果它们是等可能的,那么你必须得用两个bit才能表示出来(00,01,10,11)。

    但是如果你事先知道其中有一种结果a出现的可能性远高于其他的,那么你就可以给这种可能性更短的编码(比如0就是a,bcd分别是10,110,111),这样由于a出现的概率非常高,你的平均编码长度就短了。

    顺带一提这就是霍夫曼编码的过程。

    第二个好处是取log可以使熵可加,设想你同时做两个互相独立的实验,出现的结果分别是a和b,那么这件事发生的概率是p(a)*p(b),你得到的信息熵 就是logfrac{1}{p(a)*p(b)}=logfrac{1}{p(a)}+logfrac{1}{p(b)}=H(a)+H(b)

    二、结合公式解释

    熵的概念首先在热力学中引入,用于表述热力学第二定律。波尔兹曼研究得到,热力学熵与微观状态数目的对数之间存在联系,并给出了公式:

    S=kln W

    这个公式也作为他最骄傲的成绩,刻在了他的墓碑上。

    信息熵的定义与上述这个热力学的熵,虽然不是一个东西,但是有一定的联系。熵在信息论中代表随机变量不确定度的度量。一个离散型随机变量 X 的熵 H(X) 定义为:

    H(X)=-sumlimits_{xinmathcal{X}}p(x)log p(x)

    这个定义的特点是,有明确定义的科学名词且与内容无关,而且不随信息的具体表达式的变化而变化。是独立于形式,反映了信息表达式中统计方面的性质。是统计学上的抽象概念。

    所以这个定义如题主提到的可能有点抽象和晦涩,不易理解。那么下面让我们从直觉出发,以生活中的一些例子来阐述信息熵是什么,以及有什么用处。

    直觉上,信息量等于传输该信息所用的代价,这个也是通信中考虑最多的问题。比如说:赌马比赛里,有4匹马 {A,B,C,D} ,获胜概率分别为 {frac{1}{2},frac{1}{4},frac{1}{8},frac{1}{8}}

    接下来,让我们将哪一匹马获胜视为一个随机变量 Xin{A,B,C,D} 。假定我们需要用尽可能少的二元问题来确定随机变量 X 的取值。

    例如:问题1:A获胜了吗?问题2:B获胜了吗?问题3:C获胜了吗?最后我们可以通过最多3个二元问题,来确定 X 的取值,即哪一匹马赢了比赛。

    如果 X=A ,那么需要问1次(问题1:是不是A?),概率为 frac{1}{2}

    如果 X=B ,那么需要问2次(问题1:是不是A?问题2:是不是B?),概率为 frac{1}{4}

    如果 X=C ,那么需要问3次(问题1,问题2,问题3),概率为 frac{1}{8} ;

    如果 X=D ,那么同样需要问3次(问题1,问题2,问题3),概率为 frac{1}{8}

    那么很容易计算,在这种问法下,为确定 X 取值的二元问题数量为:

    E(N)=frac{1}{2}cdot1+frac{1}{4}cdot2+frac{1}{8}cdot3+frac{1}{8}cdot3=frac{7}{4}

    那么我们回到信息熵的定义,会发现通过之前的信息熵公式,神奇地得到了:

    H(X)=frac{1}{2}log(2)+frac{1}{4}log(4)+frac{1}{8}log(8)+frac{1}{8}log(8)=frac{1}{2}+frac{1}{2}+frac{3}{8}+frac{3}{8}=frac{7}{4}mathrm{bits}

    在二进制计算机中,一个比特为0或1,其实就代表了一个二元问题的回答。也就是说,在计算机中,我们给哪一匹马夺冠这个事件进行编码,所需要的平均码长为1.75个比特。

    平均码长的定义为: L(C)=sumlimits_{xinmathcal{X}}p(x)l(x)

    很显然,为了尽可能减少码长,我们要给发生概率 p(x) 较大的事件,分配较短的码长 l(x) 。这个问题深入讨论,可以得出霍夫曼编码的概念。

    那么 {A,B,C,D} 四个实践,可以分别由 {0,10,110,111} 表示,那么很显然,我们要把最短的码 0 分配给发生概率最高的事件 A ,以此类推。而且得到的平均码长为1.75比特。如果我们硬要反其道而行之,给事件 A 分配最长的码 111 ,那么平均码长就会变成2.625比特。

    霍夫曼编码就是利用了这种大概率事件分配短码的思想,而且可以证明这种编码方式是最优的。我们可以证明上述现象:

    • 为了获得信息熵为 H(X) 的随机变量 X 的一个样本,平均需要抛掷均匀硬币(或二元问题) H(X) 次(参考猜赛马问题的案例)
    • 信息熵是数据压缩的一个临界值(参考码长部分的案例)。

    这可能是信息熵在实际工程中,信息熵最最重要且常见的一个用处。

    最后,解释下信息熵公式的由来:

    H(X)=-sumlimits_{xinmathcal{X}}p(x)log p(x)

    信息论之父克劳德·香农,总结出了信息熵的三条性质:

    • 单调性,即发生概率越高的事件,其所携带的信息熵越低。极端案例就是“太阳从东方升起”,因为为确定事件,所以不携带任何信息量。从信息论的角度,认为这句话没有消除任何不确定性。
    • 非负性,即信息熵不能为负。这个很好理解,因为负的信息,即你得知了某个信息后,却增加了不确定性是不合逻辑的。
    • 累加性,即多随机事件同时发生存在的总不确定性的量度是可以表示为各事件不确定性的量度的和。写成公式就是:

    事件 X=A,Y=B 同时发生,两个事件相互独立 p(X=A,Y=B)=p(X=A)cdot p(Y=B)

    那么信息熵 H(A,B)=H(A)+H(B)

    香农从数学上,严格证明了满足上述三个条件的随机变量不确定性度量函数具有唯一形式:

    H(X)=-Csumlimits_{xinmathcal{X}}p(x)log p(x)

    其中的 C 为常数,我们将其归一化为 C=1 即得到了信息熵公式。

    此外,如果两个事件不相互独立,那么满足

    H(A,B)=H(A)+H(B)-I(A,B) ,其中 I(A,B) 是互信息(mutual information),代表一个随机变量包含另一个随机变量信息量的度量,这个概念在通信中用处很大。

    比如一个点到点通信系统中,发送端信号为 X ,通过信道后,接收端接收到的信号为 Y ,那么信息通过信道传递的信息量就是互信息 I(X,Y)

    根据这个概念,香农推出了一个十分伟大的公式,香农公式,给出了临界通信传输速率的值,即信道容量:

    C=Blog(1+frac{S}{N})

    三、举例解释

    补一个从信息编码角度的理解。熵的定义就不写了,其他答案都有。信息论中,熵也代表着根据信息的概率分布对信息编码所需要的最短平均编码长度。

    举个简单的例子来理解一下这件事情:假设有个考试作弊团伙,需要连续不断地向外传递4选1单选题的答案。直接传递ABCD的ascii码的话,每个答案需要8个bit的二进制编码,从传输的角度,这显然有些浪费。信息论最初要解决的,就是数据压缩和传输的问题,所以这个作弊团伙希望能用更少bit的编码来传输答案。很简单,答案只有4种可能性,所以二进制编码需要的长度就是取2为底的对数:

    log_2(4)=2

    2个bit就足够进行四个答案的编码了(00,01,10,11)。在上面这个例子中,其实隐含了一种假设,就是四个答案出现概率是相等的,均为p=1/4,所以编码需要长度的计算可以理解为如下的形式:

    log_2(4)=log_2(frac{1}{1/4} )=-log_2(1/4 )=-log_2(p)

    此时已经有些像熵的定义了。回顾一下熵的定义,正是求-log2(p)的期望值,所以我们把这个思路也套用一下:

    H(X)=E[-log_2(P(X))]=-sum_{x in {A,B,C,D}}{P(x)log_2(P(x))}

    这正是熵,因为ABCD出现的概率均为p=1/4,所以上面式子算出来结果刚好是2。从这个角度,熵就是对每个可能性编码需要长度的期望值。

    答案出现概率相等的例子可能并不贴近实际,在中国考试界,坊间传闻:“不知道选什么的时候就蒙C”,这个信息是可以帮助作弊团队改善编码长度的。假设A出现的概率不变仍为1/4,C出现的概率变成了1/2,B和D则分别是1/8:P(A)=1/4,P(B)=1/8,P(C)=1/2,P(D)=1/8。在这种情况下,考虑到传递答案的过程中,C出现的次数(概率)最高,所以可以为C用短一些的编码,而出现次数较少的B和D则可以考虑用长一些的编码。这样的话,平均下来,对于一定的信息总量,需要的编码总长度就会少一些。根据熵的定义的思路,对于出现概率为p的事件,考虑用长度为-log2(p)的二进制进行编码。所以考虑如下面的编码:

    A: 10

    B: 110

    C: 0

    D: 111

    对照熵的公式来计算一下编码长度的期望值,也就是平均编码长度:

    H(X)=-sum_{x in {A,B,C,D}}{P(x)log_2(P(x))} 
=frac{1}{4} 	imes m{2}+frac{1}{8} 	imes m{3}+frac{1}{2} 	imes m{1}+frac{1}{8} 	imes m{3}=1.75

    再详细点,假设作弊团伙要传递200个答案出去。为了方便说明,这200个答案中ABCD出现的次数恰好都严格和其出现概率成比例,也就是A:50次,B:25次,C:100次,D:25次。所以传递200个答案一共需要的bit数是:

    50 	imes m{2}+25 	imes m{3}+100 	imes m{1}+25 	imes m{3}=350

    那么平均下来每个答案耗费了350/200=1.75个bit编码长度。

    在实际情况中,并不是每个信息都可以单纯按照上面的两个例子进行二进制编码。比如一个事件出现概率为0.3,那么我们也不知道该如何用一个-log2(0.3)=1.74个bit的二进制编码表示。但是平均编码长度的概念是可以拓展的,代表了对随机变量的平均不确定度的度量。比如ABCD四个答案出现概率相等时,是一种最无序最不确定的状态,谁也蒙不准下一个答案是什么;但是如果C出现概率高了,那么答案出现就不是那么没规律,我们蒙C时的信心就高了一些。

    最后,举例只是为了举例,考试作弊三观不正,做人还是应该诚实。


    引自知乎:

    作者:D.Han 链接:https://www.zhihu.com/question/22178202

    作者:柯伟辰 链接:https://www.zhihu.com/question/22178202

    作者:YE Y 链接:https://www.zhihu.com/question/22178202

  • 相关阅读:
    常见的消息队列中间件介绍
    关系型数据库和非关系型数据库区别、oracle与mysql的区别
    SQL Server 和 Oracle 以及 MySQL 数据库
    Redis,Memcache,MongoDb的特点与区别
    详解布隆过滤器的原理,使用场景和注意事项
    Redis缓存穿透、缓存击穿以及缓存雪崩
    RPC、HTTP、RESTful
    集群,分布式,微服务概念和区别理解
    电脑双屏变单屏后,界面显示问题
    JDK 15已发布,你所要知道的都在这里!
  • 原文地址:https://www.cnblogs.com/zzdbullet/p/10070333.html
Copyright © 2011-2022 走看看