大家好,欢迎来到IT知识分享网。
一.熵概述
热力学中的熵:
- 是表示分子状态混乱程度的物理量
信息论中的熵:
- 用来描述信源的不确定性的大小
- 由美国数学家香农提出,他是信息论的创始人。
- 经常使用的熵概念有下列几种:信息熵 交叉熵 相对熵 条件熵 互信息
二.常用熵介绍
2.1 信息熵
我们知道信息被用来消除事物的随机不确定性。
那么,首先我们需要确定信源信息的不确定性该如何衡量。
信源信息的不确定性函数 f ( p ) 常满足两个条件:
- 是概率p的单调递减函数。
- 两个独立符号所产生的不确定性应等于各自不确定性之和,即f(p1 , p2)=f(p1)+f(p2)
2.2 交叉熵(cross entropy):
交叉熵定义:
- 交叉熵是信息论中一个重要的概念,用于表征两个变量概率分布P,Q(假设P表示真实分布,Q为模型预测的分布)的差异性。
- 交叉熵越大,两个变量差异程度越大。
2.3 相对熵(relative entropy):
也称为KL散度(Kullback-Leibler divergence,简称KLD),信息散度(information divergence),信息增益(information gain)。
相对熵的定义:
- 是交叉熵与信息熵的差值。表示用分布Q模拟真实分布P,所需的额外信息。
- 计算结果中数值大,则说明分布的差距较大。
假设某字符发射器随机发出0和1的两种字符,且其真实发出概率分布为A。现在有两人的观察概率分布B与C。各个分布如下:
- A(0)=1/2 A(1)=1/2
- B(0)=1/4 B(1)=3/4
- C(0)=1/8 C(1)=7/8
问:B和C哪个更接近实际分布A?
答:
D K L ( A ∣ ∣ B ) = 1 2 l o g 1 2 1 4 + 1 2 l o g 1 2 3 4 D K L ( A ∣ ∣ C ) = 1 2 l o g 1 2 1 8 + 1 2 l o g 1 2 7 8 D_{KL}(A||B)=\frac{1}{2}log\frac{\frac{1}{2}}{\frac{1}{4}}+\frac{1}{2}log\frac{\frac{1}{2}}{\frac{3}{4}} \\ D_{KL}(A||C)=\frac{1}{2}log\frac{\frac{1}{2}}{\frac{1}{8}}+\frac{1}{2}log\frac{\frac{1}{2}}{\frac{7}{8}} DKL(A∣∣B)=21log4121+21log4321DKL(A∣∣C)=21log8121+21log8721
得出结论:相比C而言,B更接近于A。
相对熵的性质:
- 非对称性:
D K L ( A ∣ ∣ B ) ≠ D K L ( B ∣ ∣ A ) D_{KL}(A||B)\neq D_{KL}(B||A) DKL(A∣∣B)=DKL(B∣∣A)
- 非负性:
D K L ( B ∣ ∣ A ) > 0 D_{KL}(B||A) > 0 DKL(B∣∣A)>0
部分人称呼相对熵(KL散度)为KL距离,但实际上它并不能真正地度量距离。
2.4 JS散度(Jensen-Shannon divergence)
- 因为KL散度不具有对称性,因此JS散度在KL散度的基础上进行了改进,现有两个分布p1和p2,其JS散度公式为:
J S ( P 1 ∣ ∣ P 2 ) = 1 2 K L ( P 1 ∣ ∣ P 1 + P 2 2 ) + 1 2 K L ( P 2 ∣ ∣ P 1 + P 2 2 ) JS(P_1||P_2) = \frac{1}{2} KL(P_1||\frac{P_1+P_2}{2}) + \frac{1}{2} KL(P_2||\frac{P_1+P_2}{2}) JS(P1∣∣P2)=21KL(P1∣∣2P1+P2)+21KL(P2∣∣2P1+P2)
- 同样可以度量两个分布的相似程度。
2.5 联合熵(combination entropy)
- 联合熵也称之为复合熵(Joint Entropy):
- 用H(X,Y)表示,两个随机变量X,Y的联合分布的熵,形成联合熵。
2.6 条件熵(the conditional entropy)
条件熵: H(X|Y)表示在已知随机变量Y的条件下随机变量x的不确定性。
H(X|Y) = H(X,Y) – H(Y),表示(X, Y)的联合熵,减去Y单独发生包含的熵。
推导过程:
- 假设已知y = yj,则
H ( x ∣ y j ) = − ∑ i = 1 n p ( x i ∣ y i ) l o g p ( x i ∣ y j ) H(x|y_j) = – \sum_{i=1}^{n}p(x_i|y_i)logp(x_i|y_j) H(x∣yj)=−i=1∑np(xi∣yi)logp(xi∣yj)
- 对于y的各种可能值, 需要根据出现概率做加权平均。即
H ( x ∣ y ) = − ∑ i = 1 n ∑ j = 1 m p ( y j ) p ( x i ∣ y j ) l o g p ( x i ∣ y j ) H ( x ∣ y ) = − ∑ i = 1 n ∑ j = 1 m p ( x i , y j ) l o g p ( x i , y j ) p ( y j ) H ( x ∣ y ) = H ( x , y ) − H ( y ) H(x|y) = – \sum_{i=1}^{n}\sum_{j=1}^{m}p(y_j)p(x_i|y_j)logp(x_i|y_j) \\ H(x|y) = – \sum_{i=1}^{n}\sum_{j=1}^{m}p(x_i,y_j)log\frac{p(x_i,y_j)}{p(y_j)} \\ H(x|y) = H(x,y) – H(y) H(x∣y)=−i=1∑nj=1∑mp(yj)p(xi∣yj)logp(xi∣yj)H(x∣y)=−i=1∑nj=1∑mp(xi,yj)logp(yj)p(xi,yj)H(x∣y)=H(x,y)−H(y)
2.7 互信息(Mutual Information)
- 互信息可以被看成是一个随机变量中包含的关于另一个随机变量的信息量
- 或者说是一个随机变量由于已知另一个随机变量而减少的不确定性
推导过程:
I ( X ; Y ) = H ( X ) − H ( X ∣ Y ) I ( X ; Y ) = H ( X ) + H ( Y ) − H ( X , Y ) I ( X ; Y ) = ∑ x p ( x ) l o g 1 p ( x ) + ∑ y p ( y ) l o g 1 p ( y ) − ∑ x , y p ( x , y ) l o g 1 p ( x , y ) I (X;Y) = H(X) – H(X|Y) \\ I (X;Y)=H(X)+H(Y)-H(X,Y) \\ I (X;Y)=\sum_{x}^{}p(x)log\frac {1}{p(x)} + \sum_{y}^{}p(y)log\frac{1}{p(y)} – \sum_{x,y}^{}p(x,y)log\frac{1}{p(x,y)} I(X;Y)=H(X)−H(X∣Y)I(X;Y)=H(X)+H(Y)−H(X,Y)I(X;Y)=x∑p(x)logp(x)1+y∑p(y)logp(y)1−x,y∑p(x,y)logp(x,y)1
结论:
I ( X ; Y ) = ∑ x , y p ( x , y ) l o g p ( x , y ) p ( x ) p ( y ) I (X;Y)=\sum_{x,y}^{}p(x,y)log\frac{p(x,y)}{p(x)p(y)} I(X;Y)=x,y∑p(x,y)logp(x)p(y)p(x,y)
即互信息I(X,Y)是联合分布p(x,y)与乘积分布p(x)p(y)的相对熵
文氏图图解:
三.熵值计算
# -*- coding: utf-8 -*- #演示内容:香农信息熵的计算(例1和例2分别为两种不同类型的输入)以及互信息的计算(例3)。其中log默认为自然对数。 import numpy as np from math import log #例1: 计算香农信息熵(已知概率分布) print("例1:") def calc_ent(x): ent = 0.0 for p in x: ent -= p * np.log(p) return ent x1=np.array([0.4, 0.2, 0.2, 0.2]) x2=np.array([1]) x3=np.array([0.2, 0.2, 0.2, 0.2, 0.2]) print ("x1的信息熵:", calc_ent(x1)) print ("x2的信息熵:", calc_ent(x2)) print ("x3的信息熵:", calc_ent(x3)) print("") #例2: 计算香农信息熵(此时给定了信号发生情况) print("例2:") def calcShannonEnt(dataSet): length,dataDict=float(len(dataSet)),{
} for data in dataSet: try:dataDict[data]+=1 except:dataDict[data]=1 return sum([-d/length*log(d/length) for d in list(dataDict.values())]) print("x1的信息熵:", calcShannonEnt(['A','B','C','D','A'])) print("x2的信息熵:",calcShannonEnt(['A','A','A','A','A'])) print("x3的信息熵:",calcShannonEnt(['A','B','C','D','E'])) #例3: 计算互信息(输入:给定的信号发生情况,其中联合分布已经手工给出) print("") print("例3:") Ent_x4=calcShannonEnt(['3', '4', '5', '5', '3', '2', '2', '6', '6', '1']) Ent_x5=calcShannonEnt(['7', '2', '1', '3', '2', '8', '9', '1', '2', '0']) Ent_x4x5=calcShannonEnt(['37', '42', '51', '53', '32', '28', '29', '61', '62', '10', '37', '42']) MI_x4_x5=Ent_x4+Ent_x5-Ent_x4x5 print ("x4和x5之间的互信息:",MI_x4_x5)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120645.html
