GMM高斯混合模型
GMM高斯混合模型原理
混合密度模型
复杂的概率密度函数可以由简单密度函数线性组合构成
GMM 是混合密度模型的一个特例,由多个高斯(正态分布)函数的组合构成
以下3点对于理解GMM模型的预测很重要
!!!重点敲黑板!!!
- 这里的是似然函数,完整表达应该是,这里的表示是第类数据,即训练GMM其实对每一类都单独学习一个GMM模型。
- 比如:在分类问题中,如10分类问题。
- 首先学习到10个不同的GMM模型(即似然函数公式);
- 通过预测样本带入似然函数公式,得到概率密度值;
- 再乘以不同类别的先验概率,得到10个对应预测样本的后验概率;
- 取这10个值里最大的所对应的类别作为这个样本的类别。
- 这一切预测都是基于贝叶斯公式:
GMM的极大似然估计(参数估计)
GMM 需要估计的参数:
对数似然函数:
- 极值点方程是复杂的超越方程组,很难直接求解
- 常用的 GMM 参数估计方法是 EM 算法
训练集和待学习参数
- 训练数据集:
- 学习参数:
存在的问题
- 只有样本 ,但不知道是由哪一个成份高斯产生的
- 令表示是由第个成份高斯产生,构造集合:
- 完整的数据集,其中为缺失的数据
EM算法
- 理解要点
!!!重点敲黑板!!!
对于,相对于武断的将每个训练样本确定为某个高斯产生的,更好的做法是计算每个样本由每个高斯产生的概率,后文的代码实现也是基于这一点的,其中为维矩阵,每行为该样本由不同高斯产生的概率,共有m个样本。
E步(Expectation)
- 隐变量的概率估计
M步(Maximize)
- 每个高斯分布参数也需要由所有样本参与估计,同时需要
- 考虑样本由不同高斯产生的概率
算法
Input: 训练集,高斯数
Output: GMM的模型参数
- 随机初始化;
- repeat
E步:公式(1)估计样本由不同高斯产生的概率;
M步:公式(2-4)重新估计模型的参数; - until 达到收敛精度
类比KMeans算法:
- E步是在已知质心位置的条件下,把各点聚类到最近的质心;
- M步是根据类内各点,调整质心位置。
实验及代码
实验内容
- 使用Python编程实现GMM算法:要求独立完成算法编程,禁止调用已有函数库或工具箱中的函数;
- 使用仿真数据测试程序的正确性:
- 两类2维各1000个训练样本;
- 每个类别的样本分别采样自包含2个分量的高斯混合模型,分别使用两个类别的训练样本学习模型化每个类别条件概率密度的GMM模型参数,并与模型的真实值比较;
- 假设两个类别的先验概率相等,使用学习到的模型参数分类测试样本数据,统计分类的正确率
- MNIST数据集测试:
- MNIST-Train-Samples.csv中包含30000个17维特征手写数字样本训练,MNIST-Train-Labels.csv中包含训练样本的标签;
- 分别使用每个数字的样本集学习该类别的GMM模型参数;
- 使用10个类别GMM模型构成的分类器,分类MNIST-Test-Samples.csv中的10000个样本,与MNIST-Test-Labels.csv的类别标记比对,计算识别的正确率;
- 尝试设置不同的GMM模型超参数—高斯数,测试不同高斯数的GMM分类器的识别正确率;
程序代码
导入库并制作工具函数
python
1 | import numpy as np |
GMM面向对象实现
python
1 | # GMM主体 |
Emu数据测试
参数估计
python
1 | train_X = pd.read_csv(r'Emu-Train-Samples.csv', header=None) |
预测
python
1 | test_X = pd.read_csv(r'Emu-Test-Samples.csv', header=None).to_numpy() |
MNIST数据集测试
python
1 | train_mnist_X = pd.read_csv(r'MNIST-Train-Samples.csv', header=None) |
遇到的问题及解决方法
- 高斯均值初始化问题:
在前几轮训练中有几次收敛到局部最优解,即有个别高斯模型重叠覆盖了同一个训练样本,或者一个高斯完全覆盖了另一个高斯的样本范围。这是由于初始化不够好导致的,起初选用的是固定选点,后续使用的是随机样本选点,更好的做法应该是使用Kmeans聚类选择初始化点。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Escapeey`Blog!
评论