標籤傳播演算法(LPA)Python實現
阿新 • • 發佈:2019-02-01
標籤傳播演算法(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)
執行結果:
別的訓練集沒有測試。