转载自:https://blog.csdn.net/theonegis/article/details/79890407,有微量改动
其他文章:
https://blog.csdn.net/u010852680/article/details/77869716
https://blog.csdn.net/lanchunhui/article/details/51140053
http://www.ruanyifeng.com/blog/2014/09/information-entropy.html
物理学中的熵
熵也是物理学中的一个概念。简单来说,如果一个系统中的粒子在运动过程中有很多可能的位置,那么这个系统具有比较高的熵值,反之,如果系统中的粒子处于静止状态(粒子的位置相对固定),则系统具有很低的熵值。
例如,水有三种状态:固液气,具有不同的熵值。冰中的分子位置固定,是一个稳定的状态,所以冰具有最低的熵值。水中的分子相对可以进行一些移动,所以水具有中间大小的熵值。水蒸气中的分子几乎可以移动到任何地方,所以水蒸气具有最大的熵值。
Entropy V.S. Knowledge
从Bucket1 到 Bucket3:
不确定性在增加,无序性在增加,熵在增加
有序性在减少,知识性在减少
桶1给出了关于小球颜色最多的知识(因为我们确定地知道所有小球都是红色)
Entropy and Probability
一个系统中的粒子具有很大的可重新排列的可能性,系统具有较高的熵;反之,具有较低的熵。
计算桶中的球可以重新排列的可能情况。对于桶1,只有一种可能性;对于桶2,有两种可能性;对于桶3,有六种可能。这个可以通过二项式系数计算得到。
小球排列情况的计算并不是熵公式的一部分,但是我们可以发现,有越多排列的可能性,则其熵越大;有越少的排列的可能性,则其熵越小。
有放回的小球实验思考熵该如何定义
给定三个桶。游戏规则如下:
首先我们选择一个桶;
以某种颜色排列取出该桶里面的小球,然后将小球放回;
每次从该桶中取出一个小球并记录颜色,并放回;
四次以后如果记录的颜色和2中的颜色排列一致,则我们获胜,可赢得1,000,000人民币,否则游戏失败。
比如我们选择桶2,里面有三个红球,一个蓝球。我们从桶里面以某种特定的排列取出小球,比如说(红,红,红,蓝)这个颜色排列。然后我们开始一次一次从桶里面取一个小球,如果四次以后,我们取出来的颜色排列也是(红,红,红,蓝)这个组合,那么我们就能获胜。
获胜的概率是多少呢?
第一次取出红球的概率是3/4,即0.75;
第二次取出红球的概率是3/4(我们每次都是有放回的取出);
第三次取出红球的概率仍然是3/4;
第四次取出蓝球的概率是1/4,即0.25。
这四次操作都是独立事件,独立事件同时发生的概率使用乘法公式即:(3/4)∗(3/4)∗(3/4)∗(1/4)=27/256(3/4)∗(3/4)∗(3/4)∗(1/4)=27/256,即0.105。这是一个很小的概率。下面的图给出了我们使用每个桶想要获胜的概率。
为了方面说明,下面的图给出了使用每个桶获胜的概率。对于桶1,获胜的概率为1;对于桶2,概率为0.105;对于桶3,概率为0.0625.
为了得到熵的计算公式,我们需要一个大小相反的度量,对于桶1有最小值,对于桶2有一个中间的值,对于桶3有最大值。这个很简单,我们可以使用对数进行处理得到我们想要的结果。
思考如何定义熵第一步·两个类别·将连乘转变为连加
下面的处理使用了很简单的数学技巧,特别是在机器学习中使用的比较广泛。连乘一般都不会得到一个比较好的结果。这里我们有四个数字,每个都不是特别差,但是如果我们有一百万个数据点,这一百万个概率的连乘会得到一个怎么样的结果?可想而知是特别特别地小。一般我们要尽可能地避免连乘。什么比连乘好呢?当然是连加。我们如何将连乘转变为连加呢?对,使用对数函数,因为下面的恒等式特别有用:
log(ab)=log(a)+log(b)log(ab)=log(a)+log(b)
我们有四个概率的连乘,使用对数以后,可以变为四个数字的连加。对于桶2(三个红球,一个蓝球的排列),我们有如下的计算过程:
0.75∗0.75∗0.75∗0.25=0.105468750.75∗0.75∗0.75∗0.25=0.10546875
通过使用对数变换(为了,使得结果是正数,这里在对数前面添加了一个负号),我们有:
现在,只剩下最后一步了。为了对结果进行规范化,我们对该结果取平均。这就是我们要找的熵的近似公式了!对于桶2,其熵为0.811.
如果我们计算桶1的熵,可以得到:
桶3的熵为:
至此,我们已经找到了熵的定义公式:对概率对对数的负值。注意到桶1具有最低的熵,桶3具有最高的熵,桶2居于中间。总结如下:
对于更通用的公式,我们可以总结如下:假设我们的桶里有mm个红球和nn个蓝球,则:
定义熵·从两个类别引申到多类别
目前为止我们处理了连个类别的熵(红色和蓝色)。为了使得熵和信息论关联起来,我们有必要看一些多个类别的情况。这里为了是情况更加清晰一些,我们使用字母来进行说明。假设我们有三个桶,每个桶里面有8个字母。桶1中的字母是AAAAAAAA,桶2中的字母是AAAABBCD,桶3中的字母是AABBCCDD。我们可以很直观地感受到桶1中的熵最小,但是桶2和桶3的却并不是很明显。我们下面通过计算知道桶3具有最高的熵值,桶2熵值居中。
对于多个类别的可以推广我们对于熵的定义如下:
公式中的nn是类别数,pipi是第ii个类别出现的概率。对于我们的三个桶,我们有如下分析:
对于桶1,只有一个类别(字母A),出现的概率肯定是1,所以熵值为:
对于桶2,我们有四个类别(字母A,B,C和D),A出现的概率是4/8,B的概率是2/8,C的概率是1/8,D的概率是1/8。所以熵值为:
对于桶3,我们也有四个类别(字母A,B,C和D),每个字母出现的概率都是1/4,所以:
对于三个桶,我们总结如下:
更有趣的在下面,这儿就是信息论发挥作用的地方。
信息论·修改提问方式使得提问方式最小化!即构建决策树!
下面还有一种方式来理解熵。我们还是以从桶中随机取出字母为例。我们要判断从桶中取出的字母平均需要提出多少个问题?(假设有一个人从桶里取字母,另外一个人通过提问得到取出来的是哪个字母)
首先看最简单的情况。对于桶1,我们可以确信取出来的肯定是A。所以我们不用提出任何问题就可以知道从桶里面取出来的字母是什么。用公式简单表示如下:
对于桶2和桶3,可能有人认为通过四个问题可以知道到底取出来的是什么字母。这四个问题如下:
是不是字母A?
是不是字母B?
是不是字母C?
是不是字母D?
其实,这四个问题是有冗余的,因为如果前面三个问题的答案如果是“NO”的话,那么我们肯定知道取出来的屙屎字母D。所以三个问题足够了,但是我们可以做得更好吗?我们提出的问题需要消除冗余。我们可以这样改进我们的提问:
该字母是A或者B?
如果1的回答是“YES”,继续提问是否是字母A?如果1的回答是“NO”,继续提问是否是字母C?
如果这样提问,只需要基于两个问题就可以得到答案:
对于YES,YES的回答,则取出来的是A
对于YES,NO的回答,则取出来的是B
对于NO,YES的回答,则取出来的是C
对于NO,NO的回答,则取出来的是D
以树状结构表示如下:
对于桶3,每个字母出现的概率都是1/4,所以为了找出取出来的字母平均提问的个数应该为2。计算如下:
对于桶2,我们如果使用桶3的提问策略,当然得出的结果也是2,然而我们可以做得更好。我们可以首先提问是不是A,然后问是不是B,然后再问是不是C。
如果是字母A,则我们只用了1次提问
如果是字母B,则我们只用了2次问题
如果是字母C或者D,则我们只用了3次提问
这样我们的提问顺序如下:
如果是字母A,则我们只用了1次提问
如果是字母B,则我们只用了2次问题
如果是字母C或者D,则我们只用了3次提问
对于是字母C和D,我们3次提问超出了对于桶2的提问策略,但是平均来看,我们可能做得更好。桶3有字母AAAABBCD,A出现了一半,B出现了1/4,C和D都出现了1/8。平均提问次数为:
这就是熵!熵和信息论就是这样关联起来的。如果我们想要找出从桶里取出来的字母,平均需要提出问题的个数就是熵的值。
当然,这引出了更大问题:我们如何确定我们提问的方式是最可能好的?如果提问的方式不是太明显,当然需要做更多的工作。