PRML/PRMLT项目中的高斯混合模型EM算法实现解析
2025-07-07 07:13:21作者:魏侃纯Zoe
1. 算法概述
高斯混合模型(Gaussian Mixture Model, GMM)是一种强大的概率模型,常用于聚类分析和密度估计。本文分析的mixGaussEm.m文件实现了使用期望最大化(Expectation-Maximization, EM)算法来拟合高斯混合模型的核心功能。
EM算法是一种迭代优化方法,特别适用于含有隐变量的概率模型参数估计。对于高斯混合模型,EM算法通过交替执行以下两步来估计模型参数:
- E步(期望步骤):计算每个数据点属于各个高斯分量的后验概率
- M步(最大化步骤):基于E步的结果更新模型参数
2. 核心函数结构
2.1 主函数mixGaussEm
主函数接收两个输入参数:
X
:d×n的数据矩阵,d是特征维度,n是样本数量init
:初始化参数,可以是以下三种形式之一:- 标量k:指定聚类数量
- 1×n的标签向量
- 包含初始参数的结构体
函数输出包括:
label
:1×n的聚类标签向量model
:训练好的模型结构体llh
:对数似然值序列
算法流程:
- 初始化:根据输入参数初始化隶属度矩阵R
- 迭代执行EM步骤,直到收敛或达到最大迭代次数
- 返回最终结果
2.2 初始化函数initialization
该函数根据不同的初始化方式生成初始的隶属度矩阵R:
- 如果输入是模型结构体,直接计算期望
- 如果输入是标量k,随机初始化k个聚类
- 如果输入是标签向量,转换为one-hot编码形式的隶属度矩阵
2.3 期望步骤expectation
E步计算每个数据点属于各个高斯分量的后验概率:
- 计算每个高斯分量下的对数概率密度
- 加上混合权重的对数
- 使用logsumexp技巧进行归一化
- 计算对数似然值
2.4 最大化步骤maximization
M步基于当前隶属度矩阵更新模型参数:
- 计算新的混合权重w
- 计算新的均值向量mu
- 计算新的协方差矩阵Sigma
3. 关键技术细节
3.1 数值稳定性处理
代码中使用了多项技术确保数值稳定性:
- 对数域计算:在E步中,所有计算都在对数域进行,避免小数值相乘导致的数值下溢
- logsumexp技巧:用于在对数域进行概率归一化
- 协方差正则化:在计算协方差矩阵时添加一个小的对角矩阵(1e-6*I)防止奇异
3.2 聚类数量自适应
算法通过以下机制自动调整实际使用的聚类数量:
R = R(:,unique(label)); % 移除空聚类
这确保了在迭代过程中,没有数据点分配的聚类会被自动移除。
3.3 收敛判断
使用相对变化作为收敛标准:
if abs(llh(iter)-llh(iter-1)) < tol*abs(llh(iter)); break; end;
当对数似然的相对变化小于给定容差时,算法终止。
4. 高斯概率密度计算
loggausspdf
函数实现了高效的对数高斯概率密度计算:
- 使用Cholesky分解处理协方差矩阵
- 通过解三角方程组计算马氏距离
- 精心处理归一化常数
5. 实际应用建议
-
初始化策略:对于不同问题,可以尝试多种初始化方法:
- 随机初始化(k-means++)
- 基于领域知识的初始化
- 多次随机重启选择最佳结果
-
参数选择:
- 协方差矩阵的正则化系数(1e-6)可根据数据特性调整
- 最大迭代次数和收敛容差可根据问题规模调整
-
模型选择:
- 可以使用BIC或AIC准则确定最优聚类数量k
- 对于高维数据,可考虑使用对角协方差矩阵或共享协方差矩阵
6. 总结
该实现提供了高斯混合模型EM算法的一个高效、稳定的MATLAB实现,具有以下特点:
- 支持多种初始化方式
- 自动处理空聚类
- 数值稳定性良好
- 代码结构清晰,易于理解和扩展
对于希望理解或应用高斯混合模型的研究人员和工程师,这个实现提供了很好的参考价值。