博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spark机器学习之KMeans算法实现
阅读量:6910 次
发布时间:2019-06-27

本文共 2705 字,大约阅读时间需要 9 分钟。

一、概念

KMeans基于划分的聚类方法

给定数据样本集Sample和应该划分的类书K,对样本数据Sample进行聚类,最终形成K个聚类,其相似的度量是某条数据与中心点的“距离”(距离可分为绝对距离、欧氏距离、闵可夫斯基距离。这里说的距离是欧式距离,欧氏距离也称欧几里得距离,它是在m维空间中两个点之间的真实距离)。

二、算法实现

从官网下载源码时在data文件夹下有mllib文件夹,里面有kmeans_data.txt,内容为:

0.0 0.0 0.0
0.1 0.1 0.1
0.2 0.2 0.2
9.0 9.0 9.0
9.1 9.1 9.1
9.2 9.2 9.2

完整代码:

 

package operator.operatorimport org.apache.spark.mllib.clustering.KMeansimport org.apache.spark.mllib.linalg.{Vector, Vectors}import org.apache.spark.{SparkConf, SparkContext}import scala.io.Sourceimport scala.util.Randomobject Kmean {    def main(args: Array[String]): Unit = {        val conf = new SparkConf().setMaster("local[2]").setAppName("Spark MLlib Exercise:K-Means Clustering").set("spark.testing.memory", "2147480000")        val sc = new SparkContext(conf)        //读取数据        val testdata = sc.textFile("file:///C:\\Users\\Administrator\\Desktop\\data.txt")        //统计数据 testdata.count()        //查看数据 testdata.take(10)        //数据预处理:        //val parseTestdata = testdata.map(s => Vectors.dense(s.split(",").map(_.toDouble))).cache()        //println(testdata.count())//统计数据的数量        val parseTestdata = testdata.map { s => {            val ar = s.split(" ")            val tt = Vectors.dense((ar(0).toDouble) / 1000000, (ar(1).toDouble) / 1000000) //选取数组内第1和2列所有元素,并转换浮点型,再转为向量数组            tt //必须写上返回值        }        }        //上面已引入Kmeans的算法包,设置模型参数K,最大迭代次数和训练次数        val numClusters = 5        val numIterations = 10        val numRuns = 3        var clusterIndex: Int = 0        val clusterModel = KMeans.train(parseTestdata, numClusters, numIterations, numRuns)        // Evaluate clustering by computing Within Set Sum of Squared Errors(通过计算平方误差的总和来评估聚类结果)        val clusterModelWssse = clusterModel.computeCost(parseTestdata)        println("Wssse for model  = " + clusterModelWssse)        //打印中心点        println("Cluster centers: ")//        clusterModel.clusterCenters.foreach(println)        clusterModel.clusterCenters.foreach(x => {            println("Center Point of Cluster " + clusterIndex + ":")            println(x)            clusterIndex += 1        })        //case class是一种样例类,用于模式匹配        case class MatchData(vec: Vector, classs: Int)        //打印原数据+类        val kmeansTestResult = parseTestdata.map(vec => MatchData(vec, clusterModel.predict(vec)))        //KMeansTestResult.take(10).foreach(println)        //println(kmeansTestResult.filter(_.classs==0).count())//统计某类的数量,先filter:筛选集合元素,再进行统计        //统计每类的数量(步骤:将kmeansTestResult中的classs进行映射成键值对(key/value)结构),再进行分组统计        kmeansTestResult.map(line => (line.classs, 1)).reduceByKey(_ + _).foreach(println)    }}

 

  结果展示

 

 

、算法优化

K折交叉验证找出合理的K值,损失值

参考地址:

 

转载于:https://www.cnblogs.com/xiaoma0529/p/7097284.html

你可能感兴趣的文章
前端JavaScript实现跨域的方式(转)
查看>>
原来你是这样的http2......
查看>>
WaitAll 和 WhenAll 的使用及区别
查看>>
给信息安全爱好者的一封信
查看>>
学习ASP.NET Core Razor 编程系列八——并发处理
查看>>
CSS动画的性能分析和浏览器GPU加速
查看>>
Nginx在线服务状态下平滑升级及ab压力测试【转】
查看>>
poj-2411 Mondriaan's Dream ***
查看>>
(转)as3中的资源管理与GC
查看>>
项目经验总结分享:图书馆维护系统总结
查看>>
HOJ-10513 Allocation Scheme[简单DFS]
查看>>
大数乘法 zju 1217
查看>>
c# 邮件发送 发送人带昵称
查看>>
wxWidgets事件处理(手机播放器连载系列2)
查看>>
c#中转义符总结
查看>>
Android学习笔记之AndroidManifest.xml文件解析(转载)
查看>>
网络干货,无论是运维还是开发都要知道的网络知识系列之(五)
查看>>
MySQL查询及删除重复记录的方法
查看>>
.net微信公众号开发——快速入门
查看>>
ASP.NET Core 数据保护(Data Protection 集群场景)【下】
查看>>