日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

AGNES算法

發布時間:2023/11/28 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)

測試結果:

總結

以上是生活随笔為你收集整理的AGNES算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。