http://ihoge.cn/2018/ML2.html

Spark ML - 聚类算法

1.KMeans快速聚类

首先到UR需要的包:

import org.apache.spark.ml.clustering.{KMeans,KMeansModel}
import org.apache.spark.ml.linalg.Vectors

开启RDD的隐式转换:

import spark.implicits._

​ 为了便于生成相应的DataFrame,这里定义一个名为model_instancecase class作为DataFrame每一行(一个数据样本)的数据类型。

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

​ 在定义数据类型完成后,即可将数据读入RDD[model_instance]的结构中,并通过RDD的隐式转换.toDF()方法完成RDDDataFrame的转换:

val rawData = sc.textFile("file:///home/hduser/iris.data")
val df = rawData.map(line =>{ model_instance( Vectors.dense(line.split(",").filter(p => p.matches("\\d*(\\.?)\\d*")).map(_.toDouble)) )}).toDF()

​ 与MLlib版的教程类似,我们使用了filter算子,过滤掉类标签,正则表达式\\d*(\\.?)\\d*可以用于匹配实数类型的数字,\\d*使用了*限定符,表示匹配0次或多次的数字字符,\\.?使用了?限定符,表示匹配0次或1次的小数点。

​ 在得到数据后,我们即可通过ML包的固有流程:创建Estimator并调用其fit()方法来生成相应的Transformer对象,很显然,在这里KMeans类是Estimator,而用于保存训练后模型的KMeansModel类则属于Transformer

val kmeansmodel = new KMeans().setK(3).setFeaturesCol("features").setPredictionCol("prediction").fit(df)

​ 与MLlib版本类似,ML包下的KMeans方法也有Seed(随机数种子)、Tol(收敛阈值)、K(簇个数)、MaxIter(最大迭代次数)、initMode(初始化方式)、initStep(KMeans||方法的步数)等参数可供设置,和其他的ML框架算法一样,用户可以通过相应的setXXX()方法来进行设置,或以ParamMap的形式传入参数,这里为了简介期间,使用setXXX()方法设置了参数K,其余参数均采用默认值。

​ 与MLlib中的实现不同,KMeansModel作为一个Transformer,不再提供predict()样式的方法,而是提供了一致性的transform()方法,用于将存储在DataFrame中的给定数据集进行整体处理,生成带有预测簇标签的数据集:

val results = kmeansmodel.transform(df)

​ 为了方便观察,我们可以使用collect()方法,该方法将DataFrame中所有的数据组织成一个Array对象进行返回:

results.collect().foreach(row => {println( row(0) + " is predicted as cluster " + row(1))})

也可以通过KMeansModel类自带的clusterCenters属性获取到模型的所有聚类中心情况:

kmeansmodel.clusterCenters.foreach(center => {println("Clustering Center:"+center)})

​ 与MLlib下的实现相同,KMeansModel类也提供了计算 集合内误差平方和(Within Set Sum of Squared Error, WSSSE) 的方法来度量聚类的有效性,在真实K值未知的情况下,该值的变化可以作为选取合适K值的一个重要参考:

kmeansmodel.computeCost(df)

2.高斯混合模型(GMM)聚类算法

2.1 基本原理

高斯混合模型(Gaussian Mixture Model, GMM) 是一种概率式的聚类方法,属于生成式模型,它假设所有的数据样本都是由某一个给定参数的 多元高斯分布 所生成的。具体地,给定类个数K,对于给定样本空间中的样本

,一个高斯混合模型的概率密度函数可以由K个多元高斯分布组合成的混合分布表示:

其中,

是以

为均值向量,

为协方差矩阵的多元高斯分布的概率密度函数,可以看出,高斯混合模型由K个不同的多元高斯分布共同组成,每一个分布被称为高斯混合模型中的一个 成分(Component), 而

为第i个多元高斯分布在混合模型中的 权重 ,且有

假设已有一个存在的高斯混合模型,那么,样本空间中的样本的生成过程即是:以

作为概率(实际上,权重可以直观理解成相应成分产生的样本占总样本的比例),选择出一个混合成分,根据该混合成分的概率密度函数,采样产生出相应的样本。

