Spark實(shí)現(xiàn)K-Means算法代碼示例
K-Means算法是一種基于距離的聚類算法,采用迭代的方法,計(jì)算出K個(gè)聚類中心,把若干個(gè)點(diǎn)聚成K類。
MLlib實(shí)現(xiàn)K-Means算法的原理是,運(yùn)行多個(gè)K-Means算法,每個(gè)稱為run,返回最好的那個(gè)聚類的類簇中心。初始的類簇中心,可以是隨機(jī)的,也可以是KMean||得來的,迭代達(dá)到一定的次數(shù),或者所有run都收斂時(shí),算法就結(jié)束。
用Spark實(shí)現(xiàn)K-Means算法,首先修改pom文件,引入機(jī)器學(xué)習(xí)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) // 設(shè)置運(yùn)行環(huán)境 val conf = new SparkConf().setAppName("K-Means").setMaster("spark://master:7077") .setJars(Seq("E:\\Intellij\\Projects\\SimpleGraphX\\SimpleGraphX.jar")) val sc = new SparkContext(conf) // 裝載數(shù)據(jù)集 val data = sc.textFile("hdfs://master:9000/kmeans_data.txt", 1) val parsedData = data.map(s => Vectors.dense(s.split(" ").map(_.toDouble))) // 將數(shù)據(jù)集聚類,2個(gè)類,20次迭代,形成數(shù)據(jù)模型 val numClusters = 2 val numIterations = 20 val model = KMeans.train(parsedData, numClusters, numIterations) // 數(shù)據(jù)模型的中心點(diǎn) println("Cluster centres:") for(c <- model.clusterCenters) { println(" " + c.toString) } // 使用誤差平方之和來評估數(shù)據(jù)模型 val cost = model.computeCost(parsedData) println("Within Set Sum of Squared Errors = " + cost) // 使用模型測試單點(diǎn)數(shù)據(jù) 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)))) // 返回?cái)?shù)據(jù)集和結(jié)果 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()方法裝載數(shù)據(jù)集,獲得RDD,再使用KMeans.train()方法根據(jù)RDD、K值和迭代次數(shù)得到一個(gè)KMeans模型。得到KMeans模型以后,可以判斷一組數(shù)據(jù)屬于哪一個(gè)類。具體方法是用Vectors.dense()方法生成一個(gè)Vector,然后用KMeans.predict()方法就可以返回屬于哪一個(gè)類。
運(yùn)行結(jié)果:
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
總結(jié)
本文關(guān)于Spark實(shí)現(xiàn)K-Means算法代碼示例的全部內(nèi)容就到這里,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:淺談七種常見的Hadoop和Spark項(xiàng)目案例、Spark的廣播變量和累加器使用方法代碼示例、Spark入門簡介等,如有不足之處,歡迎留言指出,小編會(huì)及時(shí)回復(fù)大家并更正,希望朋友們對本站多多支持!
相關(guān)文章
Rainbond云原生部署開源社區(qū)Discourse的配置過程
這篇文章主要為大家介紹了Rainbond云原生部署開源社區(qū)Discourse配置過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04kubernetes需要默認(rèn)的serviceaccount的原因解析
這篇文章主要介紹了kubernetes為何需要默認(rèn)的serviceaccount,ServiceAccount 是 Kubernetes 中的一種重要概念,它的實(shí)際使用場景包括很多,本文給大家講解的非常詳細(xì),需要的朋友可以參考下2023-04-04k8s部署Pyroscope并分析golang性能瓶頸(最新推薦)
這篇文章主要介紹了k8s部署Pyroscope并分析golang性能瓶頸,Pyroscope支持多種編程語言并提供了豐富的性能數(shù)據(jù),可以幫助我們跟蹤應(yīng)用程序的執(zhí)行情況,并根據(jù)收集到的數(shù)據(jù)來識(shí)別性能瓶頸,需要的朋友可以參考下2023-04-04青龍面板拉庫解決沒有或丟失依賴can‘t?find?module的保姆級教程(附青龍面板腳本倉庫)
這篇文章主要介紹了青龍面板拉庫解決沒有或丟失依賴can‘t?find?module的保姆級教程(附青龍面板腳本倉庫),需要的朋友可以參考下2022-05-05K8S?prometheus?operator監(jiān)控工作原理介紹
這篇文章主要為大家介紹了K8S?prometheus?operator監(jiān)控工作原理介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Kubernetes中crictl的詳細(xì)用法教程與應(yīng)用實(shí)戰(zhàn)記錄
crictl作為Kubernetes的容器運(yùn)行時(shí)接口(CRI)的命令行工具,為Kubernetes的調(diào)試和管理提供了強(qiáng)大的支持,通過本文的詳細(xì)介紹,你應(yīng)該已經(jīng)掌握了crictl的基本安裝、配置、常用命令以及高級用法,需要的朋友可以參考下2024-07-07