导读

高斯混合模型(Gaussian Mixture Model)通常简称GMM,是一种业界广泛使用的聚类算法,属于生成式模型,它假设所有的数据样本都是由某一个给定参数的 多元高斯分布 所生成的。从中心极限定理知,只要给定类个数K足够大,模型足够复杂,样本量足够多,每一块小区域就可以用高斯分布描述。而且高斯函数具有良好的计算性能,所以GMM被广泛地应用。本章实验还是以鸢尾花数据为例,进行K-Means聚类算法的实现。

高斯混合模型理解

单一高斯分布公式:

上图中左图用单一高斯分布去描述,显然没有右图用两个高斯分布去描述的效果好。

从中心极限定理知,只要K足够大,模型足够复杂,样本量足够多,每一块小区域就可以用高斯分布描述。那么,每个GMM由K个高斯分布组成,每个高斯分布称为一个组件(Component),这些组件线性加成在一起就得到了混合高斯分布公式:

如下图我们用三个高斯分布去描述一个二维的数据。

GMM算法实现过程第一步,引入包工具

其中org.apache.spark.ml.clustering为Spark的ML库提供的高斯混合模型,和Kmeans聚类方法类似,GMM具体实现分为两个类:用于抽象GMM的超参数并进行训练的GaussianMixture类(Estimator)和训练后的模型GaussianMixtureModel类(Transformer)。

scala> import org.apache.spark.ml.clustering.{GaussianMixture,GaussianMixtureModel}scala> import org.apache.spark.ml.linalg.Vectors

开启RDD的隐式转换。

scala> import spark.implicits._

引入SparkSession。

scala> import org.apache.spark.sql.SparkSession

第二步,定义一个caseclass作为每一个数据样本的数据类型。

case class model_instance (features: org.apache.spark.ml.linalg.Vector)

第三步,通过定义的数据类型,将数据读入RDD,并通过RDD的隐式转换.toDF()方法完成RDD到DataFrame的转换。

scala> val rawData = sc.textFile("file:///data/iris.data")

第四步,使用filter算子,过滤掉类标签,正则表达式\\d*(\\.?)\\d*可以用于匹配实数类型的数字,\\d*使用了*限定符,表示匹配0次或多次的数字字符,\\.?使用了?限定符,表示匹配0次或1次的小数点。

scala> val df = rawData.map(line =>     | { model_instance( Vectors.dense(line.split(",").filter(p => p.matches("\\d*(\\.?)\\d*"))     | .map(_.toDouble)) )}).toDF()

第五步,创建GaussianMixture类,设置相应的超参数,调用fit方法来训练一个GMM模型这里,我们建立的GaussianMixture对象,聚类数目为3,其他参数取默认值。

scala> val gm = new GaussianMixture().setK(3)|.setPredictionCol("Prediction")|.setProbabilityCol("Probability")scala> val gmm = gm.fit(df)

第六步,调用transform()方法处理数据集之后,打印数据集,可以看到每一个样本的预测簇以及其概率分布向量。在特定约束条件下,KMeans算法可以被看作是高斯混合模型(GMM)的一种特殊形式,和K-Means聚类算法不同的是,除了可以得到对样本的聚簇归属预测外,还可以得到样本属于各个聚簇的概率。

scala> val result = gmm.transform(df)scala> result.show(20, false)

第七步,查看模型的相关参数。与KMeans算法不同的是,GMM不直接给出聚类中心,而是给出各个混合成分(多元高斯分布)的参数。在ML的实现中,GMM的每一个混合成分都使用一个MultivariateGaussian类(位于org.apache.spark.ml.stat.distribution包)来存储,我们可以使用GaussianMixtureModel类的weights成员获取到各个混合成分的权重,使用gaussians成员来获取到各个混合成分的参数(均值向量和协方差矩阵)。

scala> for (i      | println("Component %d : weight is %f \n mu vector is %s \n sigma matrix is %s" format     | (i, gmm.weights(i), gmm.gaussians(i).mean, gmm.gaussians(i).cov))     | }

总结

本文首先介绍了高斯混合模型的原理,并将高斯混合模型和 k-means 模型做了比较,接着从单一高斯分布算法入手详细深入地讲解了推导高斯混合模型的过程。然后通过代码样例,介绍了自己动手实现高斯混合模型的思路。最后,利用数据展示了如何应用高斯混合模型训练具体模型。高斯混合模型是常用的聚类算法,可以在未知样本标签的情况下,通过参数估计求得每个样本所属的类。

小白白AI学习

扫描关注发现更多精彩