那么,利用GMM进行聚类的过程是利用GMM生成数据样本的“逆过程”:给定聚类簇数K,通过给定的数据集,以某一种 参数估计 的方法,推导出每一个混合成分的参数(即均值向量

、协方差矩阵

和权重

),每一个多元高斯分布成分即对应于聚类后的一个簇。高斯混合模型在训练时使用了极大似然估计法,最大化以下对数似然函数:

显然,该优化式无法直接通过解析方式求得解,故可采用 期望-最大化(Expectation-Maximization, EM) 方法求解,具体过程如下(为了简洁,这里省去了具体的数学表达式,详细可见wikipedia):

1.根据给定的K值,初始化K个多元高斯分布以及其权重;
2.根据贝叶斯定理,估计每个样本由每个成分生成的后验概率;(EM方法中的E步)
3.根据均值,协方差的定义以及2步求出的后验概率,更新均值向量、协方差矩阵和权重;(EM方法的M步)
重复2~3步,直到似然函数增加值已小于收敛阈值,或达到最大迭代次数

​ 当参数估计过程完成后,对于每一个样本点,根据贝叶斯定理计算出其属于每一个簇的后验概率,并将样本划分到后验概率最大的簇上去。相对于KMeans等直接给出样本点的簇划分的聚类方法,GMM这种给出样本点属于每个簇的概率的聚类方法,被称为 软聚类(Soft Clustering / Soft Assignment)

2.2 模型的训练与分析

​ Spark的ML库提供的高斯混合模型都在org.apache.spark.ml.clustering包下,和其他的聚类方法类似,其具体实现分为两个类:用于抽象GMM的超参数并进行训练的GaussianMixture类(Estimator)和训练后的模型GaussianMixtureModel类(Transformer),在使用前,引入需要的包:

import org.apache.spark.ml.clustering.{GaussianMixture,GaussianMixtureModel}
import org.apache.spark.ml.linalg.Vector

开启RDD的隐式转换:

import spark.implicits._

​ 我们仍采用Iris数据集进行实验。为了便于生成相应的DataFrame,这里定义一个名为model_instancecase class作为DataFrame每一行(一个数据样本)的数据类型。

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

在定义数据类型完成后,即可将数据读入RDD[model_instance]的结构中,并通过RDD的隐式转换.toDF()方法完成RDDDataFrame的转换:

val rawData = sc.textFile("file:///home/hduser/iris.data")
val df = rawData.map(line =>{ model_instance( Vectors.dense(line.split(",").filter(p => p.matches("\\d*(\\.?)\\d*")).map(_.toDouble)) )}).toDF()

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

​ 可以通过创建一个GaussianMixture类,设置相应的超参数,并调用fit(..)方法来训练一个GMM模型GaussianMixtureModel,在该方法调用前需要设置一系列超参数,如下表所示:

  • K:聚类数目,默认为2
  • maxIter : 最大迭代次数,默认为100
  • seed : 随机数种子,默认为随机Long值
  • Tol : 对数似然函数收敛阈值,默认为0.01

其中,每一个超参数均可通过名为setXXX(...)(如maxIterations即为setMaxIterations())的方法进行设置。这里,我们建立一个简单的GaussianMixture对象,设定其聚类数目为3,其他参数取默认值。

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

KMeans等硬聚类方法不同的是,除了可以得到对样本的聚簇归属预测外,还可以得到样本属于各个聚簇的概率(这里我们存在”Probability”列中)。

​ 调用transform()方法处理数据集之后,打印数据集,可以看到每一个样本的预测簇以及其概率分布向量

val result = gmm.transform(df)
result.show(150, false)

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

for (i <- 0 until gmm.getK) {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))}

更多精彩内容请关注: http://ihoge.cn

