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

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值