信息

假设一个事件有 8 种可能的结果,将其传达给另一个人,至少需要多少信息?

由于 $2^3 = 8$,所以只需要 3 bit 信息,即可将结果确定为一种。

结果编号 信息
1		000
2		001
3		010
4		011
5		100
6		101
7		110
8		111

假设一个事件有 $N$ 种可能的结果,则需要多少 bit 的信息来确定?这个数就是信息量

$$ i = \log_2 N $$

这个思想来源于香农的论文《通信的数学原理》。“比特” 的定义正是来自于此。

物理的熵和信息的熵

玻尔兹曼熵:

$$ S \propto \ln \Omega $$

其中 $\Omega$ 表示微观态数量。一个封闭系统的微观态数量越多,熵越高。

信息量:

$$ I \propto \log N $$

其中 $N$ 表示事件的数量。一个等可能事件系统的事件数量越多,信息量越大。这就是等可能系统的信息熵。我们 推广到可能性不等的系统:

熵 —— 平均信息量

定义 $X$ 为某个 $N$ 等可能事件集合中的特定一个结果,则概率 $p = P (X) = 1/N$ ,同理有 $N = 1/p$。

即,只要有特定结果的概率 $p$,可以反推出事件有 $1/p$ 个。即便概率不相等,也可以加权求和,得到信息熵

$$ H = p_1 \log_2 {\dfrac{1}{p_1}} + p_2 \log_2 {\dfrac{1}{p_2}} + \cdots $$

即:

$$ H = - \sum p_i \log_2 p_i $$

在物理世界,对应的是吉布斯熵:

$$ S = -K \sum p_i \log_{e} p_i $$

计算数据集的信息熵

def calcShannonEnt(dataSet):
    numEntires = len (dataSet)                        #返回数据集的行数
    labelCounts = {}                                #保存每个标签 (Label) 出现次数的字典
    for featVec in dataSet:                            #对每组特征向量进行统计
        currentLabel = featVec [-1]                    #提取标签 (Label) 信息
if currentLabel not in labelCounts.keys ():    #如果标签 (Label) 没有放入统计次数的字典,添加进去
            labelCounts[currentLabel] = 0
        labelCounts [currentLabel] += 1                #Label 计数
    shannonEnt = 0.0                                #经验熵 (香农熵)
    for key in labelCounts:                            #计算香农熵
        prob = float (labelCounts [key]) /numEntires    #选择该标签 (Label) 的概率
        shannonEnt -= prob * log (prob, 2)            #利用公式计算
    return shannonEnt                                #返回经验熵 (香农熵)