《机器学习实战》第三章决策树提到信息增益和熵的含义,并含python代码实现,本文对代码进行了注释。
一、熵的理解:
信息论创始人克劳德·艾尔伍德·香农,引入了信息熵,表示随机变量不确定度的度量。
公式如下:
满足如下三条性质:
- 单调性:发生概率越高的事件,所携带的信息熵越低。例:“太阳每天从东方升起”为确定事件,不携带信息,从信息论角度,没有消除任何不确定性,信息量为0。
- 非负性:信息熵不能为负。 若为负,则获得某信息后不确定性反而增加,不合逻辑。
- 累加性:多随机事件同时发生存在的总不确定性的量度==各事件不确定性的量度之和。
香农已从数学上证明了满足上述三个条件的随机变量不确定性度量函数具有唯一形式,即上述的 H(X)公式。
即:一个事件的信息量就是这个事件发生的概率的负对数。
熵就是信息量的期望(平均而言发生一个事件得到的信息量大小)
二、计算给定数据的熵---python实现
from math import log
import operator
def calcShannonEnt(dataSet):
numEntries = len(dataSet) #数据集中实例总数(list的总数)
labelCounts = {} #创建字典,表示类标签出现次数
for featVec in dataSet:
currentLabel = featVec[-1] #最后一列,即类标签(yes/no)
if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0 #若原字典没有,创建新字典条目
labelCounts[currentLabel] += 1
shannonEnt = 0.0 # 熵
for key in labelCounts: # 对每个类标签来说
prob = float(labelCounts[key])/numEntries #标签出现概率
shannonEnt -= prob * log(prob,2) #log base 2
return shannonEnt
三、案例输出
#定义一个案例函数
def createDataSet():
dataSet = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
#change to discrete values
return dataSet
#输出结果
>>> dataSet=createDataSet()
>>> dataSet
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
>>> calcShannonEnt(dataSet)
0.9709505944546686
增加一个分类后,熵增加:
>>> dataSet[0][-1]='maybe'
>>> dataSet
[[1, 1, 'maybe'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
>>> calcShannonEnt(dataSet)
1.3709505944546687
参考文献:
知乎,https://www.zhihu.com/question/22178202