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

2021-07-14 13:21:48 字數 2196 閱讀 6918

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

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

第二步:

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

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

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

以上資料**於:

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

資料,自己編的:

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:

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)

執行結果:

別的訓練集沒有測試。

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

標籤傳播演算法

標籤傳播演算法 label propagation algorithm,lpa 是由zhu等人於2002年提出,它是一種基於圖的半監督學習方法,其基本思路是用已標記節點的標籤資訊去 未標記節點的標籤資訊。lpa演算法思路簡單清晰,其基本過程如下 1 為每個節點隨機的指定乙個自己特有的標籤 2 逐輪重...

標籤傳播演算法

參考文獻 slpa speaker listener based information propagation algorithm 演算法引入了listener和speaker兩個形象化概念,在標籤更新過程中,待更新的節點我們稱為listener,該節點的領域節點我們稱為speaker,因為lis...

基於標籤傳播演算法的社群發現

社群發現是一種廣義上的聚類,區別於傳統聚類的核心是類別與類別之間可以有重疊部分。在傳統的聚類演算法,如k means,乙個元素在結果中只能屬於乙個類別,但在社群發現演算法裡,乙個元素可以隸屬於不同的類別。這種聚類結果更貼近於生活中的場景,乙個人可以有多重屬性,不同的屬性特徵會驅使他歸到不同的類別裡。...