2.6 多维随机变量与多元正态分布
前面的章节讨论单个随机变量。实际数据几乎总是多变量的:一次测量会同时记录长度、宽度与重量,一次调查会同时记录年龄、收入与满意度,图像的一个像素与相邻像素相关,一句话中每个词与它前后的词相关。单个变量的分布无法描述这些量之间的关联,需要把随机变量组织成向量,用联合分布刻画它们共同变化的规律。
本节从联合分布出发,依次讨论边缘分布、条件分布与独立性的多维版本;随后引入协方差矩阵与相关结构的度量,说明线性变换如何改变分布;再集中讨论多元正态分布,它是多维情形中性质最完整、应用最广泛的一族,三个高斯公式贯穿贝叶斯线性回归、卡尔曼滤波与高斯过程;最后讨论混合模型、隐变量模型与 copula,它们分别处理总体异质性与依赖结构建模这两个问题。本节使用的记号与 2.3 节一致,协方差与相关系数的定义不再重复。
2.6.1 随机向量与联合分布
联合分布函数
把
联合分布函数给出各分量同时不超过给定阈值的概率。二维情形下,落在矩形区域
这一形式说明联合分布函数不能任意构造,它需要满足与二维容斥一致的一致性条件。
联合概率质量函数与联合概率密度函数
离散情形下,联合概率质量函数(joint probability mass function)给出每个取值组合的概率:
连续情形下,联合概率密度函数(joint probability density function)通过积分给出区域概率:
密度与联合分布函数的关系为
联合分布函数把各分量的全部联合信息包含在内,是一维分布函数在多维情形的直接推广。实际建模时很少直接指定
2.6.2 边缘分布与条件分布
边缘分布
从联合分布可以得到每个分量的单独分布。对离散情形,把其他分量全部求和:
对连续情形,把其他分量积分掉:
这一操作称为边缘化(marginalization),得到的分布称为边缘分布(marginal distribution)。边缘化丢掉的是分量之间的依赖信息,它回答的是只看其中一个变量时的规律。
边缘分布的另一个含义是:联合分布决定边缘分布,边缘分布决定不了联合分布。相同的边缘分布可以对应多种依赖结构,这正是下一小节 copula 讨论的问题。用一个具体例子说明:取
条件分布
条件分布(conditional distribution)描述在部分分量取定值的条件下其余分量的分布。连续情形下由联合密度与边缘密度之商给出:
几何上,条件密度是联合密度沿直线
条件分布的期望
连续形式的贝叶斯公式
把条件密度的定义式移项并交换
形式与 2.1 节的贝叶斯公式完全一致,分母由全概率公式的连续版本给出。这一写法是贝叶斯推断的基本框架:把感兴趣的参数
import numpy as np
from scipy import stats
# 二维正态的条件分布:先构造协方差矩阵,再比较条件分布的解析解与模拟结果
rho = 0.7
Sigma = np.array([[1.0, rho], [rho, 1.0]])
rng = np.random.default_rng(6)
sample = rng.multivariate_normal([0, 0], Sigma, size=400_000)
x0 = 1.0
# 条件均值为 rho * x0,条件方差为 1 - rho^2
cond_mean = rho * x0
cond_var = 1 - rho ** 2
selected = sample[np.abs(sample[:, 0] - x0) < 0.01][:, 1]
print(f"条件均值:模拟 {selected.mean():.4f},理论 {cond_mean:.4f}")
print(f"条件方差:模拟 {selected.var():.4f},理论 {cond_var:.4f}")2.6.3 独立性与条件独立
随机变量独立
随机变量
连续情形下的独立还要求支撑区域是各分量支撑的乘积。这一条件容易被忽略:若
三种依赖结构
条件独立在多维情形中的地位与独立同样重要。用三个变量构成的结构可以把条件独立与边际独立的关系说清楚:
共因结构(
链式结构(
对撞结构(
三种结构的差别决定了一条实用规则:控制共因与链式结构的中间变量可以消除关联,控制对撞变量反而引入关联。2.8 节的 d-分离准则与 2.14 节的因果推断都以这条规则为基础。
2.6.4 联合矩与相关结构
协方差矩阵与相关矩阵
偏相关
两个变量可能与第三个变量同时相关,扣除共同部分后才能看清它们的直接关联。偏相关(partial correlation)给出这一度量。对三个变量
若某房屋的面积
这一公式说明了精度矩阵的作用:
import numpy as np
# 一个三变量协方差矩阵,X 与 Y 的关联完全由 Z 传递
Sigma = np.array([
[1.0, 0.30, 0.60],
[0.30, 1.0, 0.45],
[0.60, 0.45, 1.0],
])
def partial_corr(S, i, j):
P = np.linalg.inv(S)
return -P[i, j] / np.sqrt(P[i, i] * P[j, j])
r_xy = Sigma[0, 1] / np.sqrt(Sigma[0, 0] * Sigma[1, 1])
print(f"X 与 Y 的边际相关 = {r_xy:.4f}")
print(f"X 与 Y 的偏相关 = {partial_corr(Sigma, 0, 1):.4f}") # 明显小于边际相关
print(f"逆矩阵非对角元素 = {np.round(np.linalg.inv(Sigma)[0, 1], 4)}")复相关、多重相关与典型相关
多重相关(multiple correlation)度量一个变量与一组变量的联合关联强度,取值在
典型相关分析在跨模态数据处理中常用,例如把一组视觉特征与一组文本特征分别投影到低维空间后最大化相关,寻找两种模态之间的公共结构。计算归结为对
2.6.5 线性变换与仿射变换
均值与协方差的变换公式
设
协方差矩阵的变换为
两条公式不需要任何分布假设,只用到期望的线性性。
线性变换的三种典型作用
同样的公式在不同
结合线性代数部分的结果,
连续情形的密度变换
若
2.2 节已在单个变量的情形给出这一公式,多维版本多出的只是雅可比矩阵的行列式。行列式绝对值度量变换对体积的局部缩放,出现在分母上起补偿作用,使变换后的密度仍积分为
import numpy as np
rng = np.random.default_rng(12)
Sigma = np.array([[2.0, 0.8], [0.8, 1.0]])
X = rng.multivariate_normal([1.0, -1.0], Sigma, size=200_000)
A = np.array([[1.5, 0.0], [-0.5, 2.0]])
b = np.array([0.5, 1.0])
Y = X @ A.T + b
print(f"变换后均值:模拟 {np.round(Y.mean(axis=0), 4)},理论 {np.round(A @ np.array([1.0, -1.0]) + b, 4)}")
print(f"变换后协方差:\n{np.round(np.cov(Y.T), 4)}")
print(f"理论值:\n{np.round(A @ Sigma @ A.T, 4)}")2.6.6 多元正态分布
定义与密度
多元正态分布(multivariate normal distribution)由均值向量
指数中的二次型
称为马哈拉诺比斯距离(Mahalanobis distance)的平方。它用协方差矩阵的逆做加权,把不同方向的尺度差异消除,于是等密度面是椭球:
二次型的分布
若
这一结论把多元正态与卡方分布联系起来,用于构造椭圆置信域与异常检测的判据:把马氏距离平方与
四条核心性质
性质 1(线性变换封闭):
性质 2(边缘分布为正态):任取若干分量组成的子向量仍服从多元正态,参数由
性质 3(条件分布为正态):在给定部分分量取值的条件下,其余分量服从正态分布,参数由高斯条件公式给出。
性质 4(不相关等价于独立):多元正态中
2.6.7 高斯边缘、条件与乘积公式
把随机向量按
三个公式给出分块情形下的运算结果。
边缘公式:直接取子块,
条件公式:
条件均值是
乘积公式:两个关于同一变量的正态密度相乘,结果仍是正态密度,
其中
精度矩阵相加、精度加权的均值取组合,是这条公式的简洁表达。三个公式的联系在贝叶斯推断中体现得最清楚:先验
import numpy as np
# 条件公式的矩阵实现
mu = np.array([1.0, 2.0, -1.0])
Sigma = np.array([
[2.0, 0.6, 0.3],
[0.6, 1.5, 0.4],
[0.3, 0.4, 1.0],
])
def gaussian_conditional(mu, Sigma, idx_a, idx_b, x_b):
"""给定下标集合 b 的取值,返回下标集合 a 的条件均值与条件协方差"""
S_aa = Sigma[np.ix_(idx_a, idx_a)]
S_ab = Sigma[np.ix_(idx_a, idx_b)]
S_bb = Sigma[np.ix_(idx_b, idx_b)]
cond_mean = mu[idx_a] + S_ab @ np.linalg.solve(S_bb, x_b - mu[idx_b])
cond_cov = S_aa - S_ab @ np.linalg.solve(S_bb, Sigma[np.ix_(idx_b, idx_a)])
return cond_mean, cond_cov
cm, cc = gaussian_conditional(mu, Sigma, [0], [1, 2], np.array([2.5, 0.0]))
print(f"条件均值 = {cm[0]:.4f}")
print(f"条件方差 = {cc[0, 0]:.4f}")
# 模拟验证
rng = np.random.default_rng(18)
s = rng.multivariate_normal(mu, Sigma, size=500_000)
mask = (np.abs(s[:, 1] - 2.5) < 0.02) & (np.abs(s[:, 2]) < 0.02)
print(f"模拟条件均值 = {s[mask][:, 0].mean():.4f},条件方差 = {s[mask][:, 0].var():.4f}")2.6.8 混合模型与隐变量模型
混合分布与高斯混合模型
混合模型(mixture model)把总体看成若干子总体的加权组合,密度为
分量取高斯分布时得到高斯混合模型(Gaussian mixture model,GMM):
参数包括权重
隐变量视角与 EM 算法
混合模型可以写成两层的生成过程:先按权重抽取分量标签
参数估计遇到困难的原因就在这里:对数似然为
import numpy as np
from scipy import stats
# 一维高斯混合:三个分量的加权密度与采样
weights = np.array([0.5, 0.3, 0.2])
mus = np.array([-2.0, 1.0, 4.0])
sigmas = np.array([0.6, 0.9, 0.5])
rng = np.random.default_rng(21)
n = 20_000
z = rng.choice(len(weights), size=n, p=weights)
x = rng.normal(mus[z], sigmas[z])
def mixture_pdf(x, weights, mus, sigmas):
return sum(w * stats.norm(mu, s).pdf(x) for w, mu, s in zip(weights, mus, sigmas))
grid = np.array([-2.0, 0.0, 2.0, 4.0])
print("模拟直方图高度与理论密度对照")
hist, edges = np.histogram(x, bins=40, density=True)
centers = 0.5 * (edges[:-1] + edges[1:])
for g in grid:
j = np.argmin(np.abs(centers - g))
print(f" x = {g:5.1f}:直方图 {hist[j]:.4f},理论 {mixture_pdf(g, weights, mus, sigmas):.4f}")因子模型、概率主成分分析与独立成分分析
隐变量的另一种用法是把高维观测表示为少数潜在因子的线性组合:
概率主成分分析(probabilistic PCA)是
2.6.9 copula 与依赖结构
Sklar 定理
边缘分布与依赖结构是两件可以分开处理的事。Sklar 定理把这一直觉形式化:任意联合分布函数
其中
连续情形下对两边求导得到密度分解:
其中
常用 copula
高斯 copula 由多元正态的相关矩阵构造:
它用相关系数矩阵编码依赖,尾部没有额外的相依结构,适合描述中心区域的关联。t copula 在变换中使用 t 分布,能刻画尾部同步出现的倾向,风险建模中常用。阿基米德 copula 族(Clayton、Gumbel、Frank 等)由生成函数构造,形式简单、参数少,适合描述单一方向的尾部依赖。藤 copula(vine copula)把高维依赖分解为一系列二元 copula 的层次结构,按树的顺序逐层指定条件依赖,参数量随维数线性增长,是当前高维依赖建模的常用框架。
import numpy as np
from scipy import stats
rng = np.random.default_rng(24)
n = 50_000
R = np.array([[1.0, 0.75], [0.75, 1.0]])
# 高斯 copula 采样:先生成相关正态,再逐分量做概率积分变换
z = rng.multivariate_normal([0, 0], R, size=n)
u = stats.norm.cdf(z)
# 施加任意边缘分布:这里用指数与对数正态
x1 = stats.expon(scale=2.0).ppf(u[:, 0])
x2 = stats.lognorm(s=0.8).ppf(u[:, 1])
print(f"变换后 X1 的均值 = {x1.mean():.4f},理论值 = {2.0:.4f}")
print(f"变换后 X2 的均值 = {x2.mean():.4f},理论值 = {np.exp(0.8**2/2):.4f}")
print(f"变换后秩相关 = {stats.spearmanr(x1, x2).statistic:.4f}") # 接近 0.75 附近的单调关联2.6.10 本节小结
从联合分布到依赖结构
本节把一维的分布语言扩展到随机向量。联合分布包含全部分量之间的依赖信息,边缘化与条件化是两个方向的操作:前者丢掉依赖、得到单个分量的规律,后者固定部分分量、得到其余分量的条件分布,回归函数与贝叶斯推断都建立在这一操作上。独立性与条件独立在多维情形中的差别由共因、链式与对撞三种结构刻画,控制对撞变量会引入关联这一结论在变量选择与因果推断中反复出现。协方差矩阵与相关矩阵度量二阶关联,精度矩阵度量条件关联,偏相关与典型相关把关联分析扩展到控制其他变量与两组变量的情形。多元正态分布性质完整:线性变换封闭、边缘与条件分布仍为正态、不相关等价于独立,高斯边缘、条件与乘积三个公式贯穿贝叶斯线性回归、卡尔曼滤波与高斯过程。混合模型与隐变量模型用低维潜在结构解释高维观测,copula 把边缘分布与依赖结构分离,两者分别处理总体异质性与依赖形态的建模问题。
到这里,概率论的基础工具已经齐备:事件与条件概率、随机变量与分布、数字特征、常见分布族、多维结构与依赖,以及下一节的极限定理。剩下的问题是一个实用问题:这些工具在样本量有限时表现如何,误差以什么速度收敛,能否在不知道具体分布的情况下给出可靠的概率界。下一节讨论收敛模式、大数定律、中心极限定理与集中不等式,把前面各节的结果组织成一套关于大样本行为与误差控制的结论。
练习题
第 1 题 概念推导
设二元正态
请写出
参考答案
由条件公式,
条件均值的斜率为
条件方差为
第 2 题 计算推理
某电商平台记录两个指标:页面停留时间
参考答案
条件均值:
条件方差:
条件标准差为
下单金额
注意这里用中位数而不是均值。对数正态的均值需要
第 3 题 代码验证
用模拟验证多元正态的两条性质:其一,对
参考答案
import numpy as np
from scipy import stats
rng = np.random.default_rng(33)
mu = np.array([1.0, -2.0])
Sigma = np.array([[1.5, 0.5], [0.5, 2.0]])
n = 300_000
X = rng.multivariate_normal(mu, Sigma, size=n)
# 线性变换
A = np.array([[2.0, 1.0], [0.0, -1.5]])
b = np.array([0.5, 0.0])
Y = X @ A.T + b
print("变换后均值(模拟/理论):",
np.round(Y.mean(axis=0), 4), np.round(A @ mu + b, 4))
print("变换后协方差(模拟):\n", np.round(np.cov(Y.T), 4))
print("理论值:\n", np.round(A @ Sigma @ A.T, 4))
# 马氏距离平方的分布
d2 = np.einsum("ij,jk,ik->i", X - mu, np.linalg.inv(Sigma), X - mu)
print(f"马氏距离平方的均值 = {d2.mean():.4f},χ²(2) 的均值 = 2")
print(f"95% 分位数:模拟 {np.percentile(d2, 95):.4f},理论 {stats.chi2(2).ppf(0.95):.4f}")
# 高斯 copula
R = np.array([[1.0, 0.7], [0.7, 1.0]])
z = rng.multivariate_normal([0, 0], R, size=n)
u = stats.norm.cdf(z)
x1 = stats.expon(scale=1.0).ppf(u[:, 0])
x2 = stats.lognorm(s=0.5).ppf(u[:, 1])
print(f"X1 均值 = {x1.mean():.4f}(理论 1),X2 均值 = {x2.mean():.4f}(理论 {np.exp(0.125):.4f})")
print(f"X1 与 X2 的 Kendall 相关系数 = {stats.kendalltau(x1, x2).statistic:.4f}")线性变换的均值与协方差与理论值一致,说明两个公式只依赖二阶矩,不需要正态假设;马氏距离平方的分位数与卡方分布吻合,验证了二次型的分布结论。copula 部分说明依赖结构与边缘分布可以分别设定:两个变量的边缘改为指数与对数正态后,关联强度由正态部分的相关矩阵决定。
第 4 题 综合应用
某推荐系统需要衡量用户特征与物品特征之间的关联。已知两组特征向量分别服从
参考答案
要解决的问题:两组变量之间的关联无法用单个相关系数概括。逐对计算
求解思路:寻找线性组合
最大。对
最优值与最优向量由
优势:典型相关把两组的关联压缩为若干个典型相关系数,每一对给出一个独立的关联方向,且第一个系数给出线性关联强度的上界,任何单个变量对的相关系数都不会超过它。这一性质使它在跨模态检索、多视角学习与特征融合中作为关联度量使用。
常见错误
错误 1 · 由边缘分布推测联合分布
原因:边缘分布不包含依赖信息,相同的边缘可以对应完全不同的依赖结构。两个标准正态变量既可以完全正相关、完全负相关,也可以独立,甚至构造出尾部相依而中心独立的 copula 结构,四种情形下的边缘分布完全相同。
解决:需要依赖信息时必须指定联合分布或 copula。从数据出发时,先估计边缘分布与秩相关,再选择能容纳该依赖形态的 copula 族;检验依赖结构时避免使用只能度量线性关联的统计量。
错误 2 · 把不相关当作独立
原因:相关系数度量的是线性关联。
解决:判断独立性时用定义检查联合密度能否分解,或使用能捕捉非线性依赖的度量,如距离相关、互信息、基于秩的独立性检验。只有在确认联合正态之后,才可以把相关系数为零读作独立。
错误 3 · 控制对撞变量后误读关联
原因:对撞结构下端点的两个变量边际独立,条件化后反而出现关联。在数据分析中把对撞变量当作混杂变量放进回归,会人为引入关联,甚至反转原有关系。这类偏倚与 2.14 节讨论的因果推断问题同源。
解决:把变量放入模型前先想清楚它在依赖结构中的位置。用因果图或结构假设画出变量之间的方向,判断待控制的变量是否为对撞节点;无法确定方向时,报告控制与不控制两种情形下的结果,说明结论对变量选择方式的敏感性。
错误 4 · 混淆协方差矩阵与精度矩阵的非对角元
原因:协方差矩阵的非对角元度量边际关联,精度矩阵的非对角元度量条件关联,两者数值与含义都不同。把
解决:报告边际关联时用