在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机器学习系列里面,都会介绍。

混合模型:通过密度函数的线性合并来表示未知模型p(x) 
      为什么提出混合模型,那是因为单一模型与实际数据的分布严重不符,但是几个模型混合以后却能很好的描述和预测数据。 
       高斯混合模型(GMM),说的是把数据可以看作是从数个高斯分布中生成出来的。虽然我们可以用不同的分布来随意地构造 XX Mixture Model ,但是 GMM是最为流行。另外,Mixture Model 本身其实也是可以变得任意复杂的,通过增加 Model 的个数,我们可以任意地逼近任何连续的概率密分布。 
      二维情况下高斯分布模拟产生数据的分布是椭圆,如下图: 

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

这样就能计算所有样本出现的概率了。图(b)已经明确了样本分类。 
 

由于在对数函数里面又有加和,我们没法直接用求导解方程的办法直接求得最大值。为了解决这个问题,采用了EM方法。 
       EM算法可参考我的另一篇文章 
《机器学习算法(优化)之二:期望最大化(EM)算法》http://www.cnblogs.com/itboys/p/8400044.html.

EM算法模型参数估计

每个GMM由K个Gaussian component分布组成。我以一维Gaussian函数,GMM模型有3个隐含component为例,通俗的说明。 
E过程: 

迭代的第t步,对于观测到的x点,那么他究竟是3个隐含的Gaussina曲线中的那一个产生的呢?应该说都有可能,只是产生的概率大小不一样而已。如图中的x点,它由N(x;μ3,σ3)产生的可能性最大,概率为π3∗N(x;μ3,σ3),假设为0.4*0.30=0.12,其次是π2∗N(x;μ2,σ2),假设为0.3*0.15=0.045,最小是π1∗N(x;μ1,σ1),假设为0.3*0.02=0.006。因此x出现总的概率是0.12+0.045+0.006=0.1656

从另一个角度看,对于观测到的某个点x,推测是由N(x;μ3,σ3)产生的可能性有多大,自然我们认为是:0.12/0.1656=0.7246(虽然非常简单,但是理解这一点是后面E步公式得出的关键点);以此类推测,x是由N(x;μ2,σ2)产生的可能性=0.045/0.1656=0.2717,x是由N(x;μ1,σ1)产生的可能性0.006/0.1656=0.0362。

 
      更一般地,GMM认为数据是从K个高斯函数组合而来的,即

隐含K个高斯函数,K需要首先确定好。任意高斯分布定义为N(x;μk,σk),k=1,2,...K.

(1)E:对于观测点xi,是由第k个component产生的概率为

(2)M:xi可以看作是有各部分加和而成的,其中由第k个component产生部分自然为:γ(xi,k)xi,所以可以认为第k个component产生了如下的数据:

