学习任务:Additional References(熵的理解)
1、信息熵
熵 (entropy) 这一词最初来源于热力学。1948年,克劳德·爱尔伍德·香农将热力学中的熵引入信息论,所以也被称为香农熵 (Shannon entropy),信息熵 (information entropy)。首先,我们先来理解一下信息这个概念。信息是一个很抽象的概念,百度百科将它定义为:指音讯、消息、通讯系统传输和处理的对象,泛指人类社会传播的一切内容。那信息可以被量化么?可以的!香农提出的“信息熵”概念解决了这一问题。
在信息论中,熵是接收的每条消息中包含的信息的平均量,又被称为信息熵、信源熵、平均自信息量。
这里,“消息”代表来自分布或数据流中的事件、样本或特征。
- 信息量:信息量就是不确定度,不确定性越强,信息度就越大。
- 两个不相关的事件
x
x
x 和
y
y
y ,那么观察两个事件同时发生时获得的信息量应该等于观察到事件各自发生时获得的信息之和,即:
I
(
x
,
y
)
=
I
(
x
)
+
I
(
y
)
I(x,y)=I(x)+I(y)
I(x,y)=I(x)+I(y).
由于两个事件是独立不相关的,故 p ( x , y ) = p ( x ) p ( y ) p(x,y)=p(x)p(y) p(x,y)=p(x)p(y) 。根据这两个关系,很容易看出 I ( x ) I(x) I(x)一定与 p ( x ) p(x) p(x)的对数有关。 - 自信息:就是指具体某一事件发生时所带来的信息量的多少。也可以理解为如果某事件发生的概率越大,则其自信息就越小。具体的自信息公式如下:
I ( p i ) = − l o g ( p i ) I(p_i)=-log(p_i) I(pi)=−log(pi) p i 表 示 随 机 变 量 的 第 i 个 事 件 发 生 的 概 率 , 自 信 息 单 位 是 b i t 。 p_i表示随机变量的第i个事件发生的概率,自信息单位是bit。 pi表示随机变量的第i个事件发生的概率,自信息单位是bit。 - 信息熵用来度量一个事件可能具有多个状态下的信息量,也可以认为是信息量关于事件概率分布的期望值:
注意:熵只依赖X的分布,和X的取值没有关系,熵是用来度量不确定性,当熵越大,即X=xi的不确定性越大,反之越小,当用在分类中时,熵越大即这个类别的不确定性更大,反之越小.
2、联合熵
上面提到的都是对于一个事件的熵。那么如果有多个事件,例如事件x和事件y都出现时,又该怎样去度量呢?
首先,是联合熵,即对于服从服从联合分布
p
(
x
,
y
)
p(x,y)
p(x,y) 的一对离散型随机变量
(
X
,
Y
)
(X,Y)
(X,Y),其联合熵公式为:
3、条件熵
条件熵表示在已知事件x的条件下,事件y的不确定性。定义为在给定条件下
x
,
y
x,y
x,y 的条件分布概率的熵对
x
x
x 的数学期望:
有公式可知:条件熵与联合熵仅仅在于log项不同。
- 边缘概率:
4、相对熵 Relative entropy
- 相对熵,也被叫做KL距离,也即Kullback-Leibler散度(Kullback-Leibler Divergence),信息散度(information divergence),信息增益(information gain)。它主要用于衡量相同事件空间里的两个概率分布的差异。
- 典型情况下,对D(P||Q)P表示数据的真实分布,Q表示数据的理论分布,模型分布,或P的近似分布
同上述两个随机变量X,Y。假设p(x),p(y)是随机变量中取不同值时的两个概率分布,那么相对熵是:
5、 互信息 Mutual Information
互信息,或转移信息(transinformation)是变量间相互依赖性(如相交信息量)的量度。
同上述两个随机变量X,Y,它们的联合概率密度函数为
p
(
x
,
y
)
p(x,y)
p(x,y),其边缘概率密度函数分别为
p
(
x
)
,
p
(
y
)
p(x),p(y)
p(x),p(y),则互信息
I
(
x
,
y
)
I(x,y)
I(x,y)定义:
6、交叉熵
- 交叉熵,其用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出的代价的大小。公式如下:
即: H ( p , q ) = − ∑ x p ( x ) l o g q ( x ) H(p,q)=-\sum\limits_xp(x)logq(x) H(p,q)=−x∑p(x)logq(x) 。
其中 p ( x ) p(x) p(x)表示真实样本的分布, q ( x ) q(x) q(x)表示预测模型的分布. - 为什么用交叉熵作为代价函数?
注意:在机器学习中,我们需要评估 y y y和 y ^ \hat{y} y^之间的差距,使用KL散度刚刚好,即 D ( y ∣ ∣ y ^ ) D(y||\hat{y}) D(y∣∣y^)(也就是P(x),Q(x)),由于KL散度中的前一部分 − H ( y ) −H(y) −H(y)不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。
7、计算给定数据集的香农熵:
import numpy as np
def cancShannonEnt(dataSet):
'''
:param dataSet: dataSet
:return: shannonEnt
'''
# 计算公式前,注意数据的格式(array)
numEntries = len(dataSet) # 获取数据的行数
labelCounts = { } # 设置字典数据格式,想要存储的数据格式为:类别:频数
for featVec in dataSet: # 获取数据集每一行的数据
currentLabel = featVec[-1] # 获取特征向量的最后一列
# 检查字典中key是否存在
# 如果key不存在
if currentLabel not in labelCounts.keys():
# 将当前的标签存于字典中,并将频数置为0
labelCounts[currentLabel] = 0
# 如果key存在,在当前的键值上+1
labelCounts[currentLabel] +=1
# 数据已准备好,计算熵
shannonEnt = 0.0 # 初始化信息熵
for key in labelCounts: # 遍历出数据中所的类别
pro = float(labelCounts[key]) /numEntries
shannonEnt -= pro * np.log(pro, 2) # 计算信息熵
return shannonEnt # 返回信息熵
参考:https://datawhalechina.github.io/Leeml-Book/#/AdditionalReferences/Entropy