3、互信息计算:离散变量与连续变量的互信息估计方法
互信息(Mutual Information, MI)衡量两个变量之间的依赖程度,是特征选择中重要的非线性相关性指标。当特征为连续型、目标为离散型(或反之)时,无法直接使用离散变量的计数公式,需要借助概率密度估计方法。本章聚焦于两种主流估计方法:直方图法与核密度估计法。
3.1 问题定义与核心挑战
给定离散变量 \( Y \)(如类别标签)与连续变量 \( X \)(如特征值),互信息定义为:
\[ I(X;Y) = \sum_{y \in Y} \int_{x} p(x,y) \log \frac{p(x,y)}{p(x)p(y)} dx \]核心挑战在于:联合概率密度 \( p(x,y) \) 和边缘密度 \( p(x) \) 未知,需要从有限样本中估计。离散变量 \( Y \) 的取值有限,可先按类别分组,再对每组内的连续变量 \( X \) 进行密度估计。
关键思路: 将连续变量离散化或使用连续密度模型,将互信息计算转化为可数值求解的形式。
3.2 直方图法(Histogram-based Estimation)
直方图法是最直观的估计方式:将连续变量 \( X \) 的取值空间划分为 \( B \) 个等宽区间(bin),统计每个区间内的样本频数,用频数比例近似概率密度。
3.2.1 计算步骤
- 划分区间: 确定区间数量 \( B \)(常用 Sturges 规则:\( B = \lceil \log_2 n + 1 \rceil \))。
- 统计频数: 对每个类别 \( y \),统计 \( X \) 落在各区间内的样本数 \( n_{y,b} \)。
- 计算概率:
- 联合概率:\( \hat{p}(y,b) = n_{y,b} / N \)
- 边缘概率:\( \hat{p}(y) = n_y / N \),\( \hat{p}(b) = n_b / N \)
- 代入公式: \[ \hat{I}(X;Y) = \sum_{y} \sum_{b=1}^{B} \hat{p}(y,b) \log \frac{\hat{p}(y,b)}{\hat{p}(y) \hat{p}(b)} \]
3.2.2 优缺点对比
| 维度 | 优势 | 劣势 |
|---|---|---|
| 计算效率 | 极快,只需一次排序和计数 | — |
| 实现难度 | 简单,无参数优化 | — |
| 估计偏差 | — | 对区间边界敏感,偏差较大 |
| 高维适用性 | — | 维度灾难,区间数指数增长 |
| 平滑性 | — | 阶梯状不连续,密度估计粗糙 |
注意: 直方图法在样本量较小或区间数选择不当时,容易产生较大估计误差。建议使用交叉验证或自适应 bin 宽度优化。
3.3 核密度估计法(Kernel Density Estimation, KDE)
KDE 使用平滑核函数代替硬边界区间,对每个样本点周围赋予连续权重,得到更光滑的概率密度估计。对于连续变量 \( X \) 在类别 \( y \) 下的条件密度:
\[ \hat{p}(x|y) = \frac{1}{n_y h} \sum_{i: y_i = y} K\left( \frac{x - x_i}{h} \right) \]其中 \( K(\cdot) \) 为核函数(常用高斯核),\( h \) 为带宽(平滑参数)。
3.3.1 计算流程
- 选择核函数: 高斯核 \( K(u) = \frac{1}{\sqrt{2\pi}} e^{-u^2/2} \) 最常用。
- 确定带宽: 使用 Silverman 规则或交叉验证选择最优 \( h \)。
- 估计密度: 对每个类别 \( y \),在 \( X \) 的采样点或网格点上计算 \( \hat{p}(x|y) \)。
- 数值积分: 使用蒙特卡洛采样或梯形法则近似积分: \[ \hat{I}(X;Y) \approx \frac{1}{M} \sum_{m=1}^{M} \log \frac{\hat{p}(x_m, y_m)}{\hat{p}(x_m) \hat{p}(y_m)} \] 其中 \( M \) 为采样点数。
3.3.2 直方图法与 KDE 对比
| 对比维度 | 直方图法 | 核密度估计法 |
|---|---|---|
| 密度平滑性 | 阶梯状,不连续 | 连续可微,光滑 |
| 参数敏感性 | 区间数 \( B \) | 带宽 \( h \) |
| 样本效率 | 低,需要较多样本 | 较高,小样本表现更好 |
| 计算复杂度 | \( O(N) \) | \( O(N^2) \)(朴素实现) |
| 高维扩展 | 困难 | 中等(可用乘积核) |
3.4 两种方法的流程对比图
下图展示了直方图法与核密度估计法在离散-连续互信息计算中的完整流程对比:
3.5 代码实现示例(Python)
以下代码展示了使用 numpy 和 scipy 实现两种方法的快速原型:
import numpy as np
from scipy.stats import gaussian_kde
from sklearn.feature_selection import mutual_info_classif
# 生成示例数据
np.random.seed(42)
X = np.random.randn(500) # 连续特征
Y = (X + 0.5 * np.random.randn(500) > 0).astype(int) # 离散标签
# ---------- 直方图法 ----------
def mi_histogram(X, Y, bins='auto'):
n = len(X)
# 按标签分组
classes = np.unique(Y)
bin_edges = np.histogram_bin_edges(X, bins=bins)
B = len(bin_edges) - 1
mi = 0.0
for y in classes:
mask = (Y == y)
n_y = np.sum(mask)
p_y = n_y / n
hist_y, _ = np.histogram(X[mask], bins=bin_edges)
for b in range(B):
n_yb = hist_y[b]
if n_yb == 0:
continue
p_yb = n_yb / n
p_b = np.sum([np.histogram(X[Y == c], bins=bin_edges)[0][b] for c in classes]) / n
if p_b == 0:
continue
mi += p_yb * np.log(p_yb / (p_y * p_b))
return mi
print(f"直方图法 MI: {mi_histogram(X, Y):.4f}")
# ---------- 核密度估计法 ----------
def mi_kde(X, Y, bandwidth='scott'):
classes = np.unique(Y)
n = len(X)
mi = 0.0
# 使用蒙特卡洛采样近似积分
n_samples = 1000
x_grid = np.linspace(X.min(), X.max(), n_samples)
dx = x_grid[1] - x_grid[0]
for y in classes:
mask = (Y == y)
n_y = np.sum(mask)
p_y = n_y / n
kde_y = gaussian_kde(X[mask], bw_method=bandwidth)
p_x_given_y = kde_y.evaluate(x_grid)
# 边缘密度 p(x)
p_x = np.zeros_like(x_grid)
for c in classes:
kde_c = gaussian_kde(X[Y == c], bw_method=bandwidth)
p_x += (np.sum(Y == c) / n) * kde_c.evaluate(x_grid)
# 数值积分
integrand = p_x_given_y * p_y * np.log(p_x_given_y * p_y / (p_x * p_y + 1e-12))
mi += np.trapz(integrand, x_grid)
return mi
print(f"KDE 法 MI: {mi_kde(X, Y):.4f}")
# ---------- sklearn 参考实现 ----------
print(f"sklearn mutual_info_classif: {mutual_info_classif(X.reshape(-1,1), Y, discrete_features=False)[0]:.4f}")
实践建议: 对于中小规模数据集(n < 5000),推荐使用 KDE 法以获得更稳定的互信息估计;对于大规模数据集,直方图法配合自适应 bin 数量是更高效的选择。sklearn 的
mutual_info_classif 内部使用 KDE 与 k-近邻混合策略,可作为快速基准。
3.6 方法选择决策指南
根据数据规模与精度需求,参考下表选择合适方法:
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 样本量 > 10000,快速筛选 | 直方图法(Sturges 规则) | 计算极快,可接受近似误差 |
| 样本量 500~5000,精度优先 | KDE 法(高斯核 + Silverman 带宽) | 密度估计平滑,偏差小 |
| 样本量 < 500,小样本 | KDE 法(交叉验证带宽) | 直方图法 bin 过少,信息损失大 |
| 高维特征(d > 5) | 直方图法(需降维后使用) | KDE 在高维下计算成本剧增 |
3.7 本章小结
- 直方图法:简单快速,适合大规模数据与初步探索,但密度估计粗糙,对 bin 数量敏感。
- 核密度估计法:平滑准确,适合中小规模数据与精度要求高的场景,但计算成本较高。
- 两种方法均需注意带宽/区间数的选择,建议结合交叉验证或启发式规则(Sturges、Silverman)确定参数。
- 在 MRM 特征选择流程中,互信息估计的准确性直接影响后续特征排序与模型性能,建议根据数据规模与计算资源权衡选择。