Spark实现K-Means算法代码示例
程序员文章站
2022-07-09 13:15:40
k-means算法是一种基于距离的聚类算法,采用迭代的方法,计算出k个聚类中心,把若干个点聚成k类。
mllib实现k-means算法的原理是,运行多个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入门简介等,如有不足之处,欢迎留言指出,小编会及时回复大家并更正,希望朋友们对本站多多支持!
下一篇: Docker探索namespace详解