0x00 摘要

本文通过实例来给帮助大家深入理解熵的概念 & 决策树之ID3算法。

0x01 IT概念

1. 事物的信息和信息熵

1.1 事物的信息(信息量越大确定性越大)

信息会改变你对事物的未知度和好奇心。信息量越大,你对事物越了解,进而你对事物的好奇心也会降低,因为你对事物的确定性越高。如果你确定一件事件的发生概率是100%,你认为这件事情的信息量为0——可不是吗,既然都确定了,就没有信息量了;相反,如果你不确定这件事,你需要通过各种方式去了解,就说明这件事是有意义的,是有信息量的。

1.2 信息熵

为了抽象上述模型,聪明的香农总结出了信息熵这个概念。信息熵用以表示一个事物的不确定程度,如果该事物的非确定性越高,你的好奇心越重,该事物的信息熵就越高。一场势均力敌的比赛结果的不确定性高于一场已经被看到结果的比赛,多么符合直观理解啊!

也就是说,信息量的多少与事件发生概率的大小成反比。比如太阳从东方升起这个事件,概率很大,信息量就会很少。相反,太阳从西方升起,概率很小,信息量就会很多(世界要随之发生巨大变化)。所以信息熵常被用来作为一个系统的信息含量的量化指标,从而可以进一步用来作为系统方程优化的目标或者参数选择的判据。或者说信息熵用来度量一个事件可能具有多个状态下的信息量,也可以认为是信息量关于事件概率分布的期望值:

H(x) = -Σp*log(p)。

其中事件x共有n个状态,i表示第i个状态,底数b通常设为2,也可设为10或e。
H(x)即用以消除这个事件的不确定性所需要的统计信息量,就是信息熵。

还要说明的是,当这个事情一定发生的时候,发生的概率就为1,那么它的信息量为0,信息熵就为0。

2. 为什么信息熵要定义成-Σp*log(p)?

网上找到以下几种靠谱且易理解的解释:

2.1 解释1

一条信息的可能性数量随着位数的增加是指数的。如果用二进制bit表示,1bit有2个状态,2bit有4个状态,Nbit有2^N个可能状态。可能性的数量随指数上升,指数那么变回线性的形式就是log。至于对数的底是e还是2无所谓,只是一个比例因子而已。一条信息是log,N条信息就是Nlog咯。最后,熵表示混乱度,考虑到符合物理意义理解的话,加上负号。

2.2 解释2

信息熵代表编码长度,编码越长,信息量越大,信息熵也就越大。所以有这样一个等式: p=1/a^n p表示取到某个值的概率,a表示存储单元能够存储的数量,如果是bit那就是2,n表示编码长度,可以用信息熵来理解,所以总的可能性应该是a^n,那取到单个值的概率就是p=1/a^n。反推信息熵的公式就是:n=-loga(p)

2.3 解释3

第一信息量应该依赖于概率分布,所以说熵的定义应该是概率的单调函数。 第二假设两个随机变量是相互独立的,那么分别观测两个变量得到的信息量应该和同时观测两个变量的信息量是相同的。即:h(x+y)=h(x)+h(y)。 第三信息量应该要大于0 第四信息量应当连续依赖于概率变化。 可以证明满足以上条件的函数形式是唯一的-logx,当然还可以乘上任意常数。

2.4 解释4

由上面太阳东升西落,西升东落很容易看出,信息量是随着发生的概率的增大而减少的,而且不能为负。另外,如果我们有两个不相关事件A和B,那么可以得知这两个事情同时发生的信息等于各自发生的信息之和。即h(A,B) = h(A) + h(B)。而且,根据贝叶斯定理,p(A,B) = p(A) * p(B)。根据上面说到的说熵的定义应该是概率的单调函数。我们很容易看出结论熵的定义 h 应该是概率 p(x) 的 log 函数,因此一个随机变量的熵可以使用以下定义:h(x)=-log_2p(x)。此处的负号,仅仅是为了保证熵为正数或者为零,而log函数的基数2可以使任意数,只不过根据普遍传统,使用2作为对数的底。我们用熵来评价整个随机变量x平均的信息量,而平均最好的量度就是随机变量的期望。

2.5 解释5

如果世界杯有 32 支球队参赛,有些球队实力很强,拿到冠军的可能性更大,而有些队伍拿冠军的概率就很小。 准确的信息量应该是: H = -(p1 * logp1 + p2 * logp2 + ... + p32 * logp32),其中 p1, ..., p32 分别是这 32 支球队夺冠的概率。当每支球队夺冠概率相等都是 1/32 的时候,H = -(32 * 1/32 * log1/32) = 5,根据最大熵原理,每个事件概率相同时,熵最大,这件事越不确定。 这里我们只是说了如何计算,那么为什么求总信息量就是所有 -p*logp 再求和呢?维基百科一句话就让我明白了:-logp 就是一种可能性的信息量啊,一个事件总的信息量就是每一种可能的情况的信息量乘以它们发生的概率,其实就是信息量的数学期望。

3. 决策树ID3算法对应的熵

3.1 熵(entropy)

它刻画了任意样例集的纯度(purity)。熵量化了存在于样本集合中的均匀性,越纯,熵越低。

假设一个集合S。如果S的所有成员属于同一类,则Entropy(S)=0;如果S的正反样例数量相等,则Entropy(S)=1;如果S的正反样例数量不等,则Entropy(S)介于0,1之间;

即:当所有成员属于同一组时,该集合的熵为0。这个0值表示在这个集合中没有杂质,这个示例中所有的成员均为真。在第二个例子中,有一半的成员是正值,一半的成员是负值,这种情况下熵的值最大,为1。在二元分类中,集合熵的范围是从0到1。

3.2 信息增益的度量标准:熵(entropy)。

一个属性的信息增益就是由于使用这个属性分割样例而导致的期望熵降低(或者说,样本按照某属性划分时造成熵减少的期望)。也就是,数据集变得有序了多少。

3.3 决策树的灵魂

依靠某种指标进行树的分裂达到分类/回归的目的,总是希望纯度越高越好。

3.4 ID3算法的核心思想

ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。ID3算法将信息增益做贪心算法来划分算法,总是挑选是的信息增益最大的特征来划分数据,使得数据更加有序。即如果该属性能获得最大预期的熵减,那么这个属性的位置更接近根节点。

Gain(子树的信息增益) = 现在熵 - 如果按照某一个特征来分类得到子树熵 = 熵的变化值

4. 推论

信息增益(熵减)越大越好 ----> 子树的熵越小越好 -----> 树越不平均越好(越不平均表示纯度越高效果越好,越平均表示某值属于各种不同分类的可能性越大则熵最大) ----> 通过这个特性越能强烈区分开对象越好。

比如用染色体判断男女,分成两群,"女"那一群肯定都是女的,"男"那一群肯定都是男的。这个效果是最好。 用是否穿裙子来判断男女,则两群中肯定各有男女,这样判断标准就不好。

5. 如何计算熵?

def calc_shannon_ent(dataset):
  entropy = 0
  for 所有类别:
    p(本类概率,或者说本类数据在所有数据中的比例) = 本类别出现的个数 / 所有数据个数
    entroy -= p * math.log(p,2)

比如数据集是[1, "yes"], [1, "yes"]. 则所有数据个数是2,只有这一类数据"yes",所以p = 2/2 = 1。entroy = 1 * log(1,2) = 0。 比如数据集是[1, "yes"], [1, "yes"], [1, "no"]. 则所有数据个数是3,有两类数据"yes","no",p分别是2/3和1/3。entroy = - (2/3) * log((2/3), 2) - (1/3) * log((1/3), 2) = 0.918.

这个公式的奥秘在于,2/3是属性取值为yes的个数占总记录的比例,同样1/3是其取值为no的记录个数与总记录数之比。

0x02 用梁山好汉来看如何选择属性

梁山好汉吃晚饭,决订是否吃煎饼卷大葱。 现在有如下头领:鲁智深,武松,公孙胜,宋江,吴用,朱仝,李应,燕顺,乐和, 阮小七

对应代码是

_data_set = [
[0, 1, "yes"], #宋江不是佛教徒,是山东人,吃大葱
[0, 1, "yes"], #吴用不是佛教徒,是山东人,吃大葱
[0, 1, "yes"], #朱仝
[0, 1, "yes"], #李应
[0, 1, "yes"], #燕顺
[0, 1, "yes"], #乐和
[0, 1, "yes"], #阮小七
[1, 1, "yes"], #武松
[1, 0, "no"], #鲁智深是佛教徒,不是山东人,不吃大葱
[1, 0, "no"]] #公孙胜
_labels = ["Buddhist", "山东"]
Yes表示吃大葱,No表示不吃大葱。

