0x01 三个定义
信息
指各个事物运动的状态及状态变化的方式。人们从对周围世界的观察得到的数据中获得信息。信息是抽象的意识或知识,它是看不见、摸不到的。当由人脑的思维活动产生的一种想法仍被存储在脑子里时,它就是一种信息。
消息
指包含信息的语言、文字和图像等。消息是具体的,它载荷信息,但它不是物理性的。
信源
是向通信系统提供消息 u u u的人和机器。信源输出的是以符号形式出现的具体消息,它载荷信息。信源输出的消息可归纳为两类:离散消息和连续消息。前者如字母、汉字等,后者如语音、在时间上连续变化的电参数等。
0x02 自信息量
信源 X X X,其概率空间为 [ X P ] = [ a 1 a 2 … a n p ( a 1 ) p ( a 2 ) … p ( a n ) ] \begin{bmatrix}X\\P\end{bmatrix}=\begin{bmatrix}a_1 & a_2 & \dots & a_n\\p(a_1) & p(a_2) & \dots & p(a_n)\end{bmatrix} [XP]=[a1p(a1)a2p(a2)……anp(an)],这是信源固有的,但是信源在某时刻到底会发出什么符号,接受者是不能确定的,只有当信源发出的符号通过信道的传输到达接收端后,收信者才能得到信息,消除不确定性。符号出现的概率不同,其不确定性就不同。符号出现的概率与信息量是单调递减关系。
信息量可粗略地看作消除的不确定性的大小,一段消息消除的不确定性越大,其所载荷的信息量就越大。
定义具有概率为 p ( x i ) p(x_i) p(xi)的符号 x i x_i xi的自信息量为
I ( x i ) = − log p ( x i ) I(x_i)=-\log p(x_i) I(xi)=−logp(xi)
自信息量的单位与所用的对数底有关。在信息论中常用的是2,此时信息量的单位为比特(bit);若取自然对数,则单位为奈特(nat);若以10为底,则单位为笛特(det);
自信息量具有以下特性:
(1) p ( x i ) = 1 p(x_i)=1 p(xi)=1, I ( x i ) = 0 I(x_i)=0 I(xi)=0;
(2) p ( x i ) = 0 p(x_i)=0 p(xi)=0, I ( x i ) = ∞ I(x_i)=\infty I(xi)=∞;
(3) 非负性;
(4) 单调递减性:若 p ( x 1 ) < p ( x 2 ) p(x_1)<p(x_2) p(x1)<p(x2),则 I ( x 1 ) > I ( x 2 ) I(x_1)>I(x_2) I(x1)>I(x2);
(5) 可加性:若有两个符号 x i x_i xi, y j y_j yj同时出现,可用联合概率 p ( x i , y j ) p(x_i,y_j) p(xi,yj)来表示,这时的自信息量为 I ( x i , y j ) = − log p ( x i , y j ) I(x_i,y_j)=-\log p(x_i,y_j) I(xi,yj)=−logp(xi,yj),当 x i x_i xi和 y j y_j yj相互独立时,有 p ( x i , y j ) = p ( x i ) p ( y j ) p(x_i,y_j)=p(x_i)p(y_j) p(xi,yj)=p(xi)p(yj),那么就有 I ( x i , y j ) = I ( x i ) + I ( y j ) I(x_i,y_j)=I(x_i)+I(y_j) I(xi,yj)=I(xi)+I(yj)。
0x03 离散信源熵
信源熵
自信息量 I ( x i ) I(x_i) I(xi)只是表征信源中各个符号 x i x_i xi的不确定度,而一个信源总是包含多个符号消息,各个符号消息又按概率空间的先验概率分布,因而各个符号的自信息量就不同。所以自信息量 I ( x i ) I(x_i) I(xi)是与概率分布有关的一个随机变量,不能作为信源总体的信息量度。对这样的随机变量只能采取求平均的方法。
假设一个不透明的布袋里放了100个球,其中有80个球是红色的,20个球是白色的,若随机取出一个球,猜测其颜色。该信源的概率空间为
[ x p ] = [ x 1 x 2 0.8 0.2 ] \begin{bmatrix}x\\p\end{bmatrix}=\begin{bmatrix} x_1 & x_2 \\ 0.8 & 0.2\end{bmatrix} [xp]=[x10.8x20.2]
其中 x 1 x_1 x1表示摸出的球是红球, x 2 x_2 x2表示摸出的球是白球。当被告知摸出的球是红球,则获得的信息量是
I ( x 1 ) = − log p ( x 1 ) = − log 2 0.8 b i t I(x_1)=-\log p(x_1)=-\log_2 0.8 bit I(x1)=−logp(x1)=−log20.8bit
当被告知摸出的球是白球,获得的信息量是
I ( x 2 ) = − log p ( x 2 ) = − log 2 0.2 b i t I(x_2)=-\log p(x_2)=-\log_2 0.2 bit I(x2)=−logp(x2)=−log20.2bit
在有放回的情况下随机摸取 n n n次,易知平均随机摸取一次所获得的信息量为
1 n [ n p ( x 1 ) I ( x 1 ) + n p ( x 2 ) I ( x 2 ) ] = − [ p ( x 1 ) log p ( x 1 ) + p ( x 2 ) log p ( x 2 ) ] = − ∑ i = 1 2 p ( x i ) log p ( x i ) \begin{align} &\ \ \ \ \ \frac{1}{n}[np(x_1)I(x_1)+np(x_2)I(x_2)]\nonumber \\&=-[p(x_1)\log p(x_1)+p(x_2)\log p(x_2)]\nonumber \\&=-\sum_{i=1}^2p(x_i)\log p(x_i)\nonumber \end{align} n1[np(x1)I(x1)+np(x2)I(x2)]=−[p(x1)logp(x1)+p(x2)logp(x2)]=−i=1∑2p(xi)logp(xi)
上述求出的就称为平均自信息量,即平均每个符号能提供的信息量。它只与信源各符号出现的概率有关,可以用来表征信源输出信息的总体特征。他是信源中各个符号自信息量的数学期望。即
E ( I ( X ) ) = ∑ i p ( x i ) I ( x i ) = − ∑ i p ( x i ) log p ( x i ) \begin{equation}E(I(X))=\sum_i p(x_i)I(x_i)=-\sum_i p(x_i)\log p(x_i)\end{equation} E(I(X))=i∑p(xi)I(xi)=−i∑p(xi)logp(xi)
单位为 bit/符号。
类似地,引入信源 X X X的平均不确定度的概念,它是在总体平均意义上的信源不确定度。由平均不确定度的定义式(1)与统计物理学中热熵的表示形式相似,且热熵是用来度量一个物理系统的杂乱性(无序性),与这里的不确定度概念相似,所以又把信源的平均不确定度称为信源 X X X的熵。信源熵是在平均意义上来表征信源的总体特性,他是信源 X X X的函数,一般写成 H ( X ) H(X) H(X), X X X是指随机变量的整体(包括概率空间)。信源熵是非负量。
例子
电视屏上约有 500 × 600 = 3 × 1 0 5 500 \times 600 =3 \times 10^5 500×600=3×105个格点,按每点有10个不同的灰度等级考虑,则共能组成 1 0 3 × 1 0 5 10^{3\times10^5} 103×105个不同的画面。按等概计算,平均每个画面可提供的信息量为
H ( x ) = − ∑ i = 1 n p ( x i ) log p ( x i ) = − log 2 1 0 − 3 × 1 0 5 = 3 × 1 0 5 × 3.32 ≈ 1 0 6 b i t / 画面 \begin{align}H(x)&=-\sum_{i=1}^n p(x_i)\log p(x_i) = -\log_2 10^{-3\times 10^5}\nonumber \\&=3\times 10^5 \times 3.32 \approx 10^6 bit/画面\nonumber \end{align} H(x)=−i=1∑np(xi)logp(xi)=−log210−3×105=3×105×3.32≈106bit/画面
条件熵
在给定 y j y_j yj条件下, x i x_i xi的条件自信息量为 I ( x i ∣ y j ) I(x_i|y_j) I(xi∣yj), X X X集合的条件熵 H ( X ∣ y j ) H(X|y_j) H(X∣yj)为
H ( X ∣ y i ) = ∑ i p ( x i ∣ y i ) I ( x i ∣ y i ) H(X|y_i)=\sum_i p(x_i|y_i)I(x_i|y_i) H(X∣yi)=i∑p(xi∣yi)I(xi∣yi)
进一步在给定 Y Y Y(即各个 y i y_i yi)条件下, X X X集合的条件熵 H ( X ∣ Y ) H(X|Y) H(X∣Y)定义为
H ( X ∣ Y ) = ∑ j p ( y j ) H ( X ∣ y j ) = ∑ i j p ( y j ) p ( x i ∣ y j ) I ( x i ∣ y j ) = ∑ i j p ( x i , y j ) I ( x i ∣ y j ) \begin{align} H(X|Y)&=\sum_j p(y_j)H(X|y_j) \nonumber \\&=\sum_{ij} p(y_j)p(x_i|y_j)I(x_i|y_j) \nonumber \\&=\sum_{ij} p(x_i,y_j)I(x_i|y_j) \nonumber \end{align} H(X∣Y)=j∑p(yj)H(X∣yj)=ij∑p(yj)p(xi∣yj)I(xi∣yj)=ij∑p(xi,yj)I(xi∣yj)
即条件熵是在联合符号集合 H ( X , Y ) H(X,Y) H(X,Y)上的条件自信息量的联合概率甲醛统计平均值。条件熵 H ( X ∣ Y ) H(X|Y) H(X∣Y)表示已知 Y Y Y后, X X X的不确定度。
相应地,在给定 X X X(即各个 x i x_i xi)条件下, Y Y Y集合的条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)定义为
H ( Y ∣ X ) = ∑ i j p ( x i , y j ) I ( y j ∣ X I ) = − ∑ i j p ( x i , y j ) log p ( y j ∣ x i ) H(Y|X)=\sum_{ij} p(x_i,y_j)I(y_j|X_I)=-\sum_{ij}p(x_i,y_j)\log p(y_j|x_i) H(Y∣X)=ij∑p(xi,yj)I(yj∣XI)=−ij∑p(xi,yj)logp(yj∣xi)
联合熵
联合熵是联合符号集合 ( X , Y ) (X,Y) (X,Y)上的每个元素对 ( x i , y j ) (x_i,y_j) (xi,yj)的自信息量的概率加权平均值,定义为
H ( X , Y ) = ∑ i j p ( x i , y j ) I ( x i , y j ) = − ∑ i j p ( x i , y j ) log p ( x i , y j ) H(X,Y)=\sum_{ij}p(x_i,y_j)I(x_i,y_j)=-\sum_{ij}p(x_i,y_j)\log p(x_i,y_j) H(X,Y)=ij∑p(xi,yj)I(xi,yj)=−ij∑p(xi,yj)logp(xi,yj)
联合熵 H ( X , Y ) H(X,Y) H(X,Y)表示 X X X和 Y Y Y同时发生的不确定度。联合熵 H ( X , Y ) H(X,Y) H(X,Y)与熵 H ( X ) H(X) H(X)及条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)之间存在下列关系:
H ( X , Y ) = H ( X ) + H ( Y ∣ X ) = H ( Y ) + H ( X ∣ Y ) H(X,Y)=H(X)+H(Y|X)=H(Y)+H(X|Y) H(X,Y)=H(X)+H(Y∣X)=H(Y)+H(X∣Y)
0x04 条件熵公式推导
设随机变量为明天的天气,晴天为 a 1 a_1 a1,下雨为 a 2 a_2 a2,被告知明天晴天对应的概率和自信息量为 p ( a 1 ) p(a_1) p(a1)和 I ( a 1 ) I(a_1) I(a1),被告知明天下雨对应的概率和自信息量为 p ( a 2 ) p(a_2) p(a2)、 I ( a 2 ) I(a_2) I(a2),这是具体事件。而被告知今天的天气和被告知明天的天气分别对应 X X X和 Y Y Y, X X X包含两种情况: x 1 x_1 x1, x 2 x_2 x2, Y Y Y同理。如被告知今天的天气的信息熵 H ( X ) = p ( a 1 ) I ( a 1 ) + p ( a 2 ) I ( a 2 ) H(X)=p(a_1)I(a_1)+p(a_2)I(a_2) H(X)=p(a1)I(a1)+p(a2)I(a2) 。
信息熵(信源熵)即为平均不确定性、平均信息量
- p ( y 1 ∣ x 1 ) p(y_1|x_1) p(y1∣x1) 代表在今天下雨的前提下,明天下雨的概率,其信息量 I ( y 1 ∣ x 1 ) = − log p ( y 1 ∣ x 1 ) I(y_1|x_1)=-\log p(y_1|x_1) I(y1∣x1)=−logp(y1∣x1)
- 已知今天下雨,被告知明天天气,这个事件的信息熵 H ( Y ∣ x 1 ) = p ( y 1 ∣ x 1 ) I ( y 1 ∣ x 1 ) + p ( y 2 ∣ x 1 ) I ( y 1 ∣ x 1 ) H(Y|x_1)=p(y_1|x_1)I(y _1|x_1)+p(y_2|x_1)I(y_1|x_1) H(Y∣x1)=p(y1∣x1)I(y1∣x1)+p(y2∣x1)I(y1∣x1)
- 已知今天天气,被告知明天天气,这个事件的信息熵 H ( Y ∣ X ) = p ( x 1 ) H ( Y ∣ x 1 ) + p ( x 2 ) H ( Y ∣ x 2 ) H(Y|X)=p(x_1)H(Y|x_1)+p(x_2)H(Y|x2) H(Y∣X)=p(x1)H(Y∣x1)+p(x2)H(Y∣x2)
由此可推导出通用公式
H ( Y ∣ X ) = − ∑ i j p ( x i , y i ) log p ( y i ∣ x i ) H(Y|X)=-\sum_{ij} p(x_i,y_i)\log p(y_i|x_i) H(Y∣X)=−ij∑p(xi,yi)logp(yi∣xi)
思考
可否定义 H ( y 1 ∣ X ) H(y_1|X) H(y1∣X)?
即已知今天天气,被告知明天下雨。
H ( Y ∣ X ) = − p ( y 1 ) p ( x 2 ∣ y 1 ) log ( y 1 ∣ x 2 ) H ( y 1 ∣ X ) = p ( x 1 ∣ y 1 ) I ( y 1 ∣ x 1 ) + p ( x 2 ∣ y 1 ) I ( y 1 ∣ x 2 ) H(Y|X)=-p(y_1)p(x_2|y_1)\log (y_1|x_2)\\ H(y_1|X)=p(x_1|y_1)I(y_1|x_1)+p(x_2|y_1)I(y_1|x_2) H(Y∣X)=−p(y1)p(x2∣y1)log(y1∣x2)H(y1∣X)=p(x1∣y1)I(y1∣x1)+p(x2∣y1)I(y1∣x2)
0x05 应用实践
给出一个大小为 512 × 512 512\times 512 512×512的Lena图,以 32 × 32 32\times 32 32×32为区块大小,找出Lena图中信息熵最小的区块
做法
将Lena图以灰度方式读入数组,然后用32×32的滑动窗口遍历该二维数组,计算每个灰度值在此窗口中的频度,算出概率并计算此窗口的信息熵,最后找出信息熵最小的窗口。
实现
import cv2
import math
import numpy as npimage = cv2.imread("./Lena.jpg",0)# 创建滑动窗口
img = np.lib.stride_tricks.sliding_window_view(np.array(image),(32,32))# 记录灰度值出现频度的数组
grayscale = [0 for i in range(256)]
entropyList = [[0.0 for i in range(len(img))] for i in range(len(img))]# 遍历窗口数组
for x in range(len(img)):for y in range(len(img)):print('窗口[{0}][{1}]'.format(x, y), end='')tmp = img[x][y]# 遍历窗口内数据for k in range(32):for l in range(32):grayscale[tmp[k][l]] += 1# 计算信息熵entropy = 0.0for i in grayscale:if i != 0:entropy += float(i / 1024) * float(math.log(1024 / i, 2))entropyList[x][y] = entropyprint('信息熵为', entropy)# 临时变量归零entropy = 0.0grayscale = [0 for i in range(256)]# 找出最小值和其位置
minScale = 255.0
position = (0, 0)
for i,x in enumerate(entropyList):for j,y in enumerate(x):if y < minScale:minScale = yposition = (i, j)print("\n信息熵最小值:", minScale)
print("位置:", position)# 画出区块边框
for i in range(position[1],position[1] + 32):image[position[0]][i] = 255image[position[0] + 31][i] = 255
for i in range(32):image[i][position[1]] = 255image[i][position[1] + 31] = 255
cv2.imwrite('./output.jpg',image, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
结果
信息熵最小值:1.1805713072324544
位置:(0,133)