目录

  • 7.SparkMLlib KMeans聚类算法
    • 7.1 KMeans聚类算法
    • 7.2 算法源码分析
    • 7.3 应用实战
      • 7.3.1 数据说明
      • 7.3.2 代码详解

7.SparkMLlib KMeans聚类算法

7.1 KMeans聚类算法

KMeans聚类算法属于划分类型的聚类方法,其求解过程是迭代计算,基本思想是在开始时随机选择K个簇的中心,依据最近邻规则,把待分类样本点分给每个簇。按照平均计算的方法再计算每个簇的质心,对簇心的位置进行更新,开始新一轮的迭代,直到结果收敛于簇心的移动距离小于事先给定的阈值。
其算法的过程如下所示:
(1)根据给定的k值,选取k个样本点作为初始划分中心;
(2)计算所有样本点到每一个划分中心的距离,并将所有样本点划分到距离最近的划分中心;
(3)计算每个划分中样本点的平均值,将其作为新的中心;
循环进行2~3步直至达到最大迭代次数,或划分中心的变化小于某一预定阈值即聚类的中心不再进行大范围的移动。

7.2 算法源码分析

MLlib中对KMeans聚类算法的实现主要包括以下几个部分:
(1)KMeans聚类伴生对象
KMeans聚类伴生对象object KMeans是建立聚类模型的入口,定义了训练模型的train方法,该方法的参数及其意义如下:
*data——以RDD(Vector)形式输入的训练数据;
*k——创建的聚类簇的个数;
* maxIterations——允许迭代的最大次数;
*initializationMode——初始化聚类中心点的算法,可以选择随机或k-means++
*seed——聚类初始化的随机种子,默认是基于系统时间生成种子。
KMeans聚类类是classs KMeans,run方法根据初始化的参数训练模型。
(2)在上述的run方法中,MLlib使用runAlgorithm方法计算中心点,其算法步骤如下:
初始化中心;进行迭代计算各个样本点分别属于哪个中心点,累加中心点的样本值并完成计数;由中心点的样本数据更新中心点;与更新前的数值比较判断是否完成。runs参数表示并行度,在计算中心点时分多组进行计算,最后以最好的一组为聚类中心。
(3)runAlgorithm中MLlib支持k-means++:initKMeansParallel和随机初始化:initRandom,k-means++算法基于的是初始聚类中心之间相互距离尽可能远的思想,而随机初始化就是随机选择样本数据点作为中心点。
(4)MLlib中还提出了一种快速找到样本点与离其最近的聚类中心的方法:findClosest,还有一种快速计算两样本点之间距离的方法fastSquaredDistance。
(5)训练数据输入,得到一个KMeans聚类模型,模型参数为中心点向量,方法为:预测、保存和加载模型。其中预测方法predict支持RDD和向量格式数据的计算。

7.3 应用实战

7.3.1 数据说明

本次实战使用的是UCI数据集中很经典的鸢尾花数据Iris,一共有150条数据,示例如下:

5.4,3.0,4.5,1.5,versicolor

其中四个实数值表示花的四个部位的大小尺寸,最后对应的是对应花所属的亚种类型即标签值,一共有三种。

7.3.2 代码详解

//导入Vectors包和KMeans算法包
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.clustering.{KMeans, KMeansModel}
//添加自己的数据集路径,读取数据文件
val rawData = sc.textFile("/mnt/hgfs/thunder-download/MLlib_rep/data/iris.txt")

此处输出的信息如下:

rawData: org.apache.spark.rdd.RDD[String] = /mnt/hgfs/thunder-download/
MLlib_rep/data/iris.txt MapPartitionsRDD[44] at textFile at <console>:29

可以看到是RDD[String]格式的数据

//把读取的数据转化为训练数据
val trainingData = rawData.map(line => {Vectors.dense(line.split(",").filter(p => p.matches("\\d*(\\.?)\\d*")).map(_.toDouble))}).cache()

此处输出的信息如下:

trainingData: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MapPartitionsRDD[45] at map at <console>:31

训练数据为Vector类型,并且使用了filter方法,使用正则表达式将花的类别标签去掉。

//调用KMeans的run(RDD[Vector])方法训练KMeans模型
//该方法支持重载,这里使用KMeans.train(data, k, maxIterations, runs)的形式,
//传入训练样本和参数。k为聚类数目,默认2;maxIterations为最大迭代次数,
//默认20;runs为运行的次数,默认为1.
val model : KMeansModel = KMeans.train(trainingData, 3, 100, 5)

这一步就是RDD操作的action型操作,模型创建成功

//使用KMeansModel类的clusterCenters属性得到模型中聚类的中心
model.clusterCenters.foreach(| center => {| Display all 664 possibilities? (y or n)| println("Clustering Center:"+center)| })

输出结果如下:

Clustering Center:[5.901612903225806,2.7483870967741932,4.393548387096774,1.433870967741935]
Clustering Center:[5.005999999999999,3.4180000000000006,1.4640000000000002,0.2439999999999999]
Clustering Center:[6.85,3.0736842105263147,5.742105263157893,2.071052631578947]
//用predict()方法预测每个样本所属聚类
trainingData.collect().foreach(| sample => {| val predictedCluster = model.predict(sample)| println(sample.toString + " belongs to cluster " + predictedCluster)| })

