您好,登錄后才能下訂單哦!
如何分析K-means Clustering ,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
一:算法
K-means 算法是機器學(xué)習(xí) 聚類算法中很常用,也是最基本的一種算法。聚類算法屬于無監(jiān)督學(xué)習(xí)算法。算法的步驟分為以下兩步:1,根據(jù)分組大小K的值,找出K個中心點,而這時候其他點也根據(jù)距離中心點的距離劃分給這個中心點。2,找出每個cluster最優(yōu)的中心點,重新分配點,并迭代。
二:Spark MLlib
Spark MLlib 提供了K-means算法的實現(xiàn)。
數(shù)據(jù)來源
數(shù)據(jù)來源于KDD CUP網(wǎng)站,這些數(shù)據(jù)是網(wǎng)絡(luò)連接的數(shù)據(jù),下載
找到data -> kddcup.data.zip 并下載。
數(shù)據(jù)每行格式如下:
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可能并不準(zhǔn)確,這些label僅僅標(biāo)示能發(fā)現(xiàn)的異常,但是k-means卻能找到未知的異常。
2.讀取數(shù)據(jù)
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 } }
數(shù)據(jù)除掉了第2,3,4列,最后一列數(shù)據(jù)。
3. K-Means算法
val kmeans = new KMeans() kmeans.setK(k) //默認(rèn)的K為2 kmeans.setRuns(10) //找尋中心點運行次數(shù) 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的大小對聚類的影響。
關(guān)于如何分析K-means Clustering 問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。