1. 多维高斯分布:从一维到高维的优雅延伸
第一次接触多维高斯分布时,我被它完美的数学形式震撼到了。记得刚毕业那会儿做图像处理项目,需要建模像素间的空间关系,导师随手写下的那个多元正态分布公式,让我盯着推导了整整一个下午。现在想来,这正是统计学中最美妙的推广之一——将一维钟形曲线优雅地扩展到高维空间。
多维高斯分布的概率密度函数看似复杂,其实结构非常清晰:
import numpy as np
def multivariate_gaussian(x, mu, sigma):
n = len(mu)
coeff = 1/((2*np.pi)**(n/2) * np.linalg.det(sigma)**0.5)
exponent = -0.5 * (x-mu).T @ np.linalg.inv(sigma) @ (x-mu)
return coeff * np.exp(exponent)
这个公式包含三个关键部分:
- 均值向量μ:决定分布中心位置,就像GPS坐标定位数据的"重心"
- 协方差矩阵Σ:控制分布的形态和方向,是理解多维关系的核心
- 归一化系数:保证概率积分为1的调整因子
实际项目中我常用来生成测试数据。比如模拟用户画像时,用下面代码生成三维特征:
mean = [25, 50000, 3.5] # 年龄、收入、信用评分
cov = [[10, 1000, 0.3],
[1000, 1e6, 50],
[0.3, 50, 1]]
data = np.random.multivariate_normal(mean, cov, 1000)
2. 协方差矩阵:多维关系的密码本
协方差矩阵Σ是多维高斯分布的灵魂所在。去年优化推荐系统时,我们团队花了大量时间研究用户行为特征的协方差结构。这个D×D的对称矩阵藏着丰富的几何意义:
- 对角线元素是各维度的方差,决定分布沿轴向的"胖瘦"
- 非对角元素描述维度间的线性相关性,影响分布的倾斜程度
用特征分解可以直观展示其几何意义:
eigvals, eigvecs = np.linalg.eig(cov)
plt.quiver(*mean, *eigvecs[:,0]*eigvals[0], color='r', scale=10)
plt.quiver(*mean, *eigvecs[:,1]*eigvals[1], color='b', scale=10)
红色箭头显示数据变化最大的方向,蓝色箭头展示次要变化方向。在金融风控中,这种分析能帮我们发现潜在的风险关联。
3. 马氏距离:考虑相关性的智能尺子
传统欧氏距离在 correlated 数据中会失效。记得第一次用马氏距离做异常检测时,准确率直接提升了23%。其定义为:
Δ² = (x-μ)ᵀΣ⁻¹(x-μ)
Python实现对比:
# 欧氏距离
euclidean = np.sqrt(np.sum((x - mean)**2))
# 马氏距离
inv_cov = np.linalg.inv(cov)
mahalanobis = np.sqrt((x - mean).T @ inv_cov @ (x - mean))
在电商用户分析中,马氏距离能准确识别真实异常用户,避免将高消费高活跃的正常用户误判为异常。
4. 条件分布与边缘分布:高维空间的切割艺术
多维高斯分布的条件分布仍然是高斯分布,这个性质在贝叶斯建模中极其有用。去年做天气预报模型时,我们这样计算在已知温度情况下的湿度分布:
def conditional_distribution(x_a, mu, sigma, a_dims, b_dims):
mu_a = mu[a_dims]
mu_b = mu[b_dims]
sigma_aa = sigma[np.ix_(a_dims, a_dims)]
sigma_ab = sigma[np.ix_(a_dims, b_dims)]
sigma_bb = sigma[np.ix_(b_dims, b_dims)]
sigma_bb_inv = np.linalg.inv(sigma_bb)
cond_mu = mu_a + sigma_ab @ sigma_bb_inv @ (x_b - mu_b)
cond_sigma = sigma_aa - sigma_ab @ sigma_bb_inv @ sigma_ab.T
return cond_mu, cond_sigma
5. 实战应用:从理论到工业级实现
5.1 高斯混合模型(GMM)聚类
在客户分群项目中,我们用GMM处理非球形分布数据:
from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components=3, covariance_type='full')
gmm.fit(customer_data)
print(gmm.means_) # 各类别中心
print(gmm.covariances_) # 各类别协方差矩阵
covariance_type参数选择很有讲究:
- 'full': 完全协方差矩阵,灵活性最高
- 'tied': 共享相同协方差矩阵
- 'diag': 对角协方差矩阵
- 'spherical': 球形协方差
5.2 异常检测系统
构建的实时异常检测流水线包含:
class AnomalyDetector:
def __init__(self, threshold=3):
self.threshold = threshold
def fit(self, X):
self.mu = np.mean(X, axis=0)
self.sigma = np.cov(X, rowvar=False)
self.inv_sigma = np.linalg.inv(self.sigma)
def score(self, x):
delta = x - self.mu
return delta.T @ self.inv_sigma @ delta
def predict(self, X):
scores = np.array([self.score(x) for x in X])
return scores > self.threshold
实际部署时要处理数值稳定性问题,比如添加小量单位矩阵防止协方差矩阵奇异。
6. 性能优化与数值稳定性
在大数据场景下,直接计算协方差矩阵可能遇到:
- 内存不足(OOM)问题
- 矩阵求逆不稳定
解决方案包括:
# 增量计算
partial_cov = np.zeros((d,d))
for batch in data_loader:
batch_cov = np.cov(batch, rowvar=False)
partial_cov += batch_cov * batch_size
total_cov = partial_cov / total_samples
# 正则化处理
regularized_cov = cov + 1e-6 * np.eye(d)
在推荐系统特征工程中,我们开发了分块协方差计算方案,将10000维特征的矩阵计算时间从3小时缩短到15分钟。

812

被折叠的 条评论
为什么被折叠?



