如何简单易懂的解释高斯混合(GMM)模型?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何简单易懂的解释高斯混合(GMM)模型?相关的知识,希望对你有一定的参考价值。

参考技术A 网上太多讲解例子,反而看的人云里雾里,我用自己的理解,旨在用最少的公式,用最短的时间来理解GMM。讲解不足之处,还望指正。

1.概述

高斯混合模型给出了一些点被分配到每个簇(Cluster)的概率,给出这些点的概率分布有何用呢?它表征了算法对结果的把握程度。如何理解呢,训练后的模型输出不再是一个具体值,不再是唯一决策函数y=f(x)作用后的唯一值,而是一系列概率值。举个例子,数据点集或者点云中的某一点,比如红色和蓝色簇边缘的那些点,既有可能属于蓝色簇,也有可能属于红色簇。函数作用后,分配到某一概率只是一个概率情况。点云的输出聚类情况,本来就是用来给控制模块去决策,输出不同簇的概率分布情况后,由后续控制模块通过融合其他诸如camera的识别概率来决策。

2.单高斯模型还是高斯混合模型

单高斯模型是指,数据集内分布的点,只有一个高斯分布即可覆盖。遵从如下概率分布函数,

这是最简单最理想的情况,实际情况却是,空间中一组点云,不可能一组高斯分布就能覆盖的,那么就需要多组高斯分布,混合高斯分布即由之而来,点在空间有疏有稀,不同高斯分布权重也不能一样,但所有权重值之和等于1,也就是下式中的ak。为什么权重之和为1呢,因为它本质还是一个概率密度分布函数,概率密度函数是指在概率密度曲线下方的面积,因此必然为1。

3.什么是隐变量?

通俗理解,假如有一组点集,我们分类之前是知道有5个点a.b.c.d.e的,又知道任意一点肯定是属于A.B.C三类的中的一类的,但是又不知道a点究竟属于哪个类。这就是隐变量。

4.有隐变量如何求最佳模型参数?

用最大似然估计法(MLE)求最大期望,也就是EM算法。网上有很多例子解释,最直观的就是掷硬币的例子,两枚硬币连掷五次,统计五次内正反的概率。(参考:如何感性地理解EM算法?)

核心思想就是,

(1)随机初始化一组参数θ0

(2)根据观测数据,和当前参数θ,求得未观测数据z的后验概率的期望

(3)求得的z有可能不是最优,根据最大似然法求最优的θ

(4)重复第二三步,直到收敛

其中第二步叫做求期望,E步,第三步叫做求最大化,M步,合起来就是EM算法。

用向两个盘子盛菜举例来类比EM算法,食堂大厨炒了一个菜,分成两个盘子盛菜。大厨盛菜,看哪个盘子菜多,就把这个盘子菜向另外一个匀匀,直到多次重复,达到两个盘子的菜量大致一样的过程,然后端出去售卖。

大厨刚开始给两个盘都倒了菜,这就是赋初值,但是手感不好,一个多一个少。E步就是给两个盘子匀菜,M步最终迭代后,两个盘达到了均匀。无论赋初值多少,你会发现你去食堂买菜,相同菜品拿哪个盘子似乎菜量都是一样的。

非常直观,很容易理解。

5 如何求最大化似然概率?

单高斯比较好求,由高中数学知识可知道,函数求导,导数等于0的地方就是极值点所在。

那么混合高斯函数呢?

上式log里面有求和∑,这是我们不喜欢的,log里面我们喜欢的是乘除,最困难的地方也是最不好理解的地方出现了。

如何求解?只能通过通过迭代的方法进行求解,怎么求,Jensen不等式。我贴一下图方便理解。

从上图可以看到,curve曲线上的点一定小于切线(也就是求导数)的点。于是下式就成立了。我们就把和的对数,变成了对数的和,那么求导就变得容易多了。

Jesen不等式,相当于应用在凹函数上,不等号的方向反向了。

最后求得新一轮的迭代模型参数为下面:

当|θ-θ|<ε收敛后,至此我们就找到了所有的高斯混合模型的参数。

如何用 Java 编写 GMM(高斯混合模型)?

【中文标题】如何用 Java 编写 GMM(高斯混合模型)?【英文标题】:How can I write GMM (Gaussian Mixture Model) in Java? 【发布时间】:2011-09-07 09:04:00 【问题描述】:

如何用 Java 编写 GMM (Gaussian mixture model)? MATLAB 中有一些实现,但我正在寻找一些关于它的文档和 Java 中的示例代码。

PS:如果可能,我如何在我的代码中采用 Weka 实现?

PS 2:我找到了http://www.lix.polytechnique.fr/~nielsen/MEF/ GMM 的源代码在哪里,所以我可以在我的代码中采用它?

PS 3: 找到的其他代码是:http://www.dii.unisi.it/~freno/JProGraM.html,但是如何采用还是有问题。我应该给出我的输入列表并从算法中获取所有分类元素列表。

【问题讨论】:

两个链接都(有效地)损坏了(第一个手动 GitHub 链接(两个相同的 URL)重定向到 404,第二个导致 “禁止访问。您没有访问权限这个资源。”) 【参考方案1】:

Weka 是可以进行 GMM 的 Java 数据挖掘软件。它还有一个不错的 GUI,您可以在其中进行一些初步建模,然后再使用 Java 进行所有操作。

【讨论】:

你可以下载 WEKA 的源 jars 并在你自己的代码中使用不同的模型:) 你能找到GMM Weka包的链接吗? 您想使用 EM 生成 GMM,所以:weka.sourceforge.net/doc/weka/clusterers/EM.html 这是一个让您入门的示例:weka.wikispaces.com/Programmatic+Use。请注意,现在不推荐使用 FastVector,因此对于此示例,您宁愿使用 java.util.ArrayList。此外,由于 Instance 现在是一个接口,因此您必须使用一些实现类(如 DenseInstance 或 SparseInstance)进行实例化。该示例需要更新:p【参考方案2】:

您可以使用"MATLAB Builder JA" 从“MATLAB 中的实现”中获取“.JAR”文件和源代码。像这样,您可以将结果合并到您的 Java 应用程序中。

【讨论】:

【参考方案3】:

我是 jMEF 的作者 :) jMEF 将允许您创建、处理和管理指数族的混合物,当然包括 GMM。您基本上必须创建基于高斯分布的混合模型。我写了一堆教程来帮助理解如何正确使用它。这很简单。好处是您可以使用 EM 算法从样本中估计您的混合物。

【讨论】:

它的新网址是什么?在 GitHub 还是其他地方?

以上是关于如何简单易懂的解释高斯混合(GMM)模型?的主要内容,如果未能解决你的问题,请参考以下文章

高斯混合模型 GMM 的详细解释

高斯混合模型(GMM)

单高斯模型SGM & 高斯混合模型GMM

高斯混合模型(GMM)和EM算法

高斯混合模型GMM核心参数高斯混合模型GMM的数学形式

05 EM算法 - 高斯混合模型 - GMM