Spark ML - 聚类算法相关推荐

  1. spark.ml支持算法总结

    文章目录 spark支持算法总结 推荐模型 协同过滤 分类模型 1.逻辑回归 2.决策树 3.朴素贝叶斯 4. 随机森林 5. 梯度提升决策树回归 6. 多层感知器分类 7. 一对多分类 8. 支持向 ...

  2. spark ml 聚类源码笔记二

    上一篇基本把聚类串完了,还剩一个点就是怎么选择初始化的点,代码如下 val centers = initialModel match {       case Some(kMeansCenters) ...

  3. C#,人工智能,机器学习,聚类算法,训练数据集生成算法、软件与源代码

    摘要:本文简述了人工智能的重要分支--机器学习的核心算法之一--聚类算法,并用C#实现了一套完全交互式的.可由用户自由发挥的,适用于聚类算法的训练数据集生成软件--Clustering.用户使用鼠标左 ...

  4. spark 逻辑回归算法案例_黄美灵的Spark ML机器学习实战

    原标题:黄美灵的Spark ML机器学习实战 本课程主要讲解基于Spark 2.x的ML,ML是相比MLlib更高级的机器学习库,相比MLlib更加高效.快捷:ML实现了常用的机器学习,如:聚类.分类 ...

  5. 基于Spark的机器学习实践 (九) - 聚类算法

    0 相关源码 1 k-平均算法(k-means clustering)概述 1.1 回顾无监督学习 ◆ 分类.回归都属于监督学习 ◆ 无监督学习是不需要用户去指定标签的 ◆ 而我们看到的分类.回归算法 ...

  6. 离线轻量级大数据平台Spark之MLib机器学习库聚类算法KMeans实例

    1.KMeans算法 所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高.其 ...

  7. Interview:算法岗位面试—10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法、回归算法、聚类算法等细节考察

    ML岗位面试:10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法.回归算法.聚类算法等细节考察 Interview:算法岗位 ...

  8. ML之Clustering之普聚类算法:普聚类算法的相关论文、主要思路、关键步骤、代码实现等相关配图之详细攻略

    ML之Clustering之普聚类算法:普聚类算法的相关论文.主要思路.关键步骤.代码实现等相关配图之详细攻略 目录 普聚类算法的相关论文 普聚类算法的主要思路 普聚类算法的关键步骤 普聚类算法的代码 ...

  9. ML之Hierarchical clustering:利用层次聚类算法来把100张图片自动分成红绿蓝三种色调

    ML之Hierarchical clustering:利用层次聚类算法来把100张图片自动分成红绿蓝三种色调 目录 输出结果 实现代码 输出结果 实现代码 #!/usr/bin/python # co ...

最新文章

  1. OTN交换amp;P-OTN有效减少100G网络成本(一)
  2. scrapy爬取动态网页_scrapy_splash 设置随机请求头
  3. 为什么不能睁一只眼闭一只眼_自媒体人上哪里找非常多的原创短视频素材?我为什么一定要你做原创?...
  4. 你的食物变质没?用AI算法来检测一下吧
  5. scrapy mysql测试连接_scrapy连接MySQL
  6. 【华为云技术分享】Mind Studio Docker镜像部署分享
  7. php post 二维数组,php curl模拟post请求和提交多维数组的示例代码
  8. 如何获取k8s拓扑_k8s从安装到精通--Service 拓扑介绍
  9. escape()方法和unescape()方法
  10. 实用网站合集(持续更新ing)
  11. 选择排序为什么是不稳定的?
  12. html页面获取扫码枪参数,js获取扫码枪输入数据的方法
  13. wps文档设置页眉左右(奇偶页)不同内容
  14. 三.minio 的分布式部署、单节点多磁盘、多节点模式
  15. 高德地图添加Marker点标记
  16. sketch插件开发_适用于Web开发人员的10个免费Sketch插件
  17. 微软最走运、最倒霉的十个瞬间
  18. 音频延时测试方法与实现
  19. zcmu-1930帽子戏法
  20. Android 手势拦截的实现(简化水平、垂直手势操作的拦截处理)

热门文章

  1. .NET Core 3.0 部署在docker上运行
  2. .NET Core Run On Docker By Kubernetes 系列文章汇总
  3. CanalSharp.AspNetCore v0.0.4-支持输出到MongoDB
  4. 我在微软做研发 | 亚洲创新的科研之力
  5. .Net Core中的Api版本控制
  6. 弹性和瞬态故障处理库Polly介绍
  7. 分布式统一配置平台-Disconf.Net
  8. 使用 Angular
  9. .NET Core中的认证管理解析
  10. miui替换官方文件解决无服务器,miui 关掉云服务器