AGNES算法
層次凝聚算法——AGNES
AGNES算法是一種基于層次凝聚的聚類算法,它的思想十分樸素。假設現在有一個待聚類的數據集,那么根據分而治之的思想我們可以首先將每一個樣本點看成是一個類,然后根據一定的規則將這些比較“小”的類進行合并,進而達到最終想要的結果。
那么這個合并的規則是什么?通常我們將樣本點之間的距離看成相似度。在兩個小類中,第一個類和第二個類中的點它們之間的距離有很多,如果第一個類有n個樣本點,第二個類有m個樣本點,那么不同的類點和點之間的距離就會有m*n個,到底如何定義這個規則呢? 一般而言我們有三種方式可采用,不同方式聚類出來的效果可能也不盡相同,即,最小距離,最大距離和平均距離,定義方式皆為字面意思。最小距離就是分處在兩個小類中的距離最近的兩個點,兩點分別處于第一個小類和第二個小類。最大距離也是如此,平均距離就是將兩個類之間的點所有距離加權求和,即所有距離除以距離的個數得出的距離就是平均距離。
AGNES算法的偽代碼:
代碼實現:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasetsdef findmin(mat): #找出距離最小的兩個類temp=mat[0][1]x=0y=0for i in range(mat.shape[0]):for j in range(mat.shape[1]):if mat[i][j]<temp and i!=j:x=iy=jtemp=mat[i][j]return [x,y,temp]
def dis(X,a,b): #采用最大距離temp=0for i in a:for j in b:T=np.linalg.norm(X[i]-X[j],ord=2)if temp<T:temp=Treturn temp
def AGNES(X,k):C=[]m=len(X)for j in range(m):C.append([j])M=np.zeros((m,m))for i in range(m):for j in range(i):M[i][j]=np.linalg.norm(X[i]-X[j],ord=2)M[j][i]=M[i][j]q=mwhile q>k:[x,y,m]=findmin(M)C[x].extend(C[y])C.pop(y)M=np.delete(M,y,axis=0) #刪除第J行和第J列M=np.delete(M,y,axis=1)for j in range(q-1):M[x][j]=dis(X,C[x],C[j]) #更新距離(這一步可以優化,因為在代碼開始階段就已將所有點之間的距離計算完成。)M[j][x]=M[x][j]q=q-1return Cdef plot(X,c):for i in c:x=[]y=[]for j in i:x.append(X[j][0])y.append(X[j][1])plt.scatter(x,y)plt.show()if __name__=="__main__":X=datasets.make_blobs(n_samples=300,centers=3,cluster_std=1.0,shuffle=True,random_state=None)[0]c=AGNES(X,3)plot(X,c)
測試結果:
總結
- 上一篇: FuzzyCMeans算法
- 下一篇: DBSCAN聚类