第一次接触统计学时,我们都学过那个著名的钟形曲线——一元正态分布。记得我刚开始做数据分析时,总以为掌握了这个"万能分布"就能解决所有问题,直到遇到真实数据集中的多维变量关系,才意识到需要更强大的工具。多元正态分布就像是一元版本的"升级装备",它能同时描述多个随机变量之间的关系。
举个实际例子:假设我们要研究某地区居民的健康状况,单独看身高或体重的分布都呈现钟形曲线,但这两个指标之间存在关联(通常个子高的人体重也更重)。这时候就需要多元正态分布来刻画这两个变量的联合分布。其概率密度函数的几何形态不再是平面上的钟形曲线,而是高维空间中的"钟形曲面"。
数学上,p维随机向量X服从多元正态分布记作X∼Nₚ(μ,Σ),其中μ是均值向量(描述各维度的中心位置),Σ是协方差矩阵(刻画变量间的相关关系)。当p=1时,这个定义就退化为一元正态分布,所以多元正态确实是一元情况的自然推广。
最直观的定义方式是通过概率密度函数。对于一个p维随机向量X,其密度函数形式看起来复杂,但其实结构清晰:
python复制import numpy as np
def multivariate_normal_pdf(x, mu, sigma):
p = len(mu)
det = np.linalg.det(sigma)
inv = np.linalg.inv(sigma)
norm_const = 1.0 / ((2 * np.pi) ** (p/2) * np.sqrt(det))
exponent = -0.5 * (x - mu).T @ inv @ (x - mu)
return norm_const * np.exp(exponent)
这个公式包含三个关键部分:
多元正态分布也可以通过标准正态变量的线性变换来定义。假设我们有p个独立的标准正态变量Z₁,...,Zₚ,通过线性变换X=AZ+μ就能得到多元正态变量。这个定义在实际应用中非常有用,比如生成满足特定协方差结构的模拟数据:
python复制# 生成多元正态随机数
def generate_mvn(mu, sigma, n_samples):
p = len(mu)
L = np.linalg.cholesky(sigma) # Cholesky分解
Z = np.random.normal(size=(n_samples, p))
return Z @ L.T + mu
特征函数定义可能是最抽象的,但它能处理协方差矩阵奇异(|Σ|=0)的情况。特征函数Φ(t)=exp(itᵀμ - ½tᵀΣt)完全刻画了分布的所有矩信息。在证明分布性质时,这个定义往往最方便。
从几何角度看,多元正态分布的等概率面是p维空间中的椭球面。椭球的主轴方向由Σ的特征向量决定,轴长与特征值的平方根成正比。这个视角在异常值检测中特别有用——落在"瘦长"椭球外围的点很可能是异常点。
这是多元正态最强大的性质之一:任何线性变换后的分布仍然是多元正态。具体来说,若X∼Nₚ(μ,Σ),对于任意矩阵A和向量b,有:
AX + b ∼ N(Aμ + b, AΣAᵀ)
这个性质使得我们可以对数据进行降维操作而不破坏正态性假设。比如在主成分分析(PCA)中,我们就是用这个性质保证主成分仍然服从正态分布。
多元正态的边缘分布仍然是正态分布。假设我们将随机向量分为两部分X=(X₁,X₂),对应的分块均值向量和协方差矩阵为:
μ = [μ₁]
[μ₂]
Σ = [Σ₁₁ Σ₁₂]
[Σ₂₁ Σ₂₂]
那么X₁的边缘分布就是N(μ₁,Σ₁₁)。更精彩的是条件分布的性质:给定X₂=x₂时,X₁的条件分布仍然是正态的,其参数为:
μ₁|₂ = μ₁ + Σ₁₂Σ₂₂⁻¹(x₂ - μ₂)
Σ₁₁|₂ = Σ₁₁ - Σ₁₂Σ₂₂⁻¹Σ₂₁
这个性质在贝叶斯统计和状态估计(如卡尔曼滤波)中至关重要。
对于多元正态分布,不相关等价于独立。具体来说:
这个性质大大简化了独立性检验的复杂度。在实际数据分析中,我们常通过检验相关系数是否为零来判断变量独立性。
理论上要求Σ必须是正定矩阵,但在实际数据中经常遇到奇异矩阵。这时可以考虑:
我曾经在一个客户细分项目中,就因为没处理好协方差矩阵的奇异性导致模型崩溃。后来通过PCA先降维再建模,问题才得到解决。
验证数据是否来自多元正态分布比一元情况复杂得多。常用的方法包括:
python复制from scipy import stats
# Mardia正态性检验
def mardia_test(data):
kurtosis = stats.mstats.normaltest(data)[0]
skewness = stats.skewtest(data)[0]
return kurtosis, skewness
当变量维度p接近或超过样本量n时(即"维数灾难"),传统多元正态方法会失效。这时需要考虑:
在文本挖掘项目中,我们经常遇到数千维的词向量,这时传统的协方差估计已经不再适用,必须采用特殊处理方法。