混合高斯模型_大数据小白入门高斯混合模型(GMM)聚类算法相关推荐

  1. java jdbc jar包_大数据从入门到深入:JavaEE 之 数据库技术 JDBC(1)

    1章 JDBC 1.1 JDBC概述 JDBC(Java DataBase Connectivity,java动态数据 库连接技术)是一种用于执行SQL语句的Java API : Applicatio ...

  2. 5获取按钮返回值消息_大数据从入门到深入:JavaEE 之 项目实战 项目基础编码阶段(5)...

    2.5 学生信息删除 2.5.1 产品经理阶段 操作要求 : 点击页面的删除按钮,弹出删除提示框,确定后删除学生信息和学生的考试成绩; 2.5.2 项目经理阶段 业务分析 : 删除学生信息的时候还要删 ...

  3. jsp 动态添加一行数据_大数据从入门到深入:JavaEE 之 动态网页开发基础 JSP的数据交互(3)...

    1.7 JSP实战 1.7.1 需求说明 : 采用model 1模式开发数据库表的增删改查业务 假设 数据库有一张表叫person表,完成person表的页面级别的 查询全部 添加 修改 删除 功能 ...

  4. 学大数据要学哪些算法_大数据学习之不得不知的八大算法

    算法一:快速排序法 快速排序是由东尼 · 霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n) 次比较.在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见. 事实上,快 ...

  5. 大数据项目13(Python实现聚类算法)

    Python实现聚类算法 一.k-means 聚类算法思想 1. 分步解析 2. 代码 3.结果 一.k-means 聚类算法思想 先随机选择k个聚类中心,把集合里的元素与最近的聚类中心聚为一类,得到 ...

  6. 大数据快速入门(09):永久弄清楚 Hive 分区表和分桶表的区别

    蛋蛋 和 小智 今天又在"打情骂俏",他们今天在谈论分区表和分桶表,走,我们去听听. 这天,蛋蛋去茶水间倒水,他把水杯放在饮水机下面,打开开关,一直盯着墙上的画在看,灵魂仿佛已经飞 ...

  7. 小白专属:大数据总纲_大数据路线_高屋建瓴的体验大数据的世界

    零.前言 不想告诉你前景. 因为好前景给你的回报是2x.坏前景给你的回报是1x. 而你缺的是走下去的过程.却的是进入前景,走到前景面前的那一个x 建议阅读人群: 大数据入门人员. 才学一两个组件的小白 ...

  8. 大数据-03-Spark入门

    Spark 简介 行业广泛使用Hadoop来分析他们的数据集.原因是Hadoop框架基于一个简单的编程模型(MapReduce).这里,主要关注的是在处理大型数据集时在查询之间的等待时间和运行程序的等 ...

  9. 水环境模型与大数据技术融合研究

    点击上方蓝字关注我们 水环境模型与大数据技术融合研究 马金锋1, 饶凯锋1, 李若男1,2, 张京1, 郑华1,2 1 中国科学院生态环境研究中心城市与区域生态国家重点实验室,北京 100085 2  ...

最新文章

  1. 计算机二级理工类报哪个,计算机二级考哪一科目,毕业后找工作会对科目有要求吗?还是说不管什么科目有证就行了?...
  2. python 显示图片然后延时,python – ROS图像用户滞后
  3. 《马哥教育协办GIAC、GOPS顶级技术峰会完美落幕》
  4. Python入门学习之函数
  5. 2018-2019-1 20165337 《信息安全系统设计基础》第一周学习总结
  6. CL_CRM_REPORT_QUESTION call CRM_REPORT_RF_CHECK_AUTHORITY
  7. 北航卓越计划 计算机科学,解读:北京航空航天大学2017卓越计划自主招生条件...
  8. 门禁系统服务器 控制器 读卡器,你知道门禁系统读卡器分为多少种吗?
  9. java中factory_Java后台面试--Spring中FactoryBean与BeanFactory的使用及区别
  10. 克拉克拉(KilaKila):大规模实时计算平台架构实战 1
  11. 【BZOJ1226】学校食堂(动态规划,状态压缩)
  12. 点击IE窗口上方的“X关闭符号”,弹出提示窗口!
  13. nyoj461 Fibonacci数列(4)解通项公式
  14. 中国药妆市场竞争状况与销售渠道现状研究报告2022版
  15. MySQL的EXPLAIN解释器
  16. 【转】《飞鸟集》325首全文
  17. C:\inetpub\logs\LogFiles\W3SVC1
  18. 王者荣耀天赐语音包怎么获得?天赐语音包获取方法介绍
  19. 什么样的女孩是真正爱你的!
  20. input标签能换行么?textarea标签属性

热门文章

  1. matlab简单分析模拟滤波器 IIR
  2. linux下复制catalog信息指令,基於Linux下catalog方式的 Oracle 備份策略(RMAN)
  3. ubuntu 开启ssh
  4. js数组去重方法分析与总结
  5. 接口的隐式和显式实现
  6. Ajax Post请求实例
  7. candence 知识积累3
  8. [转载] Python字符串的截取
  9. ffmpeg下载rtmp flv
  10. [Centos 7]MYSQL 安装及登录问题