当前位置:   article > 正文

标签传播算法(LPA)Python实现_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

目的就是将上面的图中的结点聚类成两部分,转换为下面的图:


加载数据用的函数:

  1. def loadLpaData(filename):
  2. f = open(filename,'r')
  3. data = {}
  4. for i in f.readlines():
  5. order,ship = i.split()[0],i.split()[1]
  6. ships = ship.split(',')
  7. data.setdefault(order,ships)
  8. f.close()
  9. return data
获取数目最多的相邻接点,有多个的话随机选一个:

  1. def getMost(ships):
  2. import collections
  3. counter = collections.Counter(ships)
  4. tmp = sorted(counter.items(),key = lambda x:x[1])
  5. maxc = tmp[-1][1]
  6. maxset = []
  7. for i in tmp:
  8. if i[1] == maxc:maxset.append(i[0])
  9. import random
  10. random.shuffle(maxset)
  11. return maxset[0]
更新标签:

  1. def updateShips(cluster,data):
  2. for _ in data.keys():
  3. data[_] = [cluster[i] for i in data[_]]

检查是否已经收敛,简单检查,不严谨,出现死循坏也不是没有可能:

  1. def checkStatus(cluster,data):
  2. flag = 0
  3. for d in data.keys():
  4. if cluster[d] != getMost(data[d]):return 0
  5. return 1
主函数:

  1. def main(mydata):
  2. data = mydata.copy()
  3. cluster = dict([(_,_) for _ in data.keys()])
  4. while 1:
  5. if checkStatus(cluster,data):break
  6. for i in cluster.keys():
  7. cluster[i] = getMost(data[i])
  8. updateShips(cluster,data)
  9. return cluster

  1. data = loadLpaData('LPAdataset')
  2. main(data)

运行结果:




别的训练集没有测试。

检查是否已经收敛,简单检查,不严谨,出现死循坏也不是没有可能
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/339091
推荐阅读
相关标签
  

闽ICP备14008679号