Agglomerative Hierarchical Clustering-聚合層次聚類

目錄

 

算法描述

簇間距離

數據比較

聚合層次聚類的問題

Question

學習來源


算法描述

  聚合層次聚類是一種自下而上的算法,首先將每個樣本都視爲一個簇,然後開始按一定規則,將相似度高的簇進行合併,最後所有樣本都形成一個簇或達到某一個條件時,算法結束。

  確定簇與簇之間相似度是該算法的要點,而這裏的相似度是由簇間距離來確定的,簇間距離短(小)的相似度高,簇間距離長(大)的相似度低。

簇間距離

MIN
  MIN,又稱爲“單鏈”,即取兩個簇之間距離最近的兩個點的距離(兩個簇間的最小邊長)。

                                                            d(u,v)=min(dist(u[i],v[j]))
  單鏈技術適合處理非橢圓形狀的簇,但是對於噪聲和離羣點十分敏感。

MAX
  
MAX,又稱爲“全鏈”,即取兩個簇之間距離最遠的兩個點的距離(兩個簇間的最大邊長)。

                                                           d(u,v)=max(dist(u[i],v[j]))
  全鏈技術生成的簇形狀偏向於圓形,且不易受到噪聲和離羣點的影響,但是容易使大的簇破裂。

組平均
  組平均,這裏簡單介紹兩種。
  一是非加權組平均(UPGMA)

                                                         d(u,v)=\sum_{ij}(\frac{dist(u[i],v[j])}{(|u|*|v|)})
  其中|u|和|v|分別表示簇u和簇v的元素個數。
  二是加權組平均(WPGMA)
                                                       d(u,v)=\frac{dist(s,v)+dist(t,v)}{2}
  其中u是由s和t合併形成的。
  通常情況下非加權更爲可靠,除非由於重採樣等原因,導致需要考慮樣本權值時,纔會使用加權。

質心距離
  質心距離,指的是簇質心與簇質心之間的距離。這裏簡單描述兩種質心距離。
  一種是UPGMC,即                     
                                                      dist(u,v)=||c_{u}-c_{v}||_{2}
  其中c_{u}c_{v}分別爲簇u和簇v的聚類中心;
  另一種是WPGMC,即新簇質心取合併的兩個簇的質心均值(取質心的方法不同)。
  使用質心距離計算簇間相似度的方法,與其他方法有一個明顯的區別,就是用於計算距離的數據,可能是不存在於樣本的數據。簡而言之,使用其他方法計算簇間距離,都是基於簇中某個樣本去跟另一個簇的某個樣本計算,而合併後,計算的基礎也還是簇中的樣本,而使用質心距離,簇合並後,質心數據是會發生變化的,質心變化後,質心數據就可能不存在於樣本數據裏。
  因而,在簇不斷合併的過程中,其他方法計算簇間距離,簇間距離是遞增的,而使用質心距離計算,簇間距離不一定遞增。舉個例子:在第K-1輪,簇s和簇t的簇間距離爲a',在第K輪,簇u(由簇s和簇t合併而來)和簇v的簇間距離爲a。則若是使用質心距離計算得出的簇間距離a'和a,可能會有a<a'的情況(即合併後與簇v更相似);而若是使用其他方法計算得出的簇間距離a'和a,則一定有a>a'(因爲由於計算距離的數據不變,若a<a',即意味有簇s(簇t)和簇v的簇間距離爲a,則必定有簇s(簇t)與簇v先合併,而非簇s與簇t先合併)。

沃德方差最小化
                                    d(u,v)=\sqrt{\frac{|s|+|v|}{T}dist(s,v)^{2}+\frac{|t|+|v|}{T}dist(t,v)^{2}-\frac{|v|}{T}d(s,t)^{2}}
  其中u是s和t合併形成的,而T=|s|+|t|+|v|,|*|等於簇*的元素個數

數據比較

  在以上的描述裏,可知,在樣本數據固定的情況下,影響聚類結果的因素主要有兩個,計算簇於簇之間相似度的方法和距離的計算公式。下面我們通過編程結果來看看,在兩個因素影響下,Agglomerative Hierarchical Clustering算法的效果。

  使用歐式距離計算樣本距離,分別使用MIN,MAX,沃德方差最小化,非加權組平均計算相似度。
  左邊樹圖爲各簇聚合順序,右邊散點圖爲聚合結果(將樣本數據聚合成3類)

