一、LPA简介

LPA全称为Label Propagation Algorithm,是一个基于标签传播的非重叠社区发现算法。通过LPA可以对用户群进行聚类,从而实现用户画像。

推荐系统初期,当标签数远远小于未标签数时,传统的监督式学习不适合,可以采用半监督学习,即通过有限的标签传播至未标签的数据。

算法步骤

  • 每个节点拥有独立的标签
  • Step2,标签传播,节点向邻居节点传播自己的标签
  • Step3,标签更新,每个节点的标签更新为邻居节点中出现次数最多的标签。如果存在多个选择,则随机选择一个
  • Step4,如果节点更新后的标签发生了变化,则返回到Step2(激活状态),否则节点进入非激活状态,如果所有图中所有节点均为非激活状态,则标签更新结束。此时具有相同标签的节点属于同一个社区

二、数据集

一些常用的社区发现数据集

  • football.gml
    美国大学生足球联赛的复杂网络,包括115支球队(节点)和616场比赛(边)。实际上参赛的115支球队被分为12个联盟。比赛机制为:联盟内部的球队进行小组赛,然后是联盟之间比赛。
  • karate.gml
    一个美国大学空手道俱乐部的网络,34个成员(节点)和78条边(成员之间存在的友谊关系)
  • dolphins.gml
    长达7年的时间观察新西兰Doubtful Sound海峡 62 只海豚(节点)的交流情况(边)而得到的复杂网络。有 62 个节点,159 条边。

gml是一种图描述语言。
以football.gml数据集为例,graph中分为node和egde两部分。
node部分的id为唯一标识,label为标签,value为所属联盟,是一个静态属性。
edge部分为两个结点的id。

graph
[
  directed 0
  node
  [
    id 0
    label "BrighamYoung"
    value 7
  ]
  node
  [
    id 1
    label "FloridaState"
    value 0
  ]
edge
  [
    source 47
    target 2
  ]
  edge
  [
    source 47
    target 39
  ]

二、networkx

1、代码

import networkx as nx
from networkx.algorithms import community
import matplotlib.pyplot as plt

# 数据加载
G = nx.read_gml('./football.gml')
# 可视化
nx.draw(G,with_labels=True) 
plt.show()

# 社区发现
communities = list(community.label_propagation_communities(G))
print(communities)
print(len(communities))

2、运行结果在这里插入图片描述

分为7个类别(聚类个数为动态数据,不确定)

[{'Purdue', 'Toledo', 'Kent', 'Minnesota', 'NorthernIllinois', 'Connecticut', 'Illinois', 'Northwestern', 'MiamiOhio', 'PennState', 'WesternMichigan', 'BowlingGreenState', 'Michigan', 'Marshall', 'Indiana', 'CentralMichigan', 'Akron', 'Iowa', 'Buffalo', 'MichiganState', 'Ohio', 'BallState', 'EasternMichigan', 'Wisconsin', 'OhioState'}, {'Baylor', 'KansasState', 'Kansas', 'Nebraska', 'TexasTech', 'IowaState', 'Colorado', 'Texas', 'Missouri', 'OklahomaState', 'Oklahoma', 'TexasA&M'}, {'Mississippi', 'Florida', 'Tennessee', 'Vanderbilt', 'Alabama', 'Auburn', 'LouisianaState', 'Arkansas', 'Georgia', 'MississippiState', 'Kentucky', 'SouthCarolina'}, {'BoiseState', 'ArkansasState', 'Idaho', 'UtahState', 'SanDiegoState', 'NevadaLasVegas', 'NewMexico', 'NorthTexas', 'BrighamYoung', 'NewMexicoState', 'AirForce', 'ColoradoState', 'Wyoming', 'Utah'}, {'Washington', 'OregonState', 'UCLA', 'WashingtonState', 'California', 'ArizonaState', 'Stanford', 'Oregon', 'Arizona', 'SouthernCalifornia'}, {'LouisianaTech', 'CentralFlorida', 'NorthCarolinaState', 'Temple', 'VirginiaTech', 'NotreDame', 'Houston', 'LouisianaLafayette', 'AlabamaBirmingham', 'FloridaState', 'Cincinnati', 'Clemson', 'SouthernMississippi', 'GeorgiaTech', 'Army', 'Tulane', 'BostonCollege', 'EastCarolina', 'Pittsburgh', 'Louisville', 'MiamiFlorida', 'MiddleTennesseeState', 'Syracuse', 'Virginia', 'LouisianaMonroe', 'NorthCarolina', 'Duke', 'Memphis', 'Navy', 'WestVirginia', 'WakeForest', 'Rutgers', 'Maryland'}, {'FresnoState', 'Rice', 'TexasChristian', 'SouthernMethodist', 'Tulsa', 'Nevada', 'Hawaii', 'SanJoseState', 'TexasElPaso'}]
7

三、igraph

igaph可以处理百万级节点的网络,比networrkx强大。

1、代码

import igraph
g = igraph.Graph.Read_GML('./football.gml')
igraph.plot(g)
print(g.community_label_propagation())

2、运行结果

分为10个类别

Clustering with 115 elements and 10 clusters
[ 0] 0, 4, 9, 16, 23, 41, 93, 104
[ 1] 1, 25, 33, 37, 45, 89, 103, 105, 109
[ 2] 2, 6, 13, 15, 32, 39, 47, 60, 64, 100, 106
[ 3] 3, 5, 10, 40, 52, 72, 74, 81, 84, 98, 102, 107
[ 4] 7, 8, 21, 22, 51, 68, 77, 78, 108, 111
[ 5] 11, 24, 28, 50, 69, 90
[ 6] 12, 14, 18, 26, 31, 34, 38, 42, 43, 54, 61, 71, 85, 99
[ 7] 17, 20, 27, 36, 44, 48, 56, 57, 58, 59, 62, 63, 65, 66, 70, 75, 76, 86,
     87, 91, 92, 95, 96, 97, 112, 113
[ 8] 19, 29, 30, 35, 55, 79, 80, 82, 94, 101
[ 9] 46, 49, 53, 67, 73, 83, 88, 110, 114
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