如何分析K-meansClustering

如何分析K-means Clustering ,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名申请网站空间、营销软件、网站建设、斗门网站维护、网站推广。

一:算法

    K-means 算法是机器学习 聚类算法中很常用,也是最基本的一种算法。聚类算法属于无监督学习算法。算法的步骤分为以下两步:1,根据分组大小K的值,找出K个中心点,而这时候其他点也根据距离中心点的距离划分给这个中心点。2,找出每个cluster最优的中心点,重新分配点,并迭代。

二:Spark MLlib

    Spark MLlib 提供了K-means算法的实现。

  1. 数据来源

    数据来源于KDD CUP网站,这些数据是网络连接的数据,下载   

找到data -> kddcup.data.zip  并下载。

数据每行格式如下:

0,tcp,http,SF,215,45076,
    0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,
    0.00,0.00,0.00,0.00,1.00,0.00,0.00,0,0,0.00,
    0.00,0.00,0.00,0.00,0.00,0.00,0.00,normal.

除了最后一个为label外,其余的都是features。label可能并不准确,这些label仅仅标示能发现的异常,但是k-means却能找到未知的异常。

 2.读取数据

    val rawDataPath = "Your kddcup.data.txt Path"
    val rawData = sc.textFile(rawDataPath)

    val labelsAndData = rawData.flatMap { line =>
      val buffer = line.split(',').toBuffer
      if (buffer.length == 42) {
        buffer.remove(1, 3)
        val label = buffer.remove(buffer.length - 1)
        val vector = Vectors.dense(buffer.map(_.toDouble).toArray)
        Some(label, vector)
      } else {
        None
      }
    }

数据除掉了第2,3,4列,最后一列数据。

 3. K-Means算法

     val kmeans = new KMeans()
      kmeans.setK(k)   //默认的K为2
      kmeans.setRuns(10) //找寻中心点运行次数
      kmeans.setEpsilon(1.0e-6) //找寻中心点每次变化距离,越小越远
      val model = kmeans.run(data)

使用生成的model并聚类

val clusterLabelCount = labelsAndData.map { case (label,datum) =>
    val cluster = model.predict(datum)
    (cluster,label)					
}.countByValue
					
clusterLabelCount.toSeq.sorted.foreach {case ((cluster,label),count) =>
println(f"$cluster%1s$label%18s$count%8s")
}

4.如何选择K

K的选择是个问题,正常说来,K值越大,聚类的效果越好。想象下,如果每个点都是单独的一个类。。

另外,我们可以使用其他点距离中心点的距离来查看聚类的效果:

    def distance(a: Vector, b: Vector) = {
      math.sqrt(a.toArray.zip(b.toArray).map(p => p._1 - p._2).map(p => p*p).sum)
    }

    def distToCentroid(datum: Vector, model: KMeansModel) = {
      val cluster = model.predict(datum)
      val centroid = model.clusterCenters(cluster)
      distance(centroid, datum)
    }

    def clusteringScore(data: RDD[Vector], k: Int) = {
      val kmeans = new KMeans()
      kmeans.setK(k)
      kmeans.setRuns(10)
      kmeans.setEpsilon(1.0e-6)
      val model = kmeans.run(data)
      data.map(datum => distToCentroid(datum, model)).mean()
    }

    (30 to 150 by 10 ).map(k => clusteringScore(data,k)).foreach(println)

 有了评估,我们可以依次查看K的大小对聚类的影响。

关于如何分析K-means Clustering 问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


本文名称:如何分析K-meansClustering
文章分享:http://azwzsj.com/article/ppcecc.html