共計 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 行業資訊頻道了解更多相關知識。