在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: 
     (1)K-means 
     (2)Latent Dirichlet allocation (LDA) 
     (3)Bisecting k-means(二分k均值算法) 
     (4)Gaussian Mixture Model (GMM)。 
       基于RDD API的MLLib中,共有六种聚类方法: 
     (1)K-means 
     (2)Gaussian mixture 
     (3)Power iteration clustering (PIC) 
     (4)Latent Dirichlet allocation (LDA)** 
     (5)Bisecting k-means 
     (6)Streaming k-means 
       多了Power iteration clustering (PIC)和Streaming k-means两种。 
       本文将介绍其中的一种高斯混合模型 ,Gaussian Mixture Model (GMM)。其它方法在我的Spark机器学习系列里面,都会介绍。

       混合模型:通过密度函数的线性合并来表示未知模型

      对于下面图(a)观测数据,单一的高斯概率分布函数(一个椭圆)无法表达,仔细看图(a)近似包含三个椭圆,所以可以将三个高斯概率分布函数线性组合起来,各个函数有不同的参数i。线性组合

Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)

这样就能计算所有样本出现的概率了。图(b)已经明确了样本分类。 
Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM) 

http://www.cnblogs.com/itboys/p/8400044.html.

EM算法模型参数估计

x出现总的概率是0.12+0.045+0.006=0.1656

)产生的可能性0.006/0.1656=0.0362。

Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM) 
K个高斯函数组合而来的,即 

Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)

K.

k个component产生的概率为 

Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)

i,所以可以认为第k个component产生了如下的数据: 

而由于每个 Component 都是一个标准的 Gaussian 分布,可以很容易分布求出最大似然所对应的参数值: 

 这样就完成了参数的更新,重复E步骤进行下一次迭代,直到算法收敛。

模型参数K设置及聚类结果评估

      大家可能会想到,上图(a)中的数据分布太具有实验性质了,实际中那有这样的数据,但GMM牛逼的地方就在于通过增加 Model 的个数(也就是组成成分的数量K,其实就是我们的分类个数),可以任意地逼近任何连续的概率密分布。所以呢,理论上是绝对支持的,而实际上呢,对于多维特征数据我们往往难以可视化,所以难把握的地方也就在这里,如何选取K 值?换句化说聚类(无监督分类)拿什么标准如何评估模型的好坏?因为如果对结果有好评价指标的话,那么我们就可以实验不同的K,选出最优的那个K就好了,到底有没有呢? 
      这个话题又比较长,有人认为聚类的评估一定要做预先标注,没有Index总是让人觉得不靠谱,不是很让人信服。但是也有不同学者提出了大量的评估方法,主要是考虑到不同聚类算法的目标函数相差很大,有些是基于距离的,比如k-means,有些是假设先验分布的,比如GMM,LDA,有些是带有图聚类和谱分析性质的,比如谱聚类,还有些是基于密度的,所以难以拿出一个统一的评估方法,但是正是有这么些个原理上的不同,记着不与算法本身的原理因果颠倒的情况下,那么针对各类方法还是可以提出有针对性的评价指标的,如k-means的均方根误差。其实更应该嵌入到问题中进行评价,很多实际问题中,聚类仅仅是其中的一步,可以对比不聚类的情形(比如人为分割、随机分割数据集等等),所以这时候我们评价『聚类结果好坏』,其实是在评价『聚类是否能对最终结果有好的影响』。(本部分来综合了知乎上的部分问答:如有不妥之处,敬请告知。http://www.zhihu.com/question/19635522) 
      关于聚类的评估问题,我计划再写另外一篇文章《Spark聚类结果评估浅析》,不知道能否写好。 
CSDN上还有文章可参考: 聚类算法初探(七)聚类分析的效果评测 http://blog.csdn.net/itplus/article/details/10322361

//训练模型
val gmm=new GaussianMixture().setK(2).setMaxIter(100).setSeed(1L)
val model=gmm.fit(dataset)

//输出model参数
for(i<-0 until model.getK){
      println("weight=%f\nmu=%s\nsigma=\n%s\n" format(model.weights(i), model.gaussians(i).mean, model.gaussians(i).cov))
      //weight是各组成成分的权重
      //nsigma是样本协方差矩阵
      //mu(mean)是各类质点位置      

参考文献: 
(1)混合高斯模型算法http://www.cnblogs.com/CBDoctor/archive/2011/11/06/2236286.html 
(2) 聚类算法初探(七)聚类分析的效果评测 http://blog.csdn.net/itplus/article/details/10322361 
(3)知乎 http://www.zhihu.com/question/19635522 
(4)Rachel-Zhang的CSDN博客GMM的EM算法实现 http://blog.csdn.net/abcjennifer/article/details/8198352 
(5)漫谈 Clustering (3): Gaussian Mixture Model http://blog.pluskid.org/?p=39

 

相关文章:

  • 2022-01-14
  • 2021-10-27
  • 2021-11-26
  • 2021-06-17
  • 2021-12-01
猜你喜欢
  • 2021-12-15
  • 2021-09-27
  • 2021-05-15
  • 2021-09-18
  • 2022-12-23
  • 2021-12-05
  • 2022-12-23
相关资源
相似解决方案