原文鏈接:https://blog.csdn.net/u012500237/article/details/65437525
參考文章:http://www.360doc.com/content/19/0623/20/99071_844396658.shtml
1. 分層聚類算法簡介
分層聚類法就是對給定數據對象的集合進行層次分解,根據分層分解采用的分解策略,分層聚類法又可以分為凝聚的(agglomerative,即自上而下)和分裂的(divisive,即自下而上)分層聚類。
其有點是可以將結果以樹狀圖譜的形式展現出來,讓研究人員根據需要自己划分簇;
1.1 分裂法:
分裂法指的是初始時將所有的樣本歸為一個類簇,然后依據某種准則進行逐漸的分裂,直到達到某種條件或者達到設定的分類數目。用算法描述:
輸入:樣本集合D,聚類數目或者某個條件(一般是樣本距離的閾值,這樣就可不設置聚類數目)
輸出:聚類結果
1.將樣本集中的所有的樣本歸為一個類簇;
repeat:
2.在同一個類簇(計為c)中計算兩兩樣本之間的距離,找出距離最遠的兩個樣本a,b;
3.將樣本a,b分配到不同的類簇c1和c2中;
4.計算原類簇(c)中剩余的其他樣本點和a,b的距離,若是dis(a)<dis(b),則將樣本點歸到c1中,否則歸到c2中;
util:達到聚類的數目或者達到設定的條件
示例:
在平面上有6個點:p0(1,1), p1(1,2), p2(2,2), p3(4,4), p4(4,5), p5(5,6),我現在需要對這6個點進行聚類,對應着上邊的步驟我可以這樣做:
1.將所有的點歸為一個類簇c(p0,p1,p2,p3,p4,p5)
repeat:
2.在類簇c中計算他們的距離(簡單的歐式距離)我們可以得到:
由上邊的表格可以看出距離最遠的兩個點為p0和p5
3.將p0分配到類簇c1,將p5分配到類簇c2;
4.查表可以看出,剩余的點中p1和p2與p0的距離小,所以將它們兩個歸到類簇c1中;p3和p4與p5的距離小,所以將它們兩個歸到類簇c2中。這樣我們得到了一次新的聚類 結果c1=(p1,p2,p3),c2=(p3,p4,p5);
util: 若是我要求就聚類成兩個,則這個聚類到此結束,最終我們的聚類 結果是(p1,p2,p3)和(p3,p4,p5)。若是我要求同一個類中,最大樣本距離不大於sqrt(2),那么上述的分類結果沒有到達要求,則需要返回到repeat處繼續聚類,因為c1中的樣本的距離都不大於sqrt(2),所以不需要再分了;而類簇c2中的dis(p3,p5)=sqrt(5)>sqrt(2),還需要繼續分,c2最后分聚類成兩個類(p3,p4)和(p5),這樣我們最終得到了三個類簇(p1,p2,p3)、(p3,p4)和(P5)。
1.2 凝聚法:
凝聚法指的是初始時將每個樣本點當做一個類簇,所以原始類簇的大小等於樣本點的個數,然后依據某種准則合並這些初始的類簇,直到達到某種條件或者達到設定的分類數目。用算法描述:
輸入:樣本集合D,聚類數目或者某個條件(一般是樣本距離的閾值,這樣就可不設置聚類數目)
輸出:聚類結果
1.將樣本集中的所有的樣本點都當做一個獨立的類簇;
repeat:
2.計算兩兩類簇之間的距離(后邊會做介紹),找到距離最小的兩個類簇c1和c2;
3.合並類簇c1和c2為一個類簇;
util: 達到聚類的數目或者達到設定的條件
示例:
1.首先經所有的樣本看作是一個類簇,這樣我可以得到初始的類簇有6個,分別為c1(p0),c2(p1),c3(p2),c4(p3),c5(p4),c6(p5)
repeat:
2.由上邊的表可以得到兩兩類簇間的最小距離(並不是唯一,其他兩個類簇間距離也可能等於最小值,但是先選取一個)是1,存在類簇c1和c2之間
注意:這個類簇間距離的計算方法有許多種。
- 就是取兩個類中距離最近的兩個樣本的距離作為這兩個集合的距離,也就是說,最近兩個樣本之間的距離越小,這兩個類之間的相似度就越大
- 取兩個集合中距離最遠的兩個點的距離作為兩個集合的距離
- 把兩個集合中的點兩兩的距離全部放在一起求一個平均值,相對也能得到合適一點的結果。
- 取兩兩距離的中值,與取均值相比更加能夠解除個別偏離樣本對結果的干擾。
- 把兩個集合中的點兩兩的距離全部放在一起求和然后除以兩個集合中的元素個數
- 求每個集合的中心點(就是將集合中的所有元素的對應維度相加然后再除以元素個數得到的一個向量),然后用中心點代替集合再去就集合間的距離
前四種,在點擊打開鏈接中有介紹,后邊的兩種在工業界也經常使用,當然,還會有其他的一些方法。
3.合並類簇c1和c2,得到新的聚類結果c1(p0,p1),c3(p2),c4(p3),c5(p4),c6(p5)。
util:若是我們要求聚成5個類別的話,我們這里就可以結束了。但是如果我們設定了一個閾值f,要求若存在距離小於閾值f的兩個類簇時則將兩個類簇合並並且繼續迭代,我們又會回到repeat繼續迭代從而得到新的聚類結果。