1. 程式人生 > >標籤傳播演算法(LPA)Python實現

標籤傳播演算法(LPA)Python實現


標籤傳播演算法(LPA)的做法比較簡單:

第一步:為所有節點指定一個唯一的標籤;

第二步:逐輪重新整理所有節點的標籤,直到達到收斂要求為止。對於每一輪重新整理,節點標籤重新整理的規則如下:

對於某一個節點,考察其所有鄰居節點的標籤,並進行統計,將出現個數最多的那個標籤賦給當前節點。當個數最多的標籤不唯一時,隨機選一個。

注:演算法中的記號 N_n^k 表示節點 n 的鄰居中標籤為 k 的所有節點構成的集合。

以上資料來源於:

http://blog.csdn.net/cleverlzc/article/details/39494957

下面我們來簡單實現以下這個演算法:

資料,自己編的:

1	2,3,4
2	1,3,4,7
3	1,2,4
4	1,2,3
5	6,7,8
6	5,7,8
7	2,5,6,8
8	5,6,7

目的就是將上面的圖中的結點聚類成兩部分,轉換為下面的圖:


載入資料用的函式:

def loadLpaData(filename):
    f = open(filename,'r')
    data = {}
    for i in f.readlines():
        order,ship = i.split()[0],i.split()[1]
        ships = ship.split(',')
        data.setdefault(order,ships)
    f.close()
    return data
獲取數目最多的相鄰接點,有多個的話隨機選一個:
def getMost(ships):
    import collections
    counter = collections.Counter(ships)
    tmp = sorted(counter.items(),key = lambda x:x[1])
    
    maxc = tmp[-1][1]
    maxset = []
    for i in tmp:
        if i[1] == maxc:maxset.append(i[0])
    
    import random
    random.shuffle(maxset)
    return maxset[0]
更新標籤:
def updateShips(cluster,data):
    for _ in data.keys():
        data[_] = [cluster[i] for i in data[_]]

檢查是否已經收斂,簡單檢查,不嚴謹,出現死循壞也不是沒有可能:
def checkStatus(cluster,data):
    flag = 0
    for d in data.keys():
        if cluster[d] != getMost(data[d]):return 0
    return 1
主函式:
def main(mydata):
    data = mydata.copy()
    cluster = dict([(_,_) for _ in data.keys()])
    while 1:
        if checkStatus(cluster,data):break
        for i in cluster.keys():
            cluster[i] = getMost(data[i])
            updateShips(cluster,data)
    return cluster

data = loadLpaData('LPAdataset')
main(data)

執行結果:




別的訓練集沒有測試。

檢查是否已經收斂,簡單檢查,不嚴謹,出現死循壞也不是沒有可能