zoukankan      html  css  js  c++  java
  • spark机器学习之KMeans算法实现

    一、概念

    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.operator
    import org.apache.spark.mllib.clustering.KMeans
    import org.apache.spark.mllib.linalg.{Vector, Vectors}
    import org.apache.spark.{SparkConf, SparkContext}
    
    import scala.io.Source
    import scala.util.Random
    
    
    object 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值,损失值

    参考地址:

    http://www.cnblogs.com/xiaoma0529/p/6937925.html

  • 相关阅读:
    yum安装报错“rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID 1e5e0159”
    EM64T和64位是不是一个概念啊?他们有什么区别啊,怎么区分啊?
    Can't load IA 32-bit .dll on a AMD 64-bit platform
    中间件——Oracle Fusion Middleware
    Does Windows have a limit of 2000 threads per process?
    java8 Lambda Stream操作list,map
    Mybatis优雅存取json字段的解决方案
    网站服务器架构部署方案发展
    springboot flowable Cause: org.xml.sax.SAXParseException; lineNumber: 25; columnNumber: 14; 元素类型为 "include" 的内容必须匹配 "EMPTY"
    java.lang.NoClassDefFoundError: javax/el/ELManager
  • 原文地址:https://www.cnblogs.com/xiaoma0529/p/7097284.html
Copyright © 2011-2022 走看看