- 多维高斯分布是一种特殊的多维随机分布,应用非常广泛,很多现实问题的原始特征分布都可以看作多维高斯分布。本文以数据特征服从多维高斯分布的多分类任务这一理想场景为例,从理论层面分析数据特征和分类问题难度的关系
- 注意,本文分析不涉及算法层面,仅仅是对数据特征的分析,实用意义不强,纯机器学习层面可能只对特征挖掘有点作用,工程层面可以指导探测器设计。本文主旨在于借助这个场景说明多维高斯分布的信息熵和KL散度计算方法
- 关于信息熵和KL散度(相对熵)的详细说明参考:信息论概念详细梳理:信息量、信息熵、条件熵、互信息、交叉熵、KL散度、JS散度
文章目录
- 0. 场景
- 1. 多维高斯分布
- 2. 多维高斯分布的信息熵
- 3. 两个多维高斯分布之间的相对熵(KL散度)
- 4 总结
0. 场景
- 考虑一般的多分类机器学习场景:设目标识别算法的原始输入为 ,定义为 维随机向量 ,设检测目标类别数为
- 进一步假设 是多维高斯分布,这意味着原始观测中每个维度都服从高斯分布。当 时,多维随机变量 沿维度 和 的边缘分布示意图如下,使用不同颜色代表不同类别数据
绘图代码供参考:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
# 高斯分布参数,f0和f1两个维度
means_2d = [(0, 0), (2, 3), (4, 2), (6, 5)]
covariances = [
np.array([[0.35, 0.05],
[0.05, 0.35]]),
np.array([[0.75, 0.5],
[0.5, 0.75]]),
np.array([[0.2, 0.1],
[0.1, 0.2]]),
np.array([[1.25, -0.4],
[-0.4, 1.25]])
]
colors = ['blue', 'green', 'red', 'purple']
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 8))
# 绘制沿f0的的边缘分布
means_1d = [m[0] for m in means_2d]
std_devs = [c[0,0].item() for c in covariances]
# 概率密度曲线
x = np.linspace(-2, 10, 1000)
for i, (mean, std_dev, color) in enumerate(zip(means_1d, std_devs, colors)):
y = (1/(std_dev * np.sqrt(2 * np.pi))) * np.exp(-0.5 * ((x - mean) / std_dev)**2)
ax1.plot(x, y, color=color, label=f'Class {i}')
# 抽样样本用竖线表示
for mean, std_dev, color in zip(means_1d, std_devs, colors):
samples = np.random.normal(mean, std_dev, 20)
ax1.vlines(samples, ymin=0, ymax=(1/(std_dev * np.sqrt(2 * np.pi))) * np.exp(-0.5 * ((samples - mean) / std_dev)**2), color=color, linestyle='-', alpha=0.2)
# 图例和标题
ax1.legend()
ax1.set_title('Distribution of raw observation along feature $f_0$')
ax1.set_xlabel('$f_0$')
ax1.set_ylabel('Probability Density')
# 绘制沿f0和f1的的二维边缘分布
for mean, cov, color in zip(means_2d, covariances, colors):
eigenvalues, eigenvectors = np.linalg.eigh(cov)
order = eigenvalues.argsort()[::-1]
eigenvalues, eigenvectors = eigenvalues[order], eigenvectors[:, order]
angle = np.degrees(np.arctan2(*eigenvectors[:, 0][::-1]))
width, height = 3 * np.sqrt(eigenvalues)
ell = Ellipse(xy=mean, width=width, height=height, angle=angle, color=color, alpha=0.2)
ax2.add_artist(ell)
# 抽样样本用点表示
for i, (mean, cov, color) in enumerate(zip(means_2d, covariances, colors)):
samples = np.random.multivariate_normal(mean, cov, 100)
ax2.scatter(samples[:, 0], samples[:, 1], color=color, s=4, label=f'Class {i}')
# 添加图例和标题
ax2.legend()
ax2.set_title('Distribution of raw observation along feature $f_0$ & $f_1$')
ax2.set_xlabel('$f_0$')
ax2.set_ylabel('$f_1$')
# 显示图形
plt.tight_layout()
plt.show()
- 注意图示为原始输入数据 的样本分布情况,识别算法从中提取特征用于分类。注意到
- 数据 (分布 )的集中程度描述了第 。分布越集中,说明探测系统对第
- 不同数据 和 (分布 和 。两类数据距离越大则差异越强,越容易区分。反之,若两类数据的原始数据分布有重叠(如 ),则理论上重叠部分的样本所属类别无法准确区分
- 为最大化识别准确率,从两方面考虑(以下准则可以用来指导探测器设计)
- 增大类内特征强度(同类数据尽量集中),形式化表示为最小化每一类数据分布信息熵的总和
- 增大类间特征差异(不同类数据尽量远离),形式化表示为最大化每一组数据分布相对熵(KL散度)的总和。值得注意的是,由于KL散度不对称,无法直接作为度量,这里还需要一些trick
1. 多维高斯分布
- 设原始输入为 ,定义为 维随机向量 ,设检测目标类别数为 ,第 类目标的原始观测输入服从多维高斯分布,即:
称随机向量 服从期望为 ,协方差矩阵为 的多维正态分布,记为 。其中 为协方差矩阵: - 显然 是实对称矩阵,通常情况下是正定矩阵(只要 不为常数,其任意阶顺序主子式 > 0)。这种矩阵有一些良好性质,列举一些以便后续计算
- 奇异值分解(SVD分解)结果和特征值分解(谱分解)一致,即有
其中 是正交矩阵, 是对角阵且对角线上的元素是正的(正定矩阵),这意味着 可以如下开方:
且
- 多维高斯分布有以下基本统计量(期望、方差、二阶矩)
其中二阶矩就是普通随机变量常见结论
2. 多维高斯分布的信息熵
- 设第 类目标原始观测的分布 ,计算其信息熵
最后一项的展开需要借助马哈拉诺比斯变换
:对于任意服从多维高斯分布的随机向量 , 有随机向量 是标准高斯分布,即 ,注意到
故有 - 综上所述,有
3. 两个多维高斯分布之间的相对熵(KL散度)
- 下面计算第 类和第 类目标原始观测的分布 之间的相对熵:
展开其中第二项:
进一步展开其中最后一项:
注意到 时上式等于 ,退化到式 (2.4) - 综上所述,有
- 根据定义,KL 散度是非对称的,因此不能当作一个度量使用,为了使其称为有效度量,对于任意分布 ,交互顺序计算两次 KL 散度,求和作为二者距离的度量,即
4 总结
- 最后,把结论式 (2.4) 和 (3.5) 回带第0节的优化目标中,引入优化协调系数 ,我们要最大化
当任意第 类目标原始观测分布 为各项独立高斯分布时,有 是对角矩阵,设为 ,上式可表示为 - 直观理解:
- :本项中 ,故此处希望每个分布 的协方差矩阵行列式尽量小。协方差矩阵行列式的值反映了数据分布的总体不确定性,行列式越小,表示数据在各个维度上的分布越集中
- :矩阵的迹等于矩阵特征值之和,特征值代表线性变换对空间的拉伸程度,因此迹反映了线性变换对空间的拉伸和压缩的总量。 可以看作对空间连续施加两个线性变换, 时对空间没有变换,此项取得最小,反之二者对空间每一维度拉伸和压缩程度差异越大(特征值比例越大)时,此项越大。故此项意味着不同分布的散布特性应尽量不同
- :本项表示均值向量之间的差异,权重由协方差矩阵的逆矩阵决定。它衡量了均值向量之间的方差加权距离