关于“熵”的那些事

第一次见到机器学习中的“熵”还是在决策树分类当中,熵用于衡量如何做最佳划分。大家可能都知道,熵嘛,就是 -p*logp 咯,那么熵有什么含义,为什么它能够体现信息量,信息增益又是怎么一回事,我们一起来学习。

熵这个概念在上中学的时候大家都学过,在热力学当中用于描述一个系统的混乱程度,其实在机器学习领域当中两者很相似,用于描述信息的不确定性,而一条信息的不确定性就决定了这条信息所包含的信息量。一句话当中包含了多少信息,看起来是一件相当抽象的事。直观上感觉就是,对于一件越不确定的事,我们所需要知道的信息量就越大,如果一件事我们几乎可以确定它的发生,那么就不再需要什么信息量去做判断。

在《数学之美》这本书当中(强行安利这本书),作者举了这样一个例子,假设我们没有看世界杯的比赛,但是想知道哪支球队会是冠军,只能去问已经看过比赛的观众,但是我们只能猜测,然后观众用对或不对来回答,我们想要猜测次数尽可能少,方法大家应该都能想到,那就是二分法。假如有 16 支球队,分别编号,先问是否在 1-8 之间,如果是就继续问是否在 1-4 之间,以此类推,直到最后判断出冠军球队是哪只。如果球队数量是 16,我们需要问 4 次来得到最后的答案。那么世界冠军这条消息的信息量就是 4。在计算机中,这条信息的信息量就是 4 比特,如果一共是 32 支球队参赛,那么世界冠军的信息量就是 5 比特,可以看到信息量跟可能情况的对数 log (本文所有对数默认以 2 为底)有关(这里大概有点知道为什么求熵的公式里会有一个 log 了)。

但是以往经验表示,如果世界杯有 32 支球队参赛,有些球队实力很强,拿到冠军的可能性更大,而有些队伍拿冠军的概率就很小。我们在之前用二分法计算的时候其实是看做每个球队夺冠的概率都相等,因此我们从最可能夺冠的几支球队中猜测冠军球队,实际需要的信息量是小于我们之前方法计算的信息量的。

而准确的信息量应该是:H = -(p1 * logp1 + p2 * logp2 + … + p32 * logp32)

p1, …, p32 分别是这 32 支球队夺冠的概率。我们再回头验算一下,当每支球队夺冠概率相等都是 1/32 的时候,H = -(32 * 1/32 * log1/32) = 5,这里有个最大熵原理,每个事件概率相同时,熵最大。

这里我们只是说了如何计算熵,也做了一点简单的验证,那么为什么求总信息量就是所有 -p*logp 再求和呢?

因为实际上,一个事件总的信息量就是每一种可能的情况的信息量乘以它们发生的概率,其实就是随机变量的信息量的数学期望

说完信息熵,现在可以来说说信息增益了。可以回头再从决策树这里说起。

决策树想必大家都有了解,简单说就是 if…then…。构建一棵决策树的关键就是如何选择结点的属性,一种度量方法就是计算父结点和根据某个属性划分的子节点的熵,取差值,其熵相差越大越好(信息增益越大越好)。

整理一下思路:我们建决策树的目标是什么——是使得一个结点中的数据尽可能属于同个类别,直到最后叶结点只包含一个类别的样本。用书里的话来说就是“纯度”提升越高越好。我们知道,纯度高就代表两种情况(以二元属性为例 yes or no)当中,其中一种情况的概率尽可能大,尽可能偏向一边,自然也就是子结点的熵尽可能小。所以当从一个父结点根据不同属性再分出多个子结点的时候,用父结点的熵减去所有子结点的熵之和,选最大的那个属性用于下一步的划分就可以了。

从决策树的根结点向下,每个结点都在减少不确定性,直到最后得到唯一的类别。
信息的作用就是帮助我们减少不确定性,我们逐渐了解更多信息,对一件事就越肯定。

我曾经分享过这样一篇文章《互联网时代的社会语言学:基于SNS的文本数据挖掘》,其中提到了一种不借助词库来分词的算法,基于的方法就是信息熵。我没有原作者说的好,这里直接引用一部分:

在人人网用户状态中,“被子”一词一共出现了 956 次,“辈子”一词一共出现了 2330 次,两者的右邻字集合的信息熵分别为 3.87404 和 4.11644 ,数值上非常接近。但“被子”的左邻字用例非常丰富:用得最多的是“晒被子”,它一共出现了 162 次;其次是“的被子”,出现了 85 次;接下来分别是“条被子”、“在被子”、“床被子”,分别出现了 69 次、 64 次和 52 次;当然,还有“叠被子”、“盖被子”、“加被子”、“新被子”、“掀被子”、“收被子”、“薄被子”、“踢被子”、“抢被子”等 100 多种不同的用法构成的长尾⋯⋯所有左邻字的信息熵为 3.67453 。但“辈子”的左邻字就很可怜了, 2330 个“辈子”中有 1276 个是“一辈子”,有 596 个“这辈子”,有 235 个“下辈子”,有 149 个“上辈子”,有 32 个“半辈子”,有 10 个“八辈子”,有 7 个“几辈子”,有 6 个“哪辈子”,以及“n 辈子”、“两辈子”等 13 种更罕见的用法。所有左邻字的信息熵仅为 1.25963 。因而,“辈子”能否成词,明显就有争议了。“下子”则是更典型的例子, 310 个“下子”的用例中有 294 个出自“一下子”, 5 个出自“两下子”, 5 个出自“这下子”,其余的都是只出现过一次的罕见用法。事实上,“下子”的左邻字信息熵仅为 0.294421 ,我们不应该把它看作一个能灵活运用的词。当然,一些文本片段的左邻字没啥问题,右邻字用例却非常贫乏,例如“交响”、“后遗”、“鹅卵”等,把它们看作单独的词似乎也不太合适。我们不妨就把一个文本片段的自由运用程度定义为它的左邻字信息熵和右邻字信息熵中的较小值。

看,根据一个字/词左右邻字的信息熵就能判断该字/词是应该跟左右字连成一个词还是单独成词。很巧妙,反正第一次读的时候着实被惊艳了一下。

关于熵的介绍差不多就到这里了,当然我们需要了解的远不止这些,我只是给了很直观的概念,更多的比如严格的数学推导、互信息、相对熵等等都很值得认真学习,毕竟信息论是相当大的一部分。路漫漫其修远兮,共勉。

参考资料:
《数学之美》
《数据挖掘导论》
《机器学习》
《互联网时代的社会语言学:基于SNS的文本数据挖掘》
https://zh.wikipedia.org/wiki/%E4%BA%92%E4%BF%A1%E6%81%AF
https://zh.wikipedia.org/wiki/%E7%86%B5_(%E4%BF%A1%E6%81%AF%E8%AE%BA

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值