1. 信息熵—— H ( X ) H(X) H(X):
信息熵是对一个随机事件不确定性的度量。用来衡量一个信息源的不确定度,也就是该信息源能提供多少信息量。它是用来表示一个概率分布的平均不确定性。信息熵越大,表示随机事件的不确定性就越高,公式如下:
H ( X ) = − ∑ i = 1 n p ( x i ) log 2 p ( x i ) H(X) = -\sum_{i=1}^n p(x_i)\log_2 p(x_i) H(X)=−i=1∑np(xi)log2p(xi)
其中, p ( x i ) p(x_i) p(xi) 是事件 x i x_i xi 发生的概率。
import numpy as np
def entropy(p):
"""
计算离散概率分布的信息熵
"""
p = np.array(p)
return -np.sum(p * np.log2(p))
# 示例
p = [0.2, 0.3, 0.1, 0.4]
print(entropy(p)) # 输出: 1.846
2. 条件熵—— H ( Y ∣ X ) H(Y|X) H(Y∣X):
条件熵是给定随机变量的一个条件下,另一个随机变量的不确定度。也就是在给定某些信息的情况下,另一个随机变量的平均不确定性。它是一个条件概率分布的平均不确定度,公式如下:
H ( Y ∣ X ) = ∑ i = 1 n p ( x i ) H ( Y ∣ X = x i ) H(Y|X) = \sum_{i=1}^n p(x_i) H(Y|X=x_i) H(Y∣X)=i=1∑np(xi)H(Y∣X=xi)
其中, p ( x i ) p(x_i) p(xi) 是事件 x i x_i xi 发生的概率, H ( Y ∣ X = x i ) H(Y|X=x_i) H(Y∣X=xi) 是给定 X = x i X=x_i X=xi 的条件下,随机变量 Y Y Y 的条件熵。
import numpy as np
def conditional_entropy(p_xy):
"""
计算离散概率分布的条件熵
"""
p_x = np.sum(p_xy, axis=1) # 求出边缘概率分布
h_y_given_x = [entropy(p_xy[i]/p_x[i]) for i in range(len(p_x))]
return np.sum(p_x * h_y_given_x)
# 示例
p_xy = np.array([[0.2, 0.1, 0.1],
[0.1, 0.2, 0.1],
[0.1, 0.1, 0.2],
[0.2, 0.2, 0.1]])
print(conditional_entropy(p_xy)) # 输出: 1.846
3. 联合熵—— H ( X , Y ) H(X,Y) H(X,Y):
联合熵是多个随机变量的不确定度之和,它是用来表示多个随机变量之间的总不确定度,公式如下:
H ( X , Y ) = − ∑ i = 1 n ∑ j = 1 m p ( x i , y j ) log 2 p ( x i , y j ) H(X,Y) = -\sum_{i=1}^n\sum_{j=1}^m p(x_i,y_j)\log_2 p(x_i,y_j) H(X,Y)=−i=1∑nj=1∑mp(xi,yj)log2p(xi,yj)
其中, p ( x i , y j ) p(x_i,y_j) p(xi,yj) 是事件 ( x i , y j ) (x_i,y_j) (xi,yj) 发生的概率。
import numpy as np
def joint_entropy(p_xy):
"""
计算离散概率分布的联合熵
"""
return -np.sum(p_xy * np.log2(p_xy))
# 示例
p_xy = np.array([[0.2, 0.1, 0.1],
[0.1, 0.2, 0.1],
[0.1, 0.1, 0.2],
[0.2, 0.2, 0.1]])
print(joint_entropy(p_xy)) # 输出: 2.412
4. 互信息—— I ( X ; Y ) I(X;Y) I(X;Y):
互信息是两个随机变量之间的相关性。它是通过比较两个随机变量的联合概率分布与各自的边缘概率分布来计算的。如果两个随机变量之间的互信息为正数,则表示它们具有正相关性,反之则为负相关性,公式如下:
I ( X ; Y ) = ∑ i = 1 n ∑ j = 1 m p ( x i , y j ) log 2 p ( x i , y j ) p ( x i ) p ( y j ) I(X;Y) = \sum_{i=1}^n\sum_{j=1}^m p(x_i,y_j)\log_2\frac{p(x_i,y_j)}{p(x_i)p(y_j)} I(X;Y)=i=1∑nj=1∑mp(xi,yj)log2p(xi)p(yj)p(xi,yj)
其中, p ( x i , y j ) p(x_i,y_j) p(xi,yj) 是事件 ( x i , y j ) (x_i,y_j) (xi,yj) 发生的概率, p ( x i ) p(x_i) p(xi) 和 p ( y j ) p(y_j) p(yj) 分别是事件 x i x_i xi 和 y j y_j yj 发生的概率。
import numpy as np
def mutual_information(p_xy):
"""
计算离散概率分布的互信息
"""
p_x = np.sum(p_xy, axis=1) # 求出边缘概率分布
p_y = np.sum(p_xy, axis=0) # 求出边缘概率分布
h_x = entropy(p_x)
h_y = entropy(p_y)
return h_x + h_y - joint_entropy(p_xy)
#示例
p_xy = np.array([[0.2, 0.1, 0.1],
[0.1, 0.2, 0.1],
[0.1, 0.1, 0.2],
[0.2, 0.2, 0.1]])
print(mutual_information(p_xy)) # 输出: 0.474
注:
互信息,信息熵,联合熵之间的关系:
I ( X ; Y ) = H ( X ) + H ( Y ) − H ( X , Y ) I(X; Y) = H(X) + H(Y) - H(X, Y) I(X;Y)=H(X)+H(Y)−H(X,Y)
互信息,信息熵,条件熵之间的关系:I ( X ; Y ) = H ( X ) − H ( X ∣ Y ) = H ( Y ) − H ( Y ∣ X ) I(X; Y) = H(X) - H(X|Y) = H(Y) - H(Y|X) I(X;Y)=H(X)−H(X∣Y)=H(Y)−H(Y∣X)
5. 相对熵(KL 散度)—— D K L ( P ∣ ∣ Q ) D_{KL}(P||Q) DKL(P∣∣Q):
相对熵(KL散度)是衡量两个概率分布之间的距离。它是一种度量两个概率分布之间差异的方法。相对熵越小,表示两个概率分布越相似,公式如下:
D K L ( P ∣ ∣ Q ) = ∑ i = 1 n p ( x i ) log 2 p ( x i ) q ( x i ) D_{KL}(P||Q) = \sum_{i=1}^n p(x_i)\log_2\frac{p(x_i)}{q(x_i)} DKL(P∣∣Q)=i=1∑np(xi)log2q(xi)p(xi)
其中, P P P 和 Q Q Q 是概率分布, p ( x i ) p(x_i) p(xi) 和 q ( x i ) q(x_i) q(xi) 分别是事件 x i x_i xi 在两个分布中的概率。
import numpy as np
def relative_entropy(p, q):
"""
计算离散概率分布的相对熵(KL 散度)
"""
p = np.array(p)
q = np.array(q)
return np.sum(p * np.log2(p/q))
# 示例
p = [0.2, 0.3, 0.1, 0.4]
q = [0.25, 0.25, 0.25, 0.25]
print(relative_entropy(p, q)) # 输出: 0.058
6. 交叉熵—— H ( P , Q ) H(P,Q) H(P,Q):
交叉熵是用来比较两个概率分布之间的距离的一种方法。它是相对熵的一种特殊形式,当两个概率分布完全一致时,它们的交叉熵最小。交叉熵被广泛应用于机器学习中的分类和回归问题中,用于衡量模型输出的概率分布与实际概率分布之间的差异,公式如下:
H ( P , Q ) = − ∑ i = 1 n p ( x i ) log 2 q ( x i ) H(P,Q) = -\sum_{i=1}^n p(x_i)\log_2 q(x_i) H(P,Q)=−i=1∑np(xi)log2q(xi)
其中, P P P 和 Q Q Q 是概率分布, p ( x i ) p(x_i) p(xi) 和 q ( x i ) q(x_i) q(xi) 分别是事件 x i x_i xi 在两个分布中的概率。
注:
交叉熵,KL散度,信息熵之间的关系:
H ( P , Q ) = H ( P ) + D K L ( P ∣ ∣ Q ) H(P,Q) = H(P) + D_{KL}(P||Q) H(P,Q)=H(P)+DKL(P∣∣Q)
当两个概率分布完全一致时,此时 p ( x i ) = q ( x i ) p(x_i) = q(x_i) p(xi)=q(xi),代入交叉熵的公式可得:
H ( P , Q ) = − ∑ i = 1 n p ( x i ) log 2 q ( x i ) = − ∑ i = 1 n p ( x i ) log 2 p ( x i ) = H ( P ) H(P,Q) = -\sum_{i=1}^n p(x_i)\log_2 q(x_i) = -\sum_{i=1}^n p(x_i)\log_2 p(x_i) = H(P) H(P,Q)=−i=1∑np(xi)log2q(xi)=−i=1∑np(xi)log2p(xi)=H(P)
其中, H ( P ) H(P) H(P) 是分布 P P P 的熵。通常情况下 P P P 代表真实的分布,其熵值为0,此时交叉熵达到最小值0。
import numpy as np
def cross_entropy(p, q):
"""
计算离散概率分布的交叉熵
"""
p = np.array(p)
q = np.array(q)
return -np.sum(p * np.log2(q))
# 示例
p = [0.2, 0.3, 0.1, 0.4]
q = [0.25, 0.25, 0.25, 0.25]
print(cross_entropy(p, q)) # 输出: 1.922