机器学习入门 12-2 信息熵

2021-01-03 15:57:13 浏览数 (1)

什么是信息熵?

信息熵是信息论中的一个基础概念 (信息论是一个专门的领域)。信息熵表示的是随机变量的不确定度,简单来说,

  • 数据不确定性越高 (或越随机),相对应数据的信息熵就越大;
  • 数据不确定性越低 (或越确定),相对应数据的信息熵就越小;

“熵是从物理热力学中引申出来的概念:

  • 熵越大,热力系统中的粒子无规则的运动越剧烈,粒子的状态不确定性越高;
  • 熵越小,热力系统中的粒子越倾向于静止状态,粒子的状态确定性越高;

信息熵的概念可能有点抽象,接下来使用具体的例子来看一下,信息熵代表随机变量不确定度的度量具体是什么意思。信息熵的计算公式如下 (由信息论之父 C. E. Shannon 提出)。

对于一个系统来说一共有 类的信息,第 类信息所占比例为 。比如三个类别的鸢尾花数据集一共有 150 个样本,其中每个类别的样本个数都是 50,因此对于鸢尾花数据集来说,:

  • 第一种鸢尾花所占比例为 ,即 ;
  • 第二种鸢尾花所占比例为 ,即 ;
  • 第三种鸢尾花所占比例为 ,即 ;

信息熵的计算公式中有一个负号,这是因为 的值一定在 0 到 1 之间。自变量小于 1 的时候, 函数的值小于 0,「因此在计算信息熵的公式中添加一个负号是为了将信息熵 的结果确定在大于 0 的范围之中」。此处的 就是以 为底的 , 的函数图像如下所示。

下面来举几个例子。

  • 有一个三个类别的数据集 ,这三个类别所占的比例分别是 ,此时这个系统的信息熵为:
  • 有一个三个类别的数据集 ,这三个类别所占的比例分别是 ,此时这个系统的信息熵为:

现在可以比较两组数据的信息熵,数据集 的信息熵要比数据集 的信息熵大。**前面提到过熵代表不确定度的度量:熵越大说明系统不确定性越高 (或越随机),熵越小说明系统的不确定性越低 (或越确定)。**数据集 中的每个类别各占了 33%,数据属于哪个类别更不确定,而数据集 中第三个类别占了整个数据集的 70%,数据属于哪个类别更确定,相比之下数据集 的不确定性要更高一些,因此数据集 计算出来的信息熵要比数据集 计算出来的信息熵大。

  • 考虑更极端的情况,有一个三个类别的数据集 ,这三个类别所占的比例分别是 ,此时这个系统的信息熵为:

此时的信息熵为 0,通过计算信息熵的公式了解了信息熵为正数,因此 0 是信息熵所能取到的最小值。信息熵最小,说明不确定性越低,换句话说,系统是最确定的,因为所有数据都在第一个类别中,没有任何的不确定性。

绘制两个类别的信息熵

接下来以两个类别为例,通过具体的编程实现绘制计算信息熵公式的函数图像。对于两个类别来说,如果其中一类别的比例为 的话,另外一个类别的比例一定为 ,此时信息熵 为:

接下来使用 matplotlib 模块绘制两个类别的信息熵函数图像。

代码语言:javascript复制
In[1]: # 导入相应的模块
       import numpy as np
       import matplotlib.pyplot as plt

构建计算两个类别信息熵的函数,使用 np.log 是因为希望这个函数接收的参数 不只是一个数值,还可以是一个 Numpy 数组。

代码语言:javascript复制
In[2]: def entropy(p):
           return -p * np.log(p) - (1-p) * np.log(1-p)

为了绘制出不同 的取值对应的信息熵的取值,使用 np.linspace 生成一定范围内的 值。这里需要注意,由于 函数在自变量为 0 的时候值为负无穷,因此 和 中的 和 都不能为 0,换句话说 不能取 0 和 1。因此使用 np.linspace 生成范围在 均匀的 200 个点。

代码语言:javascript复制
In[3]: p = np.linspace(0.01, 0.99, 200)

接下来就可以绘制函数图像了。

代码语言:javascript复制
In[4]: plt.plot(p, entropy(p))
       plt.show()

最终绘制出来的曲线呈现抛物线的样子,并且曲线整体以 这个位置左右对称。换句话说,当 的时候,曲线取得最大值。对于两个类别的数据集,其中一个类别所占的比例是 ,另外一个类别所占的比例为 ,此时整个数据的信息熵最大。因此整个数据集不确定性最高,因为此时的数据到底属于第一个类别还是属于第二个类别,各有 50% 的可能性。

「根据绘制出来的曲线可以看出无论 的值更小还是更大,整个数据集的信息熵都在下降,这是因为无论 变小还是变大,数据都更加偏向某一类别,数据整体的不确定性变低 (确定性更高了),所以相对应的信息熵变的更低了。」

此时绘制的信息熵曲线假设系统中只有两个类别,如果系统中有三个类别的话,绘制出来的信息熵函数就是一个立体的曲面。通过绘制两个类别的信息熵曲线可以进一步理解为什么信息熵是系统的一个不确定性的度量。

  • 当系统中每一个类别都是等概率的时候,不确定性最高,此时计算出来的信息熵值最大;
  • 当系统偏向于某一个类别,相当于有了一定程度的确定性,信息熵会逐渐降低,直到系统整体都在某一个类别中 ,此时的信息熵值最低为 0;

当然这个结论不仅适用于两个类别,同样可以拓展到多类别。

小结

通过前面的介绍理解了信息熵的概念,接下来回到前言中提到的两个问题,在每一个节点上都希望在某一个维度上基于某一个阈值进行划分。「划分之后要做的事情就是让我们的数据分成两个部分之后,相应的系统整体的信息熵降低,换句话说让整个系统变得更加的确定。」

极端情况下,比如对于上图中的 A B C 三个叶子节点,如果每个叶子节点中的数据都只属于对应类别的话:A 叶子节点中只有类别 a 的数据,B 叶子节点中只有类别 b 的数据,C 叶子节点中只有类别 c 的数据,那么此时的整个系统信息熵为 0。

接下来的任务就是要找到每一个节点上某一个维度上的某一个取值,根据这个维度上的这个取值对数据进行划分以后的信息熵是所有其它划分方式得到的信息熵中的最小值,称这样的划分是当前最好的划分方式。

References:

  1. Python3入门机器学习 经典算法与应用: https://coding.imooc.com/class/chapter/169.html#Anchor

0 人点赞