本次主要对Spark1.5.2版本MLlib机器学习中的GMM聚类算法进行源码学习。第一次做Spark的源码阅读,希望能开启阅读源码的一个头,会有很多不完善的地方,请多多指教!
Content
1.GMM(Gaussian Mixture Model)
2.Spark中GMM实现方法
3.Experiment
GMM(Guassian Mixture Model)
这一部分的学习主要通过查阅来自其他人总结的技术博客以及一些文献进行学习。
以下内容摘录总结自pluskid的漫谈clustering系列
Gaussian Mixture Model,又称GMM。从直观上讲,它实际上与K-Means十分相像,主要的不同在于K-Means的结果是某个点被分到 了某个类上,而GMM得到的结果则是某个点属于某一类的概率是多少,实际上是一种soft assignment。
它基于数据是从多个Gaussian分布中得到这样一个假设前提。每个 GMM 由K个Gaussian分布组成,每个Gaussian称为一个“Component”,这些Component线性加成在一起就组成了GMM的概率密度函数。
实际上,其中的πk就是属于某个分布的一个概率。
从文中我们知道,使用Gaussian分布这个假设是较为合理的,我的理解来说,在这个自然界中,大多数现象还是符合正太分布的,简单就是美嘛,文中也说了,任意多个Gaussian分布其实可以逼近出更加复杂的分布来。
如何使用GMM进行聚类呢?
思路:给定数据,假定它们是由GMM生成出来的,那么我们只要根据数据推出GMM的概率分布来就可以了。
GMM的K个Component实际上就对应K个cluster了。现在假设我们有个数据点,并假设它们服从某个分布(记作p(x)),现在要确定里面的一些参数的值,例如,在GMM中,我们就需要确定各个Gaussian分布的概率,每个Gaussian分布的期望和方差。这些参数。想法是找到这样一组参数,所确定的概率分布生成这些给定的数据点的概率最大,而这个概率实际上就等于 ,我们把这个乘积称作似然函数 (Likelihood Function)。通常单个点的概率都很小,许多很小的数字相乘起来在计算机里很容易造成浮点数下溢,因此我们通常会对其取对数,把乘积变成加和 ,得到log-likelihood function(对数似然函数)。接下来只要将这个函数最大化(求导并令导数等于零,然后解方程),即找到这样一组参数值,它让似然函数取得最大值,则认为这是最合适的参数,就完成了参数估计的过程。
将前述的p(x)公式带入对数似然函数,就可以得到整体似然函数的形式:
那么目标实际上就是在上述似然函数前加一个arg max。
1.估计数据由每个Component生成的概率(并不是每个Component被选中的概率):对于每个数据xi来说,它由第k个Component生成的概率为