久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何分析K

172次閱讀
沒有評論

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

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計2129字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 灌云县| 清苑县| 东安县| 龙口市| 栾城县| 华宁县| 通州市| 招远市| 凌云县| 广水市| 合江县| 益阳市| 永平县| 贺兰县| 乌什县| 陕西省| 丘北县| 钟祥市| 雷州市| 敦化市| 道孚县| 天长市| 固原市| 封开县| 清原| 长宁县| 西乌珠穆沁旗| 安福县| 沙雅县| 探索| 祁东县| 和硕县| 牙克石市| 镇远县| 铜梁县| 九龙坡区| 神池县| 尚志市| 襄垣县| 衡水市| 青岛市|