數學模型 機器學習 系統聚類(system clustering) Python實現

初始有m個數據, 那麼系統聚類一開始就有m個類, 再根據類之間的距離函數, 將最近的類聚集在一起, 直到用戶設定的K

a=[[1,0],
   [1,1],
   [3,2],
   [4,3],
   [2,5]]
cluster=[]
for i in range(shape(a)[0]):
    cluster.append([i])
a=array(a)
centers=a.copy()
centers=centers.astype('float')
m,n=shape(a)
我們給出一個簡單的例子, 只有5條數據

我依次演示這個聚類過程

for k in range(m-1):#m
    d=zeros((m-k,m-k))
    for i in range(m-k):
        for j in range(i+1,m-k):
            d[i,j]=mandist(centers[i],centers[j])
    nzInd=nonzero(d)                               #take care of it
    minInd=d[nzInd].argmin(0)
    mA=nzInd[0][minInd]
    mB=nzInd[1][minInd]
    cluster[mA].extend(cluster[mB])
    cluster.remove(cluster[mB])
    print cluster
    for i in range(m-k-1):
                                                  #cluster distance: core method
        centers[i]=mean(a[cluster[i]],axis=0)
結果爲

[[0, 1], [2], [3], [4]]
[[0, 1], [2, 3], [4]]
[[0, 1], [2, 3, 4]]
[[0, 1, 2, 3, 4]]
注意到這裏有兩個可供我們修改的地方

一個是距離函數,  這裏我使用的是馬氏距離, 而距離還有歐式距離之類的

def mandist(vecA,vecB):
    return sum(abs(vecA-vecB))
二是類距離函數, 這裏我使用的是重心距離. 類距離函數還有 最近鄰 最遠距 等方法

       centers[i]=mean(a[cluster[i]],axis=0)





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