Skip to content

7.3 互信息

互信息(Mutual Information)衡量两个随机变量之间的共享信息量——它是比相关系数更强大的依赖度量,能捕捉非线性关系。


定义

互信息衡量两个随机变量 XXYY 之间的共享信息量

I(X;Y)=xXyYP(x,y)logP(x,y)P(x)P(y)I(X; Y) = \sum_{x \in \mathcal{X}} \sum_{y \in \mathcal{Y}} P(x, y) \log \frac{P(x, y)}{P(x)P(y)}

等价形式

互信息可以用熵表示:

I(X;Y)=H(X)H(XY)=H(Y)H(YX)I(X; Y) = H(X) - H(X \mid Y) = H(Y) - H(Y \mid X)

  • H(X)H(X)XX 的不确定性
  • H(XY)H(X \mid Y):知道 YYXX 剩余的不确定性,条件熵的正式定义为 H(XY)=yP(y)H(XY=y)=x,yP(x,y)logP(xy)H(X \mid Y) = \sum_y P(y) H(X \mid Y=y) = -\sum_{x,y} P(x,y) \log P(x \mid y)——即给定 YYXX 的条件分布的平均不确定性
  • I(X;Y)I(X; Y):知道 YY 能减少多少对 XX 的不确定性

性质

  • I(X;Y)0I(X; Y) \ge 0,当且仅当 XXYY 独立时取等
  • I(X;Y)=I(Y;X)I(X; Y) = I(Y; X)(对称性)
  • I(X;Y)min(H(X),H(Y))I(X; Y) \le \min(H(X), H(Y))

手算实例:2×2 联合分布

考虑一个二元随机变量的联合分布 (X,Y)(X, Y)

P(x,y)P(x, y)Y=0Y=0Y=1Y=1P(X)P(X)
X=0X=00.30.30.10.10.40.4
X=1X=10.20.20.40.40.60.6
P(Y)P(Y)0.50.50.50.51.01.0

步骤 1:计算 P(x)P(y)P(x)P(y)P(x,y)/P(x)P(y)P(x,y) / P(x)P(y)

xxyyP(x,y)P(x,y)P(x)P(y)P(x)P(y)logP(x,y)P(x)P(y)\log\frac{P(x,y)}{P(x)P(y)}贡献
000.30.30.4×0.5=0.20.4 \times 0.5 = 0.2log(0.3/0.2)=0.5850\log(0.3/0.2) = 0.58500.3×0.5850=0.17550.3 \times 0.5850 = 0.1755
010.10.10.4×0.5=0.20.4 \times 0.5 = 0.2log(0.1/0.2)=1.0000\log(0.1/0.2) = -1.00000.1×(1.0000)=0.10000.1 \times (-1.0000) = -0.1000
100.20.20.6×0.5=0.30.6 \times 0.5 = 0.3log(0.2/0.3)=0.5850\log(0.2/0.3) = -0.58500.2×(0.5850)=0.11700.2 \times (-0.5850) = -0.1170
110.40.40.6×0.5=0.30.6 \times 0.5 = 0.3log(0.4/0.3)=0.4150\log(0.4/0.3) = 0.41500.4×0.4150=0.16600.4 \times 0.4150 = 0.1660

步骤 2:求和

I(X;Y)=0.17550.10000.1170+0.1660=0.1245 比特I(X; Y) = 0.1755 - 0.1000 - 0.1170 + 0.1660 = 0.1245 \text{ 比特}

XXYY 之间存在互信息——知道其中一个变量能减少约 0.1245 比特的不确定性。


Python 示例

python
import numpy as np

def mutual_information(joint):
    """计算互信息 I(X;Y)"""
    joint = np.asarray(joint)
    px = joint.sum(axis=1)  # P(X)
    py = joint.sum(axis=0)  # P(Y)
    # 外积 P(x)P(y)
    outer = np.outer(px, py)
    # 逐元素计算
    mi = np.sum(joint * np.log2((joint + 1e-15) / (outer + 1e-15)))
    return mi

joint = np.array([[0.3, 0.1], [0.2, 0.4]])
mi = mutual_information(joint)
print(f"互信息 I(X;Y) = {mi:.4f} 比特")
# 输出: 互信息 I(X;Y) = 0.1245 比特

特征选择中,互信息是比相关系数更强大的指标——它能捕捉非线性依赖。在量化因子研究中,我们计算每个候选因子与未来收益的互信息,挑选出信息含量最高的因子,而非仅仅依赖线性相关系数。

为什么互信息优于相关系数?

指标捕捉线性关系捕捉非线性关系对异常值敏感
Pearson 相关系数✅ 敏感
Spearman 秩相关系数✅(单调)❌ 较稳健
互信息✅(任意关系)❌ 较稳健

实际应用流程

  1. 对每个候选因子 fif_i 与未来收益 rt+1r_{t+1} 做离散化(分箱)
  2. 计算 I(fi;rt+1)I(f_i; r_{t+1})
  3. 按互信息从大到小排序,选取 Top-K 因子
  4. 去除高度冗余的因子(因子间互信息过高)

研究发现,在 A 股市场中,某些因子的互信息排名和线性相关系数排名存在显著差异——这意味着单纯依赖线性筛选会遗漏重要的非线性信号。 \n> 下一步:继续学习 7.4 最大熵原理与量化应用

Built with VitePress