歐式距離-MIN

 

歐式距離-MAX
歐式距離-沃德方差最小化
歐式距離-UPGMA

   

  使用MAX計算簇間相似度,分別使用歐式距離,堪培拉距離,明氏距離,切比雪夫距離計算樣本距離。
  左邊樹圖爲各簇聚合順序,右邊散點圖爲聚合結果(將樣本數據聚合成3類)

歐式距離-MAX
堪培拉距離-MAX
明氏距離-MAX
切比雪夫距離-MAX

所用代碼:
 

# -*- coding: utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import linkage
from scipy.cluster.hierarchy import dendrogram
from sklearn.cluster import AgglomerativeClustering
from itertools import cycle
from sklearn.datasets import make_blobs

#產生的數據個數
n_samples = 3000
#數據中心點
centers = [[2, 2], [-1, -1], [1, -2]]
#生產數據
X, labels = make_blobs(n_samples=n_samples, centers=centers, cluster_std=1,random_state=0)
variables = ['X', 'Y']
# 層次聚類樹
df = pd.DataFrame(X, columns=variables, index=labels)
'''
pdist:計算樣本距離,其中參數metric代表樣本距離計算方法
(euclidean:歐式距離
minkowski:明氏距離
chebyshev:切比雪夫距離
canberra:堪培拉距離)

linkage:聚類,其中參數method代表簇間相似度計算方法
(single:  MIN
ward:沃德方差最小化
average:UPGMA
complete:MAX)
'''
row_clusters = linkage(pdist(df, metric='canberra'), method='complete')
print(pd.DataFrame(row_clusters, columns=['row label1', 'row label2', 'distance', 'no. of items in clust.'],
                   index=['cluster %d' % (i + 1) for i in range(row_clusters.shape[0])]))

#繪圖 層次聚類樹
row_dendr = dendrogram(row_clusters, labels=labels)
plt.tight_layout()
plt.title('canberra-complete' )
plt.show()

#凝聚層次聚類,應用對層次聚類樹剪枝
n_clusters_=3 #分三類
'''
使用Agglomerative Hierarchical Clustering算法
其中參數affinity代表樣本距離計算方法  參數linkage代表簇間相似度計算方法
'''
ac=AgglomerativeClustering(n_clusters=n_clusters_,affinity='canberra',linkage='complete')
labels = ac.fit_predict(X)
print ('cluster labels:%s'%labels)

#繪圖
plt.figure(1)
plt.clf()
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(0,3), colors):
    ##根據lables中的值是否等於k,重新組成一個True、False的數組
    my_members = labels == k
    ##X[my_members, 0] 取出my_members對應位置爲True的值的橫座標
    plt.plot(X[my_members, 0], X[my_members, 1], col + '.')
plt.title('canberra-complete' )
plt.show()

聚合層次聚類的問題

  聚合層次聚類的每一步都是着力於將兩個最相似的簇合並,達到了局部最優,但是,由於該操作無法根據之後的結果,對之前的聚類結果進行更新,所以,聚合層次聚類不一定能通過每一次的局部最優,最後達到(轉化爲)全局最優。例如,在以上的程序實驗裏,可以看出,在樣本數據存在某些對應的‘極值’時,對應的相似度計算方法或距離計算方法,是無法得出很好的聚類結果的。因此,一般而言,我們可以先用其他的一些聚類方法(例如k-means等),先將樣本數據聚合成初步的簇羣,然後再用聚合層次聚類對簇羣進行聚類。

Question

  以上是我學習聚合層次聚類法時的學習筆記,首先感謝各路大神的學習分享。而在此之外,我還存在一些疑問,希望知道答案的各位讀者不吝賜教,回覆一下答案或想法,謝謝。

  1.如果兩個以上的簇羣間相似度是一樣的,根據編譯器的代碼自行選擇合併其中的兩個,這種合併方式,是否會影響到聚類的結果?如果有影響,影響的程度大不大?

  2.筆記中關於使用同一種簇羣相似度計算方法,不同樣本距離計算方法的聚類結果的比較,是否有意義?沒有意義的原因或者結論(意義)是什麼?(因爲我好像還沒有看到過類似的數據比較與結論)

 

學習來源

https://blog.csdn.net/qq_39388410/article/details/78240037
https://blog.csdn.net/qq_40793975/article/details/83272380#t0
https://www.cnblogs.com/CVFans/p/4103430.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章