標籤傳播演算法(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,乙個元素在結果中只能屬於乙個類別,但在社群發現演算法裡,乙個元素可以隸屬於不同的類別。這種聚類結果更貼近於生活中的場景,乙個人可以有多重屬性,不同的屬性特徵會驅使他歸到不同的類別裡。...