首先介紹聚類中的層次聚類算法。層次法又分為凝聚的層次聚類和分裂的層次聚類。
凝聚的方法:也稱自底向上的方法,首先將每個對象作為單獨的一個聚類,然后根據性質和規則相繼地合並相近的類,直到所有的對象都合並為一個聚類中,或者滿足一定的終止條件。經典的層次凝聚算法以AGNES算法為代表,改進的層次凝聚算法主要以BIRCH,CURE,ROCK,CHAMELEON為代表。(后面詳細介紹)
分裂的方法:也稱自頂向下的方法,正好與凝聚法相反,首先將所有的對象都看作是一個聚類,然后在每一步中,上層類被分裂為下層更小的類,直到每個類只包含一個單獨的對象,或者也滿足一個終止條件為止。分裂算法將生成與凝聚方法完全相同的類集,只是生成過程的次序完全相反。經典的層次分裂算法以DIANA算法為代表。
AGNES算法
AGNES(AGglomerative NESting)
- 算法最初將每個對象作為一個簇,然后這些簇根據某些准則被一步步地合並
- 兩個簇間的相似度由這兩個不同簇中距離最近的數據點對的相似度來確定
- 聚類的合並過程反復進行直到所有的對象最終滿足簇數目
算法過程
輸入:n個對象,終止條件,簇的數目K
輸出:K個簇,達到終止條件規定簇數目
- 將每個對象當成一個初始簇
- 根據兩個簇中最近的數據點找到最近的兩個簇
- 合並兩個簇,生成新的簇的集合
- 直到達到定義的簇的數目
AGNES算法例題
序號 | 屬性1 | 屬性2 |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 1 |
4 | 2 | 2 |
5 | 3 | 4 |
6 | 3 | 5 |
7 | 4 | 4 |
8 | 4 | 5 |
第1步:根據初始簇計算每個簇之間的距離,隨機找出距離最小的兩個簇進行合並,最小距離為1,合並后1,2兩個點合並為一個簇。
第2步:對上一次合並后的簇計算簇間距離,找出距離最近的兩個簇進行合並,合並后3,4兩個點成為一個簇,
第3步:重復第2步,5,6點成為一個簇。
第4步:重復第2步,7,8點成為一個簇。
第5步:合並{1,2}、{3,4},使之成為一個包含4個點的簇。
第6步:合並{5,6}、{7,8},由於合並后的簇的數目達到用戶輸入的終止條件,程序終止。
步驟 | 最近的簇距離 | 最近的兩個簇 | 合並后的新簇 |
1 | 1 | {1}、{2} | {1、2}、{3}、{4}、{5}、{6}、{7}、{8} |
2 | 1 | {3}、{4} | {1、2}、{3、4}、{5}、{6}、{7}、{8} |
3 | 1 | {5}、{6} | {1、2}、{3、4}、{5、6}、{7}、{8} |
4 | 1 | {7}、{8} | {1、2}、{3、4}、{5、6}、{7、8} |
5 | 1 | {1、2}、{3、4} | {1、2、3、4}、{5、6}、{7、8} |
6 | 1 | {5、6}、{7、8} | {1、2、3、4}、{5、6、7、8} |
AGNES特點:
AGNES實現簡單,但經常會遇到合並點難以選擇的困難。若一旦一組對象被合並,下一步的處理將在新生成的簇上進行。已經做的處理不能撤銷,聚類之間也不能交換對象。一步合並錯誤,可能會導致低質量的聚類結果。
層次凝聚改進算法之BIRCH算法
轉載了大牛的博客,在理解MinCluster時,個人覺得樹圖中最底一層的每一個橢圓形都是一個MinCluster,並不是一個Leaf的所有孩子為一個MinCluster。所以MinCluster的個數不會超過L個,與樹圖吻合。
轉自:http://www.kuqin.com/algorithm/20111016/312976.html
http://www.cnblogs.com/zhangchaoyang/articles/2200800.html
層次凝聚改進算法之CURE算法
絕大多數聚類算法或者擅長處理球形與相似大小的聚類,或者在存在孤立點時變得比較脆弱。CURE( Clustering Using Representatives)算法較好的解決了偏好球形和相似大小的問題,在處理孤立點上也更加健壯。CURE 算法采用了一種新穎的層次聚類算法,該算法選擇基於質心和基於代表對象方法之間的中間策略。它不用單個質心或對象來代表一個簇,而是選擇數據空間中固定數目的具有代表性的點。每一個簇有多於一個的代表點使得 CURE 可以適應非球形的幾何形狀。簇的收縮或凝聚可以有助於控制孤立點的影響。因此,CURE 對於孤立點的處理更加好,而且能夠識別非球形和大小變化較大的簇。對於大型數據庫,它也具有良好的伸縮性,而且沒有犧牲聚類質量。針對大型數據庫,CURE 采用隨機取樣和划分兩種方法的結合:一個隨機樣本首先被划分,每個划分被部分聚類。這些結果簇然后被聚類產生希望的結果。
基本步驟:
⑴ 對數據庫抽樣,得到一個樣本;
⑵ 將樣本划分為 p 個分區,每個分區的規模為n/p。因為聚類首先在每個分區上進行,所以這樣做可以起到加速算法的作用;
⑶ 對每一分區,利用層次算法進行聚類。這提供了關於簇的組成的首次猜測。簇的數目為 n/pq,其中 q為某一常數;
⑷ 刪除異常點。利用兩種不同的技術刪除異常點。第一種技術是將增長緩慢的簇刪除。當簇的數目低於某一閾值時,將僅含有一兩個成員的簇刪除。有可能較近的異常點會成為樣本的一部分,而不能被第一種異常點刪除技術識別出來。第二種技術是在聚類的最后階段,將非常小的簇刪除;
⑸ 為了保證可以在內存中處理,輸入只包括在步驟 3 中各個分區獨自聚類時發現的簇的代表性點;
⑹ 使用 c 個點代表每個簇,對磁盤上的整個數據庫進行聚類。數據庫中的數據項被分配到與其最近的
代表性點表示的簇中。代表性點的集合必須足夠小以適應主存的大小,所以 n 個點中的每一個都要與 ck 個代表性點相比較。
層次凝聚改進算法之ROCK算法
ROCK(Robust Clustering using links)算法采用一種新方法來計算相似形,即基於元組之間的連接數目。如果一對元組的相似形超過某一閾值,則稱這一對元組為鄰居。兩個元組之間的連接數目由它們共同的鄰居數目來定義。ROCK 屬於層次凝聚算法,其相似性度量采用的是連接數目而不是距離的量度。首先數據庫中的數據隨機取出作為樣本,使用“link”將數據進行聚類,最后將數據庫中的其余數據指派到樣本數據完成的簇中,得到最終的聚類結果。
為了進一步了解ROCK算法,我們需要定義幾個變量,並闡述這些變量的含義。
定義1.Θ為使用者自定義的鄰居閾值,相似度函數sim(pi,pj)>=Θ,其中sim(pi,pj)的相似度取值范圍為[0,1],值越大表示越相似。
定義2.pi,pj這兩個數點的相似度采用Jaccard系數,則sim(pi,pj)=(pi∩pj)/(piUpj)。
定義3.link pi¯,pj¯為集合Ni,Nj交叉連接數,其中Ni,Nj分別為pi,pj的鄰居表。
定義4.適合函數(goodness function)
g(Ci,Cj)=link[Ci,Cj]/((ni+nj)1+2f(θ)-ni1+2f(θ)-nj1+2f(θ)),其中Ci,Cj是兩個簇,ni,nj分別是兩個簇中的點的數目,假設以Ci為參考點,每個點概略
有nif(θ),專家選擇的閾值是:f(θ)=(1-θ)/(1+θ)
層次凝聚改進算法之Chameleon
Chameleon采用動態建模來確定一對簇之間的相似度。
在Chameleon中簇的相似度依據如下兩點評估:
- 簇中對象的連接情況
- 簇的鄰近性
也就是說,如果兩個簇的互連性都很高並且它們又很靠近就將其合並。
Chameleon算法的思想是:
- 首先使用一種圖划分算法將k最近鄰圖划分成大量相對較小的子簇
- 然后使用凝聚層次聚類算法,基於子簇的相似度反復地合並子簇
- 為了確定最相似的子簇對,它既考慮每個子簇的互連性,又考慮簇的鄰近性
- 圖划分算法划分k最近鄰圖,使得割邊最小化。也就是說,簇C划分為兩個子簇Ci,Cj時需要切斷的加權和最小。割邊用EC(Ci,Cj)表示,用於評估簇Ci,Cj之間的絕對互連性。
圖1 Chameleon工作過程圖
優點:Chameleon在發現高質量的任意形狀的簇方面具有很強的能力。
缺點:高維數據的處理代價較高,對n個對象最壞情況下需要O(n2)的時間。
聚類算法層次分裂之DIANA
算法思想:
輸入:n個對象,終止條件簇的數目k
輸出:k個簇,達到終止條件規定簇數目
- 將所有對象當成一個初始簇
- for(i=1;i≠k;i++) do begin
- 在所有簇中挑選出具有最大直徑的簇C
- 找出C中與其它點平均相異度最大的一個點P並把P放入splinter group,剩余的放在old party中
- repeat
- 在old party中找出到最近的splinter group中的點的距離不大於到old party中最近點的距離的點,並將該點加入splinter group
- until沒有新的old party的點被分配給spilnter group
- spilnter group和old party為被選中的簇分裂成的2個簇與其它簇一起組成新的簇集合
- end
分裂的層次聚類算法一般較少使用。