Preface:
想法:一開始,將每個點都視為一個群集。接下來,則找出最相近的兩個群集,將其合併為一個新群集。重覆以上的合併動作,直到結束.(Example for Agglomerative Clustering):
Algorithm:
Example:
考慮 4 個點: P = {(1, 1), (2, 2), (3, 5), (4, 4)}, k=2. 在此,我們將兩個群集的距離,定義為它們重心的距離:
底下為套用 Basic Agglomerative Clustering 演算法的過程:
幾種 Clusters 的距離測度方式:
兩個點的距離很容易定義,但如何定義兩個群集的距離 但如何定義兩個群集的距離 但如何定義兩個群集的距離 但如何定義兩個群集的距離?
* Single Link
* Complete Link
* Average Link
* Centroid (center of cluster)
* Medoid (a centrally located point in the cluster)
Toolkit Usage:
這個演算法可以使用工具 "BAgg.groovy" 來實現, 使用範例如下:
- // 1) Prepare data
- def datas = [[1, 1], [2, 2], [3, 1], [2, 4],
- [11,4], [12,4], [13,4], [14,4],
- [2,14], [3,13], [3,14],
- [12,13], [13,12], [13,13], [14,14]]
- // 2) Run Basic Agglomerative Clustering algorithm
- printf "\t[Info] Running Basic Agglomerative Clustering...\n"
- BAgg ba = new BAgg()
- def rt = ba.run(datas, /*Input data vector list*/
- 4, /*How many clusters being output*/
- ba.completeLinkDistClu /*Choose Complete Linkage*/
- )
- printf "\n"
- // 3) Output Cluster Result
- printf "\t[Info] Output Clustering Result:\n"
- def K = rt[0]
- def I = rt[1]
- K.eachWithIndex{ v, p->
- printf "\t\tC%d: [%s]\n", p, I[p].sort().join(",")
- v.each{
- printf "\t\t\t[%s]\n", it.join(",")
- }
- }
沒有留言:
張貼留言