前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[白话解析] 深入浅出熵的概念 & 决策树之ID3算法

[白话解析] 深入浅出熵的概念 & 决策树之ID3算法

作者头像
罗西的思考
发布2020-09-07 15:41:01
1.7K1
发布2020-09-07 15:41:01
举报
文章被收录于专栏:罗西的思考罗西的思考

0x00 摘要

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

0x01 IT概念

1. 事物的信息和信息熵

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

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

1.2 信息熵

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

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

代码语言:javascript
复制
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算法将信息增益做贪心算法来划分算法,总是挑选是的信息增益最大的特征来划分数据,使得数据更加有序。即如果该属性能获得最大预期的熵减,那么这个属性的位置更接近根节点。

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

4. 推论

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

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

5. 如何计算熵?

代码语言:javascript
复制
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 用梁山好汉来看如何选择属性

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

对应代码是

代码语言:javascript
复制
_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", "山东"]
代码语言:javascript
复制
Yes表示吃大葱,No表示不吃大葱。

1. 计算"原有的熵"

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

代码语言:javascript
复制
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 按照“是否是出家人”来区分

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

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

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

这时候 熵&Gain 怎么计算?

代码语言:javascript
复制
俗人: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 按照"籍贯"来区分
代码语言:javascript
复制
鲁智深(甘肃平凉),公孙胜(天津蓟县) ---> 不吃大葱
宋江,吴用,朱仝,李应,燕顺,乐和,武松 (宋朝时候全是山东人) ---> 吃大葱

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

这时候 熵&Gain 怎么计算?

代码语言:javascript
复制
非山东: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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 摘要
    • 0x01 IT概念
      • 1. 事物的信息和信息熵
      • 2. 为什么信息熵要定义成-Σp*log(p)?
      • 3. 决策树ID3算法对应的熵
      • 4. 推论
      • 5. 如何计算熵?
    • 0x02 用梁山好汉来看如何选择属性
      • 1. 计算"原有的熵"
      • 2. 计算"新熵" & Gain
    • 0x03 参考
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档