[梁山好汉说IT] 熵的概念 & 决策树ID3如何选择子树

记录对概念的理解,用梁山好汉做例子来检验是否理解正确。

1. 事物的信息和信息熵

a. 事物的信息(信息量越大确定性越大):

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

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

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

其中事件x共有n个状态,i表示第i个状态,底数b通常设为2,也可设为10或e。H(x)即用以消除这个事件的不确定性所需要的统计信息量,就是信息熵。还要说明的是,当这个事情一定发生的时候,发生的概率就为1,那么它的信息量为0,信息熵就为0。

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

有以下几种解释:

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

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

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

d.
由上面太阳东升西落,西升东落很容易看出,信息量是随着发生的概率的增大而减少的,而且不能为负。另外,如果我们有两个不相关事件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平均的信息量,而平均最好的量度就是随机变量的期望。

e.
如果世界杯有 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算法对应的熵

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

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

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

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

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

d. 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的记录个数与总记录数之比。

6. 用梁山好汉来看如何选择属性

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

对应代码是
_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表示不吃大葱。原有的熵就用吃不吃大葱的比例来计算。

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

a. 如果按照“是否是出家人”来区分,则
出家人:鲁智深,公孙胜 ---> 不吃大葱 / 武松 ---> 吃大葱
俗人:宋江,吴用,朱仝,李应,燕顺,乐和 ---> 吃大葱

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

这时候熵怎么计算?

俗人: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

b. 如果按照"籍贯"来区分
鲁智深(甘肃平凉),公孙胜(天津蓟县) ---> 不吃大葱
宋江,吴用,朱仝,李应,燕顺,乐和,武松 (宋朝时候全是山东人) ---> 吃大葱
这样区分更好更彻底。

所以属性按照籍贯判断更好更彻底。

这时候熵怎么算?

非山东: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算法。该方法选择分枝(属性)的方式是通过计算每个属性的信息增益,选择信息增益最高的属性为新的划分。该算法认为属性的重要性的体现方式是通过对系统熵的影响,如果可以降低很多不确定性,那么它就是一个重要的属性。

参考
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

原文地址:https://www.cnblogs.com/rossiXYZ/p/11824359.html

时间: 2024-10-11 06:17:59

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

梁山好汉为何成不了大气候?(转)

我作过这样的调查,90%的企业家不认同我这个观点.我见过所有世界500强的企业,都讲这个,讲来讲去就是这两点:价值观和使命. 宋朝梁山好汉一百零八将,如果他们没有价值观,在梁山上互相打起来还真麻烦.他们有一个共同的价值观就是江湖义气,无论发生什么事都是兄弟,这样的价值 观让他们团结在一起.一百零八将的使命就是替天行道,但是他们没有一个共同的目标,导致后来宋江认为我应该受招安,李逵认为我们打打杀杀挺好的,还有些人 认为,衙门不抓我们就很好了,到后来崩溃掉.所以一定要重视目标.使命和价值观,这是阿里

决策树 -- ID3算法小结

ID3算法(Iterative Dichotomiser 3 迭代二叉树3代),是一个由Ross Quinlan发明的用于决策树的算法:简单理论是越是小型的决策树越优于大的决策树. 算法归纳: 1.使用所有没有使用的属性并计算与之相关的样本熵值: 2.选取其中熵值最小的属性 3.生成包含该属性的节点 4.使用新的分支表继续前面步骤 ID3算法以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类:所以归根结底,是为了从一堆数据中生成决策树而采取的一种归纳方式: 具体介绍: 1.信

决策树---ID3算法(介绍及Python实现)

决策树---ID3算法   决策树: 以天气数据库的训练数据为例. Outlook Temperature Humidity Windy PlayGolf? sunny 85 85 FALSE no sunny 80 90 TRUE no overcast 83 86 FALSE yes rainy 70 96 FALSE yes rainy 68 80 FALSE yes rainy 65 70 TRUE no overcast 64 65 TRUE yes sunny 72 95 FALSE

机器学习总结(八)决策树ID3,C4.5算法,CART算法

本文主要总结决策树中的ID3,C4.5和CART算法,各种算法的特点,并对比了各种算法的不同点. 决策树:是一种基本的分类和回归方法.在分类问题中,是基于特征对实例进行分类.既可以认为是if-then规则的集合,也可以认为是定义在特征空间和类空间上的条件概率分布. 决策树模型:决策树由结点和有向边组成.结点一般有两种类型,一种是内部结点,一种是叶节点.内部结点一般表示一个特征,而叶节点表示一个类.当用决策树进行分类时,先从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到子结点.而

决策树归纳(ID3属性选择度量)Java实现

一般的决策树归纳框架见之前的博文:http://blog.csdn.net/zhyoulun/article/details/41978381 ID3属性选择度量原理 ID3使用信息增益作为属性选择度量.该度量基于香农在研究消息的值或"信息内容"的信息论方面的先驱工作.该结点N代表或存放分区D的元组.选择具有最高信息增益的属性作为结点N的分裂属性.该属性使结果分区中对元祖分类所需要的信息量最小,并反映这些分区中的最小随机性或"不纯性".这种方法使得对一个对象分类所需

javascript实现朴素贝叶斯分类与决策树ID3分类

今年毕业时的毕设是有关大数据及机器学习的题目.因为那个时间已经步入前端的行业自然选择使用JavaScript来实现其中具体的算法.虽然JavaScript不是做大数据处理的最佳语言,相比还没有优势,但是这提升了自己对与js的理解以及弥补了一点点关于数据结构的弱点.对机器学习感兴趣的朋友还是去用 python,最终还是在学校的死板论文格式要求之外,记录一下实现的过程和我自己对于算法的理解.源码在github:https://github.com/abzerolee/ID3_Bayes_JS开始学习

决策树——ID3

参考网址:https://www.cnblogs.com/further-further-further/p/9429257.html ID3算法 最优决策树生成 -- coding: utf-8 -- """ Created on Thu Aug 2 17:09:34 2018 决策树ID3的实现 @author: weixw """ from math import log import operator 原始数据 def createDat

决策树ID3算法[分类算法]

ID3分类算法的编码实现 1 <?php 2 /* 3 *决策树ID3算法(分类算法的实现) 4 */ 5 6 /* 7 *把.txt中的内容读到数组中保存 8 *$filename:文件名称 9 */ 10 11 //-------------------------------------------------------------------- 12 function gerFileContent($filename) 13 { 14 $array = array(NULL); 15

Python实现决策树ID3算法

主要思想: 0.训练集格式:特征1,特征2,...特征n,类别 1.采用Python自带的数据结构字典递归的表示数据 2.ID3计算的信息增益是指类别的信息增益,因此每次都是计算类别的熵 3.ID3每次选择最优特征进行数据划分后都会消耗特征 4.当特征消耗到一定程度,可能会出现数据实例一样,但是类别不一样的情况,这个时候选不出最优特征而返回-1:   因此外面要捕获-1,要不然Python会以为最优特征是最后一列(类别) #coding=utf-8 import operator from ma