Spark实现K-Means算法代码示例

 更新时间:2017年10月17日 14:38:44   作者:MSTK  
这篇文章主要介绍了Spark实现K-Means算法代码示例,简单介绍了K-Means算法及其原理,然后通过具体实例向大家展示了用spark实现K-Means算法,需要的朋友可以参考下。

K-Means算法是一种基于距离的聚类算法,采用迭代的方法,计算出K个聚类中心,把若干个点聚成K类。

MLlib实现K-Means算法的原理是,运行多个K-Means算法,每个称为run,返回最好的那个聚类的类簇中心。初始的类簇中心,可以是随机的,也可以是KMean||得来的,迭代达到一定的次数,或者所有run都收敛时,算法就结束。

用Spark实现K-Means算法,首先修改pom文件,引入机器学习MLlib包:

  <dependency>
   <groupId>org.apache.spark</groupId>
   <artifactId>spark-mllib_2.10</artifactId>
   <version>1.6.0</version>
  </dependency>

代码:

import org.apache.log4j.{Level,Logger}
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
object Kmeans {
 def main(args:Array[String]) = {
 // 屏蔽日志
 Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
 Logger.getLogger("org.apache.jetty.server").setLevel(Level.OFF)
 // 设置运行环境
 val conf = new SparkConf().setAppName("K-Means").setMaster("spark://master:7077")
  .setJars(Seq("E:\\Intellij\\Projects\\SimpleGraphX\\SimpleGraphX.jar"))
 val sc = new SparkContext(conf)
 // 装载数据集
 val data = sc.textFile("hdfs://master:9000/kmeans_data.txt", 1)
 val parsedData = data.map(s => Vectors.dense(s.split(" ").map(_.toDouble)))
 // 将数据集聚类,2个类,20次迭代,形成数据模型
 val numClusters = 2
 val numIterations = 20
 val model = KMeans.train(parsedData, numClusters, numIterations)
 // 数据模型的中心点
 println("Cluster centres:")
 for(c <- model.clusterCenters) {
  println(" " + c.toString)
 }
 // 使用误差平方之和来评估数据模型
 val cost = model.computeCost(parsedData)
 println("Within Set Sum of Squared Errors = " + cost)
 // 使用模型测试单点数据
 println("Vectors 7.3 1.5 10.9 is belong to cluster:" + model.predict(Vectors.dense("7.3 1.5 10.9".split(" ")
  .map(_.toDouble))))
 println("Vectors 4.2 11.2 2.7 is belong to cluster:" + model.predict(Vectors.dense("4.2 11.2 2.7".split(" ")
  .map(_.toDouble))))
 println("Vectors 18.0 4.5 3.8 is belong to cluster:" + model.predict(Vectors.dense("1.0 14.5 73.8".split(" ")
  .map(_.toDouble))))
 // 返回数据集和结果
 val result = data.map {
  line =>
  val linevectore = Vectors.dense(line.split(" ").map(_.toDouble))
  val prediction = model.predict(linevectore)
  line + " " + prediction
 }.collect.foreach(println)
 sc.stop
 }
}

使用textFile()方法装载数据集,获得RDD,再使用KMeans.train()方法根据RDD、K值和迭代次数得到一个KMeans模型。得到KMeans模型以后,可以判断一组数据属于哪一个类。具体方法是用Vectors.dense()方法生成一个Vector,然后用KMeans.predict()方法就可以返回属于哪一个类。

运行结果:

Cluster centres:
 [6.062499999999999,6.7124999999999995,11.5]
 [3.5,12.2,60.0]
Within Set Sum of Squared Errors = 943.2074999999998
Vectors 7.3 1.5 10.9 is belong to cluster:0
Vectors 4.2 11.2 2.7 is belong to cluster:0
Vectors 18.0 4.5 3.8 is belong to cluster:1
0.0 0.0 5.0 0
0.1 10.1 0.1 0
1.2 5.2 13.5 0
9.5 9.0 9.0 0
9.1 9.1 9.1 0
19.2 9.4 29.2 0
5.8 3.0 18.0 0
3.5 12.2 60.0 1
3.6 7.9 8.1 0

总结

本文关于Spark实现K-Means算法代码示例的全部内容就到这里,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:浅谈七种常见的Hadoop和Spark项目案例Spark的广播变量和累加器使用方法代码示例Spark入门简介等,如有不足之处,欢迎留言指出,小编会及时回复大家并更正,希望朋友们对本站多多支持!

您可能感兴趣的文章:

相关文章

  • 教你在k8s上部署HADOOP-3.2.2(HDFS)的方法

    教你在k8s上部署HADOOP-3.2.2(HDFS)的方法

    这篇文章主要介绍了k8s-部署HADOOP-3.2.2(HDFS)的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • K8S如何利用Prometheus监控pod的实时数据指标

    K8S如何利用Prometheus监控pod的实时数据指标

    这篇文章主要给大家介绍了关于K8S如何利用Prometheus监控pod的实时数据指标的相关资料,Prometheus是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口,需要的朋友可以参考下
    2024-01-01
  • Rainbond应用分享与发布官方文档说明

    Rainbond应用分享与发布官方文档说明

    这篇文章主要为大家介绍了Rainbond应用分享与发布的官方文档说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • kubernetes之statefulset搭建MySQL集群

    kubernetes之statefulset搭建MySQL集群

    这篇文章主要为大家介绍了kubernetes之statefulset搭建MySQL集群示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • k8s的包管理工具helm使用简介

    k8s的包管理工具helm使用简介

    这篇文章主要为大家介绍了k8s的包管理工具helm使用简介,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 使用k8tz解决pod内的时区问题(坑的解决)

    使用k8tz解决pod内的时区问题(坑的解决)

    时区的不一致,会带来很多困扰。即使代码与时区无关,但容器日志与系统日志时间相关联排查问题也会让人头疼,这篇文章主要介绍了使用k8tz优雅的解决pod内的时区问题,需要的朋友可以参考下
    2022-10-10
  • K8s解决主机重启后kubelet无法自动启动问题(推荐)

    K8s解决主机重启后kubelet无法自动启动问题(推荐)

    在安装配置好Kubernetes后,正常情况下服务器关机重启,kubelet也会自动启动的,如何解决这个问题呢,下面小编给大家带来了K8s解决主机重启后kubelet无法自动启动问题,感兴趣的朋友一起看看吧
    2022-08-08
  • 虚拟化和云计算的区别分析

    虚拟化和云计算的区别分析

    这篇文章主要介绍了虚拟化和云计算的区别,深入浅出的列举分析了虚拟化与云计算的几点常见区别,需要的朋友可以参考下
    2016-10-10
  • kubernetes k8s CRD自定义资源学习笔记

    kubernetes k8s CRD自定义资源学习笔记

    这篇文章主要介绍了kubernetes k8s CRD自定义资源学习笔记,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Kubernetes中使用临时容器进行故障排查的方法

    Kubernetes中使用临时容器进行故障排查的方法

    在使用Kubernetes时,用户常常会遇到一些错误和迷惑,下面这篇文章主要给大家介绍了关于Kubernetes中使用临时容器进行故障排查的相关资料,需要的朋友可以参考下
    2022-03-03

最新评论