MLlib--PIC算法


轉載請標明出處http://www.cnblogs.com/haozhengfei/p/82c3ef86303321055eb10f7e100eb84b.html 


PIC算法   冪迭代聚類

      PIC算法全稱Power iteration clustering 冪迭代聚類

1.譜聚類

    冪迭代聚類的前身--譜聚類,基於圖論的計算方法。(可以用點來表示對象,對象之間的關系用連線表示,Neo4j 圖數據庫用來做用戶與用戶之間的關系,它可以存兩個對象之間的關系,它是半開源的單機版免費,集群版收費,它的規模不是很大,也就是幾千萬級別,如果數據量很大,也可以用Spark中的圖計算Graphx)

2.譜聚類分割方法

相似度與權重:
   將每條數據當做圖中的每個點,數據與數據之間的相 似度為點和點的邊的權重
譜聚類的分割方法:
        最優分割的原則是使子圖內部邊的權重之和最大, 子圖之間的邊的權重之和最小。
 
        距離越小,相似度越高,那么權重之和越大
        – Mcut(最小割集)
        – Ncut (規范割集)一般使用Ncut多一些,既考慮最小化cut邊又划分平 衡。避免出現很多個單點離散的圖
 
譜聚類的實現方式和步驟_NCut規范格局(如果是 Mcut 采用倒數第二小的特征即為所求):
        1.構建 相似度矩陣(相似度矩陣可用鄰接矩陣表示),指定聚類個數K;
        2.利用相似度矩陣構建 拉普拉斯矩陣L
        3.計算標准化之后的 拉普拉斯矩陣L K個特征向量,並 按照特征值升序排序
        4.對由K個特征向量組成的矩陣按照每行進行 Kmeans聚類
        5.將聚類結果的各個簇分別打上標記, 對應上原數據,輸出結果
 
    補充:
        點與點之間關聯的鄰接矩陣 
        拉普拉斯矩陣 = 度矩陣 - 鄰接矩陣  (度矩陣:無向圖中的度指的是連接一個點的邊有多少,有向圖中有出入度的概念,出度和入度,可以用鄰接矩陣中每一行相加求出 度矩陣)
 
         矩陣M * 向量L = 向量L,但是如果 矩陣M * 向量L = 向量L * 數值a,那么L就是M的特征向量,a就是相應的特征值。(一個矩陣不一定會有特征向量,也可能有很多的特征向量。一個特征向量會有一個特征值,二者是成對出現的)
 
         矩陣的特征值和特征向量,矩陣中的每一行*一個特征向量相當於將矩陣中的一行映射到向量中指定的某一點,這種方式從某種角度上做到了降維。

3.PIC算法VS譜聚類

   PIC和譜聚類算法類似,都是通過 將數據嵌入到由相似矩陣映 射出來的低維子空間中,然后直接或者通過kmean算法得到 聚類結果
 
   它們的 不同點在於如何嵌入及產生低維子空間
        – 譜聚類是通過拉普拉斯矩陣產生的最小向量構造的
        – Pic利用數據規范化的相似度矩陣,采用截斷的快速迭代法

4譜聚類code

train
PowerIterationClustering_new
 1 import org.apache.log4j.{Level, Logger}
 2 import org.apache.spark.rdd.RDD
 3 import org.apache.spark.{SparkConf, SparkContext}
 4 import org.apache.spark.mllib.clustering.PowerIterationClustering
 5 
 6 /**
 7   * Created by hzf
 8   */
 9 object PowerIterationClustering_new {
10 //    E:\IDEA_Projects\mlib\data\pic\train\pic_data.txt E:\IDEA_Projects\mlib\data\pic\model 3 20 local
11     def main(args: Array[String]) {
12         Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
13         if (args.length < 5) {
14             System.err.println("Usage: PIC <inputPath> <modelPath> <K> <iterations> <master> [<AppName>]")
15             System.exit(1)
16         }
17         val appName = if (args.length > 5) args(5) else "PIC"
18         val conf = new SparkConf().setAppName(appName).setMaster(args(4))
19         val sc = new SparkContext(conf)
20         val data: RDD[(Long, Long, Double)] = sc.textFile(args(0)).map(line => {
21             val parts = line.split(" ").map(_.toDouble)
22             (parts(0).toLong, parts(1).toLong, parts(2))
23         })
24 
25         val pic = new PowerIterationClustering()
26                 .setK(args(2).toInt)
27                 .setMaxIterations(args(3).toInt)
28         val model = pic.run(data)
29 
30         model.assignments.foreach { a =>
31             println(s"${a.id} -> ${a.cluster}")
32         }
33         model.save(sc, args(1))
34     }
35 }
View Code
設置運行參數
  1. E:\IDEA_Projects\mlib\data\pic\train\pic_data.txt E:\IDEA_Projects\mlib\data\pic\model 320 local
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM