共计 2129 个字符,预计需要花费 6 分钟才能阅读完成。
如何分析 K -means Clustering,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
一:算法
K-means 算法是机器学习 聚类算法中很常用,也是最基本的一种算法。聚类算法属于无监督学习算法。算法的步骤分为以下两步:1,根据分组大小 K 的值,找出 K 个中心点,而这时候其他点也根据距离中心点的距离划分给这个中心点。2,找出每个 cluster 最优的中心点,重新分配点,并迭代。
二:Spark MLlib
Spark MLlib 提供了 K-means 算法的实现。
数据来源
数据来源于 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 问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。