γ(xi,k)xi,  i=1,2,...N而由于每个 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().setMaxIter().setSeed(1L)
val model=gmm.fit(dataset) //输出model参数
for(i<- 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

Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)的更多相关文章

  1. Spark2.0机器学习系列之11: 聚类(幂迭代聚类, power iteration clustering, PIC)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:             (1)K-means             (2)Latent Dirichlet all ...

  2. Spark2.0机器学习系列之1: 聚类算法(LDA)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:      (1)K-means      (2)Latent Dirichlet allocation (LDA)  ...

  3. Spark2.0机器学习系列之9: 聚类(k-means,Bisecting k-means,Streaming k-means)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:      (1)K-means      (2)Latent Dirichlet allocation (LDA)  ...

  4. Spark2.0机器学习系列之12: 线性回归及L1、L2正则化区别与稀疏解

    概述 线性回归拟合一个因变量与一个自变量之间的线性关系y=f(x).       Spark中实现了:       (1)普通最小二乘法       (2)岭回归(L2正规化)       (3)La ...

  5. Spark2.0机器学习系列之7: MLPC(多层神经网络)

    Spark2.0 MLPC(多层神经网络分类器)算法概述 MultilayerPerceptronClassifier(MLPC)这是一个基于前馈神经网络的分类器,它是一种在输入层与输出层之间含有一层 ...

  6. Spark2.0机器学习系列之6:GBDT(梯度提升决策树)、GBDT与随机森林差异、参数调试及Scikit代码分析

    概念梳理 GBDT的别称 GBDT(Gradient Boost Decision Tree),梯度提升决策树.     GBDT这个算法还有一些其他的名字,比如说MART(Multiple Addi ...

  7. Spark2.0机器学习系列之3:决策树

    概述 分类决策树模型是一种描述对实例进行分类的树形结构. 决策树可以看为一个if-then规则集合,具有“互斥完备”性质 .决策树基本上都是 采用的是贪心(即非回溯)的算法,自顶向下递归分治构造. 生 ...

  8. Spark2.0机器学习系列之2:基于Pipeline、交叉验证、ParamMap的模型选择和超参数调优

    Spark中的CrossValidation Spark中采用是k折交叉验证 (k-fold cross validation).举个例子,例如10折交叉验证(10-fold cross valida ...

  9. Spark2.0机器学习系列之5:随机森林

    概述 随机森林是决策树的组合算法,基础是决策树,关于决策树和Spark2.0中的代码设计可以参考本人另外一篇博客: http://www.cnblogs.com/itboys/p/8312894.ht ...

随机推荐

  1. 第二百四十八节,Bootstrap轮播插件

    Bootstrap轮播插件 学习要点: 1.轮播插件 本节课我们主要学习一下 Bootstrap 中的轮播插件. 一.轮播 轮播插件就是将几张同等大小的大图,按照顺序依次播放. 基本实例. 第一步,给 ...

  2. (转)Spring AOP编程原理、Demo

    转自: http://pandonix.iteye.com/blog/336873/ AOP原理: http://blog.csdn.net/moreevan/article/details/1197 ...

  3. 【转】虚拟串口VSPM解决串口编程问题

    通过串口调试软件 UartAssist.exe 和虚拟串口软件 VSPM,可以解决串口编程时没用硬件调试的问题,通过VSPM虚拟出串口设备,让程序发送信息到 VSPM 设备后通过 UartAssist ...

  4. JAVA 并发编程-多个线程之间共享数据(六)

    多线程共享数据的方式: 1.假设每一个线程运行的代码同样.能够使用同一个Runnable对象,这个Runnable对象中有那个共享数据,比如,卖票系统就能够这么做. 2,假设每一个线程运行的代码不同. ...

  5. when case group by 的用法集合

    1.用那个以前大家都熟悉的例子,要求是依旧下面的表格求每个大洲的人口总和 国家(countrcoungry) 人口(population) 中国 600 美国 100 加拿大 100 英国 200 法 ...

  6. python3----练习题(图片转字符画)

    import argparse from PIL import Image def parse_param(): parser = argparse.ArgumentParser() # 命令行输入参 ...

  7. JavaScript设计模式——观察者模式

    观察者模式,又称发布-订阅模式或消息机制,定义了一种依赖关系,解决了主题对象与观察者之间功能的耦合. 通过运用观察者模式,可以解决团队开发中的模块间通讯问题,这是模块间解耦的一种可行方案. 首先,我们 ...

  8. POI读写大数据量EXCEL

    另一篇文章http://www.cnblogs.com/tootwo2/p/8120053.html里面有xml的一些解释. 大数据量的excel一般都是.xlsx格式的,网上使用POI读写的例子比较 ...

  9. LAMP集群项目五 项目备份

    1.打包到本地 2.推送到备份服务器 3.删除若干天前的备份 ip=`awk '/IPADDR/' /etc/sysconfig/network-scripts/ifcfg-eth0 |awk -F ...

  10. vue 把后台返回的json拼接成excel并下载

    先封装一下生成excel的方法 downfile.js export default { data() { return {} }, components: {}, created() { }, me ...