Label propagation是基于标传播的一种社区划分算法。Label Propagation Algorithm简称LPA算法,也可以是说是一种划分小团体的算法。这种社区划分的方法有很多,LPA只是一种最简单的一种。比如,以微博为例,用户在微博上可以关注感兴趣的人,同样也会被其他人关注,这样用户和用户之间就存在了关系,使用LPA就可以对用户进行聚类操作,相同兴趣点的用户可以聚类在一起,划分一起之后就可以统一进行推荐了,这样就可以用LPA。 ###社区划分 社区结构指的就是在网络中由一些节点构成的特定分组,在同一个分组内的节点通过节点,之间的连接边紧密的连接在一起,而在分组和分组之间,其连接比较松散,称每一个分组就是一个社区。由上就可以知道社区是网络中节点的集合,这些节点内部连接较为紧密而外部连接较为稀疏。 在一个社区网络中每一个用户其实就是一个节点,用户之间通过互相关注关系构成了用户之间的社交关系,用户之间通过转发感兴趣的东西,从而就构成了用户之间的兴趣关系。通过将不同用户划分到不同的社区,使得每一个社区是都有不同的属性,比如兴趣,领域等等。而在两个兴趣之间的关系相对来说就比较弱一些的就被分成了两个社区,这两个社区之间的相对连接会较为稀疏。比如:




def loadData(filePath):
f = open(filePath)
vector_dict = {}
edge_dict = {}
for line in f.readlines():
lines = line.strip().split(" ")
for i in range(2):
if lines[i] not in vector_dict:
vector_dict[lines[i]] = int(lines[i])
edge_list = []
if len(lines) == 3:
edge_list.append(lines[1 - i] + ":" + lines[2])
else:
edge_list.append(lines[1 - i] + ":" + "1")
edge_dict[lines[i]] = edge_list
else:
edge_list = edge_dict[lines[i]]
if len(lines) == 3:
edge_list.append(lines[1 - i] + ":" + lines[2])
else:
edge_list.append(lines[1 - i] + ":" + "1")
edge_dict[lines[i]] = edge_list
return vector_dict, edge_dict

def get_max_community_label(vector_dict, adjacency_node_list):
label_dict = {}
for node in adjacency_node_list:
node_id_weight = node.strip().split(":")
node_id = node_id_weight[0]
node_weight = int(node_id_weight[1])
if vector_dict[node_id] not in label_dict:
label_dict[vector_dict[node_id]] = node_weight
else:
label_dict[vector_dict[node_id]] += node_weight
sort_list = sorted(label_dict.items(), key=lambda d: d[1], reverse=True)
return sort_list[0][0]
得到邻居节点最多的社区标签数。
def get_max_community_label(vector_dict, adjacency_node_list):
label_dict = {}
for node in adjacency_node_list:
node_id_weight = node.strip().split(":")
node_id = node_id_weight[0]
node_weight = int(node_id_weight[1])
if vector_dict[node_id] not in label_dict:
label_dict[vector_dict[node_id]] = node_weight
else:
label_dict[vector_dict[node_id]] += node_weight
sort_list = sorted(label_dict.items(), key=lambda d: d[1], reverse=True)
return sort_list[0][0]
检查是否到结束条件了。
def check(vector_dict, edge_dict):
for node in vector_dict.keys():
adjacency_node_list = edge_dict[node]
node_label = vector_dict[node]
label = get_max_community_label(vector_dict, adjacency_node_list)
if node_label >= label:
continue
else:
return 0
return 1
主函数。
def label_propagation(vector_dict, edge_dict):
t = 0
print('First Label: ')
while True:
if (check(vector_dict, edge_dict) == 0):
t = t + 1
print('iteration: ', t)
for node in vector_dict.keys():
adjacency_node_list = edge_dict[node]
vector_dict[node] = get_max_community_label(vector_dict, adjacency_node_list)
else:
break
return vector_dict
最后效果:

###附上GitHub代码:github.com/GreenArrow2…