1. 计算"原有的熵"

原有的熵 就用吃不吃大葱的比例来计算。

Entropy(原有的熵) = Entropy(Yes) + Entropy(No) = 8/10 * log(8/10,2) + 2/10 * log(2/10, 2) = 0.8 * log(0.8,2) + 0.2 * log(0.2, 2) = 0.721928

2. 计算"新熵" & Gain

2.1 按照“是否是出家人”来区分

如果按照“是否是出家人”来区分,则

出家人:鲁智深,公孙胜 ---> 不吃大葱 / 武松 ---> 吃大葱
俗人:宋江,吴用,朱仝,李应,燕顺,乐和 ---> 吃大葱

我们发现: 出家人一个人吃大葱,两个人不吃大葱 / 俗人都吃大葱。看起来按照出家人来分比较靠谱。

这时候 熵&Gain 怎么计算?

俗人:7个人,7个yes。
出家人:3个人,其中1yes,2no
Entropy(按出家人分) = Entropy(俗人) + Entropy(出家人) = (7/10) * Entropy(7 yes) + (3/10) * Entropy(1 yes, 2 no)
Entropy(7 yes) = 7/7 * log(7/7,2) = 0
Entropy(1 yes, 2 no) = 1/3 * log(1/3, 2) + 2/3 * log(2/3, 2) = 0.918
Entropy(按出家人分) = 0.7 * 0 + 0.3 * 0.918 = 0.2754

Gain(按出家人分) = Entropy(原有的熵) - Entropy(按出家人分) = 0.721928 - 0.2754

2.2 按照"籍贯"来区分

鲁智深(甘肃平凉),公孙胜(天津蓟县) ---> 不吃大葱
宋江,吴用,朱仝,李应,燕顺,乐和,武松 (宋朝时候全是山东人) ---> 吃大葱

这样区分更彻底。所以属性按照籍贯判断更好。

这时候 熵&Gain 怎么计算?

非山东:2个人,2个no。
山东:8个人,8yes
Entropy(按籍贯分) = Entropy(非山东) + Entropy(山东) = (2/10) * Entropy(2 no) + (8/10) * Entropy(8 yes)
Entropy(2 no) = 2/2 * log(2/2,2) = 0
Entropy(8 yes) = 8/8 * log(8/8, 2) = 0
Entropy(按籍贯分) = 0 + 0 = 0

Gain(按籍贯分) = Entropy(原有的熵) - Entropy(按籍贯分) = 0.721928 - 0

数据也证明了要按照籍贯分。

总的来说,搞明白分枝是如何产生的,就理解了ID3算法。该方法选择分枝(属性)的方式是通过计算每个属性的信息增益,选择信息增益最高的属性为新的划分。该算法认为属性的重要性的体现方式是通过对系统熵的影响,如果可以降低很多不确定性,那么它就是一个重要的属性。

0x03 参考

https://blog.csdn.net/gadwgdsk/article/details/79450950

https://blog.csdn.net/qq_36330643/article/details/77415451

https://blog.csdn.net/wendingzhulu/article/details/42045137

https://www.cnblogs.com/wkang/p/10068475.html

https://www.cnblogs.com/daguonice/p/11179662.html

https://www.jianshu.com/p/7ac73fe5b180

https://www.jianshu.com/p/4e2be2b562b0

https://www.zhihu.com/question/30828247/answer/61047733

http://tieba.baidu.com/p/5851144895

https://blog.csdn.net/taoqick/article/details/72852255

