AGNES算法
層次凝聚算法——AGNES
AGNES算法是一種基于層次凝聚的聚類算法,它的思想十分樸素。假設(shè)現(xiàn)在有一個(gè)待聚類的數(shù)據(jù)集,那么根據(jù)分而治之的思想我們可以首先將每一個(gè)樣本點(diǎn)看成是一個(gè)類,然后根據(jù)一定的規(guī)則將這些比較“小”的類進(jìn)行合并,進(jìn)而達(dá)到最終想要的結(jié)果。
那么這個(gè)合并的規(guī)則是什么?通常我們將樣本點(diǎn)之間的距離看成相似度。在兩個(gè)小類中,第一個(gè)類和第二個(gè)類中的點(diǎn)它們之間的距離有很多,如果第一個(gè)類有n個(gè)樣本點(diǎn),第二個(gè)類有m個(gè)樣本點(diǎn),那么不同的類點(diǎn)和點(diǎn)之間的距離就會有m*n個(gè),到底如何定義這個(gè)規(guī)則呢? 一般而言我們有三種方式可采用,不同方式聚類出來的效果可能也不盡相同,即,最小距離,最大距離和平均距離,定義方式皆為字面意思。最小距離就是分處在兩個(gè)小類中的距離最近的兩個(gè)點(diǎn),兩點(diǎn)分別處于第一個(gè)小類和第二個(gè)小類。最大距離也是如此,平均距離就是將兩個(gè)類之間的點(diǎn)所有距離加權(quán)求和,即所有距離除以距離的個(gè)數(shù)得出的距離就是平均距離。
AGNES算法的偽代碼:
代碼實(shí)現(xiàn):
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasetsdef findmin(mat): #找出距離最小的兩個(gè)類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]) #更新距離(這一步可以優(yōu)化,因?yàn)樵诖a開始階段就已將所有點(diǎn)之間的距離計(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)
測試結(jié)果:
總結(jié)
- 上一篇: FuzzyCMeans算法
- 下一篇: DBSCAN聚类