输出的结果如下:

[5.1,3.5,1.4,0.2] belongs to cluster 1
[4.9,3.0,1.4,0.2] belongs to cluster 1
[4.7,3.2,1.3,0.2] belongs to cluster 1
[4.6,3.1,1.5,0.2] belongs to cluster 1
[5.0,3.6,1.4,0.2] belongs to cluster 1
…
[7.0,3.2,4.7,1.4] belongs to cluster 0
[6.4,3.2,4.5,1.5] belongs to cluster 0
[6.9,3.1,4.9,1.5] belongs to cluster 2
[5.5,2.3,4.0,1.3] belongs to cluster 0
[6.5,2.8,4.6,1.5] belongs to cluster 0
…
//最后可以计算下WSSSE即集合内误差平方和,此项数据是用来测量聚类的有效//性
val wssse = model.computeCost(trainingData)

输出结果为:
wssse: Double = 78.94084142614622,改变k值可以改变wssse,也就可以对无法明确分类的数据选择最优的分类k值即聚类数。

大数据进阶必修课!Spark实战KMeans聚类算法相关推荐

  1. kmeans算法_实战 | KMeans 聚类算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...

  2. 混合高斯模型_大数据小白入门高斯混合模型(GMM)聚类算法

    导读 高斯混合模型(Gaussian Mixture Model)通常简称GMM,是一种业界广泛使用的聚类算法,属于生成式模型,它假设所有的数据样本都是由某一个给定参数的 多元高斯分布 所生成的.从中 ...

  3. Spark mlib KMeans聚类算法

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

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

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

  5. 机器学习算法-KMeans聚类算法解析及伪代码实现。

    机器学习算法-KMeans聚类算法解析及伪代码实现. 徐小狗在文末附上了几条大神们关于KMeans聚类算法的博文,欲详细研究请前往浏览~ 作为初学者,许多地方可能笨拙或有误,希望有大神看到后给予优化和 ...

  6. 『ML』利用K-Means聚类算法对未标注数据分组——《机器学习实战》学习笔记(Ch10)

    本节用Python实现K-Means算法,对未标注的数据进行聚类. 在做完聚类后,如何对于聚类结果进行评估?请看 用Python实现聚类效果的评估(轮廓系数.互信息) 导航 K-Means简介 代码实 ...

  7. 【白话机器学习】算法理论+实战之K-Means聚类算法

    1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Ad ...

  8. Spark MLlib之K-Means聚类算法

    聚类算法 聚类,Cluster analysis,有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可能的相似,簇与簇之间的object尽可能的相异.聚 ...

  9. DT大数据梦工厂免费实战大数据视频全集 分享

    接触大数据有几年,以前一直都是对hadoop的使用.相比于日新月异的前端技术,我还是比较喜欢大数据--这个已经被热炒多年的课题,也相信从事大数据方面的技术研究是IT从业者的一条光明坦途. 2010年h ...

最新文章

  1. 企业网络推广专员浅析有利于企业网络推广的页面制作技巧有哪些?
  2. Java程序员从笨鸟到菜鸟之(八十六)跟我学jquery(二)大话jquery选择器
  3. Web文件管理器 elfinder-彩龙社区
  4. python有多少种模块_python如何查看有哪些模块
  5. Springboot系列之Shiro、JWT、Redis 进行认证鉴权
  6. CenterOS防火墙操作
  7. 使用Composer部署laravel框架
  8. smartsvn smartgit 安装 及其破解
  9. web前端学习基础教程,简单的图片旋转木马自动轮播js代码
  10. 萌新学Java之渐入佳境三-----线程试炼
  11. 搭建springboot+mybatis+freemarker项目
  12. js pug 代码_Vue项目中配置pug解析支持
  13. 工作笔记:Android高德定位使用说明
  14. 激光SLAM入门笔记(五):前端配准 II
  15. 软件测试的14中类型 详解
  16. ft232rl可以了
  17. 前端JS基础知识复习笔记(1)
  18. 高级软件测试工程师待遇,【华为工资】高级软件测试工程师待遇-看准网
  19. Mac Book pro(M1)使用总结
  20. 7-3 Swan学院社团招新

热门文章

  1. f12键修改网页html,问如何通过F12键来快捷的修改网页
  2. 计算机毕业设计SSM房屋租赁管理系统设计【附源码数据库】
  3. 【STM32F4系列】【HAL库】【自制库】ps2手柄模块驱动
  4. PowerDesigner 数据库建模
  5. python读取odb_Python提取Abaqus ODB中的场变量(Field output)与历史变量(History output)方法...
  6. KEIL 调试的 ini 文件有什么用?
  7. 「数据架构」5分钟学会数据流程图:客户服务系统示例
  8. 关于python使用playsound播放音频:指定的设备未打开,或不被 MCI 所识别。
  9. MySQL 中用NOW()和SYSDATE()函数获取当前日期时间
  10. 逻辑回归算法之梯度算法