[梁山好汉说IT] 熵的概念 & 决策树ID3如何选择子树的更多相关文章

  1. [梁山好汉说IT] 容器概念在北宋社会的应用

    [梁山好汉说IT] 容器概念在北宋社会的应用 0x00 摘要 如何对没有软件开发经验的人解释容器? 集装箱真的能够完美解释容器嘛? 除了集装箱还有其他常见实体能够解释容器嘛? 我找到了一个能够 和集装 ...

  2. [梁山好汉说IT] 梁山好汉和秒杀系统

    [梁山好汉说IT] 梁山好汉和秒杀系统 0x00 摘要 今天看了一篇好文章,里面一些思路颇值得借鉴.先摘录总结精华.然后看看梁山好汉如何处理秒杀系统(系统隔离/系统搭建/风控过滤/削峰/信号广播... ...

  3. [梁山好汉说IT] 区块链在梁山的应用

    [梁山好汉说IT] 区块链在梁山的应用 0x00 摘要 区块链属于一种去中心分布式数据存储系统,有其擅长的应用场景,也有其缺点. 下面用梁山为例来阐释下区块链部分概念&应用. 0x01 梁山好 ...

  4. [梁山好汉说IT] 梁山好汉和抢劫银行

    [梁山好汉说IT] 梁山好汉和抢劫银行 0x00 摘要 今天看了一篇文章<史上最有学问的银行劫匪,教你如何把握人生重大机会>.先摘录精华如下,然后看看梁山好汉在类似情况下如何处理 (东京汴 ...

  5. [梁山好汉说IT] 如何理解脑裂问题

    [梁山好汉说IT] 如何理解脑裂问题 这个系列是通过梁山好汉的例子来阐述一些IT概念. 1. 问题描述 Split-brain, 就是在集群环境中,因为异常情况发生后,产生两个子集群.每个子集群都选出 ...

  6. [梁山好汉说IT] 如何理解一致性Hash

    [梁山好汉说IT] 如何理解一致性Hash 0x00 摘要 用梁山酒店分配客人为例来理解一致性Hash. 0x01. 与经典哈希方法的对比 经典哈希方法:总是假设内存位置的数量是已知且固定不变的.因为 ...

  7. 决策树 -- ID3算法小结

          ID3算法(Iterative Dichotomiser 3 迭代二叉树3代),是一个由Ross Quinlan发明的用于决策树的算法:简单理论是越是小型的决策树越优于大的决策树. 算法归 ...

  8. 决策树ID3算法

    决策树 (Decision Tree)是在已知各种情况发生概率的基础上,通过构成 决策树 来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法 ...

  9. 决策树--ID3 算法(一)

    Contents      1. 决策树的基本认识      2. ID3算法介绍      3. 信息熵与信息增益      4. ID3算法的C++实现 1. 决策树的基本认识    决策树是一种 ...

随机推荐

  1. & 和 | 和 ~

    O(∩_∩)O~~浅理解,不足之处请多指正,谢谢. 1) & & :二目运算符,把运算符两侧的数换成 二进制 再依次求与. 例如:a = 2,b = 3; c = a & b; ...

  2. 用GitHub Pages搭了个博客,欢迎来玩~

    Welcome to visit my new blog https://luoxiaolei.github.io/ Ps. 后续的blog会优先更新到GitHub Pages上.

  3. Code Force 429B Working out【递推dp】

    Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...

  4. 2019-8-31-dotnet-使用-lz4net-压缩-Stream-或文件

    title author date CreateTime categories dotnet 使用 lz4net 压缩 Stream 或文件 lindexi 2019-08-31 16:55:58 + ...

  5. oracle函数 LENGTH(c1)

    [功能]返回字符串的长度; [说明]多字节符(汉字.全角符等),按1个字符计算 [参数]C1 字符串 [返回]数值型 [示例] SQL> select length('高乾竞'),length( ...

  6. 动画删除cell出问题

    删除UITableView行的代理时出了问题 解决办法 先remove数据,再执行 [_mTableView deleteRowsAtIndexPaths:[NSArray arrayWithObje ...

  7. 11 session 使用

    #session 使用app.secret_key = "dsada12212132dsad1232113"app.config['PERMANENT_SESSION_LIFETI ...

  8. PyTorch 学习笔记(四):权值初始化的十种方法

    pytorch在torch.nn.init中提供了常用的初始化方法函数,这里简单介绍,方便查询使用. 介绍分两部分: 1. Xavier,kaiming系列: 2. 其他方法分布 Xavier初始化方 ...

  9. pytorch JIT浅解析

    概要  Torch Script中的核心数据结构是ScriptModule. 它是Torch的nn.Module的类似物,代表整个模型作为子模块树. 与普通模块一样,ScriptModule中的每个单 ...

  10. 在对文件进行随机读写,RandomAccessFile类,如何提高其效率

    花1K内存实现高效I/O的RandomAccessFile类 JAVA的文件随机存取类(RandomAccessFile)的I/O效率较低.通过分析其中原因,提出解决方案.逐步展示如何创建具备缓存读写 ...