- 信息熵(information entropy)可以对信息进行量化,比如可以用信息熵来量化一本书所含的信息量。
- 信息熵这个词是克劳德-埃尔伍德-香浓从热力学中借用过来的。在热力学中,热熵是用来表示分子状态混乱程度的物理量。
- 克劳德-埃尔伍德-香浓用信息熵来描述信源的不确定度。
信息熵与概率的计算关系
- 任何的信息都存在冗余,冗余大小与信息中每个符号(数字,字母或者单词)的出现概率或者说不确定性有关。
- 信息熵是指去掉冗余信息后的平均信息量。
- 其值与信息中每个符号的出现概率密切相关。
香浓编码定理:熵是传输一个随机变量状态值所需要的比特位下届。该定理的主要依据是信息熵中没有冗余信息。
依据香浓编码定理,信息熵还可以应用在数据压缩方面。 - 一个信源发送出什么符号是不确定的,确定这个符号可以根据其出现的概率来衡量。
- 哪个符合出现的概率大,其出现的机会多,不确定性小,信息熵就小;反之不确定性就大,则信息熵就越大。
1.信息熵的特点
假设信息熵的函数是I,计算概率的函数是P,则信息熵的特点可以表示为下面的形式。
(1)I是关于P的减函数。
(2)两个独立符号所产生的不确定性(信息熵)应等于各自不确定性之和,用公式表示为I(P1,P2 ) = I(P1) +I(P2)
2.自信息的计算公式
- 信息熵属于一个抽样的概念,其计算方法没有固定公式。任何符合信息熵特点的公式都可以被用作信息熵的计算。
对数函数是一个符合信息熵特性的函数,具体的解释如下:
(1)假设两个独立不相关事件x和y发生的概率为P(x, y),则P(x, y) = P(x)P(y)
(2)如果将对数公式引入信息熵的计算,则 I(x, y) = log[(P(x, y) ] = log[P(x)] + log[P(y)]
(3)如果 I(x) = log[(P(x) ] ,I(y) = log[(P(y) ],则 I(x, y) = I(x) + I(y)
(4)为了满足I是关于P的减函数的条件,在取对数前对P取倒数。
于是引入对数函数的信息熵
I (p) = Iog (1/p) = -log (p) - 上式中的P的概率函数P(x)的计算结果,I(x) 也称为随机变量x的自信息(self-information),描述的是随机变量的某个事件发生所带的信息量。
我们可以使用python实现对数函数信息熵代码如下:
import numpy as np
import matplotlib.pyplot as plt
# 定义函数
def information_entropy(x):
return -np.log(x)
# 生成 x 值
x = np.linspace(0.01, 2, 100) # 避免零值,因为 log(0) 是未定义的
# 计算相应的 y 值
y = information_entropy(x)
# 创建图像
fig, ax = plt.subplots()
# 绘制图像
ax.plot(x, y, label='Information Entropy: -log(x)')
ax.set_aspect('equal', adjustable='datalim') # 设置纵横比相等
ax.spines['left'].set_position('zero') # 左边框线移到 x=0
ax.spines['bottom'].set_position('zero') # 底边框线移到 y=0
ax.spines['right'].set_color('none') # 右边框线隐藏
ax.spines['top'].set_color('none') # 顶边框线隐藏
# 添加标签和标题
plt.xlabel('x')
plt.ylabel('Information Entropy: -log(x)')
plt.title('Information Entropy Function')
plt.legend()
plt.grid(True)
plt.show()
I(x) 函数的图像如下图所示。
3. 信息熵的计算公式
- 在信源中,加入信源符号U可以有n种取值:U1,U2,U3 … ,Un,对应的概率函数为:P1,P2,P3 … ,Pn,而且各种符号的出现彼此独立。
- 该信源所表达的信息量可以通过-log[P(U)]求关于概率分布P(U)的对数得到。
- U的信息熵H(U)可以写为:
H(U) = -∑i=1n\sum_{i=1}^n∑i=1nPi log(Pi) - 目前,信息熵大多数都是通过上式计算的,Pi是概率函数Pi(Ui)的计算结果,求和符号中的i代表从1到n之间的整数。
- 在实践中对数一般以2为底,约定0log0=0。
- 以一个最简单的单符号二元信源为例说明,该信源中的符号U仅可以取值为a或b。
- 其中,取a的概率为p,取b的概率为1-p。
- 该信源的信息熵可以记为H(U) = P I§ + (1-P) I(1-p)
import numpy as np
import matplotlib.pyplot as plt
# 定义信息熵函数
def entropy(p):
return -p*np.log2(p) - (1-p)*np.log2(1-p)
# 生成100个横坐标点,范围从0到1
p_values = np.linspace(0.00, 0.99, 100)
# 计算对应横坐标点的信息熵值
entropy_values = [entropy(p) for p in p_values]
# 绘制图像
plt.figure()
plt.plot(p_values, entropy_values, label='H(U) = -p*log2(p) - (1-p)*log2(1-p)')
plt.xlabel('Probability (p)')
plt.ylabel('Entropy (H(U))')
plt.title('Binary Source Entropy Function')
plt.legend()
plt.grid(True)
plt.show()
x轴代表符号U取值为a的概率值p,y轴代表符号U的信息熵H(U)。
由上述图像我们可以看出关于信息熵的特性:
(1)确定性:当符号U取值为a的概率值p=0,p=1时,U的值是确定的,没有任何变化量,所以信息熵为0.
(2)极值性:p = 0.5时,U的信息熵达到了最大。
(3)对称性:图形在水平方向关于p=0.5对称。
(4)非负性:即收到一个信源符号所获得的信息熵应为正值,H(U) >= 0
4. 连续信息熵及其特性
- 在3中提到的信息熵的计算公式中所介绍的公式适用于离散信源,即信源中的变量都是从离散数据中取值。
- 在信息论中,还有一种连续信源,即信源中的变量是从连续数据中取值。
- 连续信源可以有无限个值,信息量无限大,对其求信息熵没有任何的意义。
- 一般常会以其他的连续信源做参考,用相对熵的值进行度量。