community-01 社区发现算法概述


社区

  1. 社交网络:用户之间通过某些行为关系构成的网路。这些行为根据业务场景可以是:点击、关注、好友、一起打游戏、一起开会、一起聊天。
  2. 社区:社交网络中,用户之间连接较为紧密的子网络,可以看做是一个社区。通常社区内的用户连接较为紧密,社区之间的用户连接较为稀疏
  3. 社区发现(Community Detection):则是在大规模的社交网络中,找出不同的社区,对用户进行划分
  4. 社区发现,仅仅是利用社交网络结构来对节点进行划分,相比于GNN网络,少了节点的特征。

社区发现算法

图分割

  1. 这类算法大多属于迭代二分法,核心思想是把图分割成两个子图,然后继续迭代。经典的算法为 Kernighan-Lin算法(KL算法)
  2. KL算法属于一种贪婪算法:
    1. 定义社区内边数和社区间边数的增益函数Q,算法就是最大化Q来确定社区
    2. 具体步骤是先随机化切割多个社区,将某个社区的节点移动/交换到另外一个社区,计算此时整个网络的Q值。从初始阶解开始搜索,直到找不到更优的候选解为止
    3. 必须指定子图大小,实际应用比较困难
  3. 其他的图分割算法类似,无非就是在Q的定义,社区划分效率上做改进

聚类算法

  1. 一般说的社区发现的聚类算法指GN算法,但是计算复杂度高,实际应用不现实
  2. 可以做的是根据社交网络的性质把用户构建成序列,然后用word2vec训练用户向量,最后用聚类算法,使不同的用户向量分到不同的类中,形成社区。原理比较简单,可实现,但是需要根据业务经验指定聚类的簇心数

标签传播

LPA(Label Propagation Algorithm), 比较简单

  1. 对所有节点指定一个唯一的标签,标签体系根据业务确定
  2. 对每一个节点,统计邻居节点的标签,选择最多的标签赋给当前节点。
  3. 迭代刷新,直到收敛

比较依赖初始化标签的选择,而且邻居节点标签最大的有多个时随机选择,增加了随机性。

基于模块度的算法

  1. 模块度是衡量一个社区划分好坏的指标,同时也可以作为目标函数迭代算法
  2. 模块度经历过几个版本,目前主流的定义如下:
    在这里插入图片描述
  • 第二个公式注意区分A和δ, A是指v和w两个节点连接的时候为1,δ是指v和w所在的社区在一个社区的时候为1
  • 第二个公式就是计算v和w相连且在一个社区的边数量在v和w相连的所有边数量的占比。也就是社区内部总边数和网络总边数的比例。2m表示所有边总和*2,因为两个节点相连无向图会有两条边
  • 第三个公式:kv*kw,表示随机情况下,v和w连接的期望,除以2m就表示随机情况下v和w相连的占比。
  • 简单理解:A(vw)可以看作是节点v和节点w在同一个社区的边数之和。kv*kw/2m可以看作v和w在随机情况下连接的边数期望。如果社区分得好,节点内连接的数肯定是要比随机分配的时候该社区内节点连接的数要大的。随意Q越大越好。

Louvain算法以及实现

在这里插入图片描述
1.第一步:初始化每个节点为1个社区,然后遍历每个节点,判断当前节点移到邻居节点所在社区使模块度增益情况。选择模块度增益最大的社区作为节点要加入的社区。直到整个模块度都不发生增长。
2. 第二步:将第一步得到的社区聚合成一个点,生成社区的带新的网络,重复第一步。
3. 缺点:采用贪婪思想很容易将整个社区划分“过拟合”。因为Fast Unfolding是针对点遍历,很容易将一些外围的点加入到原本紧凑的社区中,导致一些错误的合并。这种划分有时候在局部视角是优的,但是全局视角下会变成劣的。后面提出一种基于模块密度的算法,可以解决该问题:Network community detection using modularity density measures

其中,模块度变化可以用以下公式计算:
4. 模块度
在这里插入图片描述
在这里插入图片描述

  1. 模块度增益:即加入某个节点i时Q的变化
    在这里插入图片描述

代码实现:

  1. 原理实现:louvain算法python实现
  2. 调包实现:networkx+python-louvain

其中调用networkx时,可用以下函数加载自己的数据:

def load_graph(path):
    nodes = []
    edges = []
    with open(path) as text:
        for line in text:
            vertices = line.strip().split()
            if len(vertices) == 3:
                vi = int(vertices[0])
                vj = int(vertices[1])
                w = float(vertices[2])
            else:
                vi = int(vertices[0])
                vj = int(vertices[1])
                w = 1.0

            edges.append((vi, vj, w))

            if vi not in nodes:
                nodes.append(vi)
            if vj not in nodes:
                nodes.append(vj)
    G = nx.Graph()
    G.add_nodes_from(nodes)
    G.add_weighted_edges_from(edges)
    return G
  1. networkx api: networkx
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 重叠社区发现算法是一种用于社交网络分析的算法,可以揭示社交网络存在的不同重叠社区结构。在Python,可以使用NetworkX库来实现重叠社区发现算法。 首先,需要导入NetworkX库,并创建一个有向或无向来表示社交网络。然后,可以使用NetworkX的相关函数来执行重叠社区发现算法。 一种常见的重叠社区发现算法是基于节点的重叠社区结构的Louvain算法。以下是一个示例代码: ``` import networkx as nx import community # 创建一个无向表示社交网络 G = nx.Graph() # 添加节点和边 G.add_nodes_from([1, 2, 3, 4, 5]) G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5), (1, 5)]) # 使用Louvain算法进行重叠社区发现 communities = community.greedy_modularity_communities(G) # 打印每个节点所属的重叠社区 for i, com in enumerate(communities): print("Community", i+1, ":", com) ``` 上述代码首先导入了NetworkX库,并创建了一个无向G。然后使用Louvain算法的greedy_modularity_communities函数找到每个节点所属的重叠社区,最后打印出每个节点所属的重叠社区。 此外,还有其他重叠社区发现算法可供选择,例如在论文《Overlapping Community Detection in Social Networks: The State-of-the-Art and Comparative Study》介绍的一种方法称为COPRA算法。 希望以上内容对于重叠社区发现算法在Python的实现有所帮助。 ### 回答2: 重叠社区发现算法是一种用于识别社交网络重叠社区的方法。它能够发现网络存在的多个社区,并且允许一个节点同时属于不同的社区。 在Python,我们可以使用NetworkX库来实现重叠社区发现算法。NetworkX是一个用于创建、操作和研究复杂网络的Python库,具有强大的功能和易用的接口。 首先,我们需要引入NetworkX库并创建一个对象。可以使用NetworkX提供的各种方法来加载网络数据,例如从文件读取或手动添加节点和边。 接下来,我们可以使用现有的重叠社区发现算法来识别的重叠社区。NetworkX库提供了一些常见的重叠社区发现算法实现,例如Louvain算法、BigClam算法等。我们可以根据具体需求选择适合的算法。 调用重叠社区发现算法函数后,我们将获得一个包含重叠社区信息的结果对象。这个结果对象可以让我们查看每个节点属于哪些社区,并且可以对结果进行进一步的分析和可视化。 最后,我们可以根据实际需求决定如何使用重叠社区发现算法的结果。例如,我们可以根据节点在不同社区的重叠程度进行节点影响力分析,或者通过比较不同社区的结构特征来进行社区比较和聚类分析。 在这个简要的解答,我向您介绍了使用PythonNetworkX库来实现重叠社区发现算法的基本步骤。具体的实施细节和算法选择取决于实际应用的需求和网络数据的特点。 ### 回答3: 重叠社区发现算法是一种用于识别复杂网络存在的社区结构的方法。该算法可以帮助我们理解网络的内部连接方式和节点之间的关系,从而更好地研究网络的演化规律和功能。 在Python,可以使用第三方库NetworkX来实现重叠社区发现算法。首先,我们需要导入NetworkX库,并创建一个有向或无向的对象: ```python import networkx as nx # 创建一个无向对象 G = nx.Graph() ``` 然后,我们可以通过添加节点和边来构建网络结构: ```python # 添加节点 G.add_node(1) G.add_node(2) # 添加边 G.add_edge(1, 2) ``` 接下来,我们可以使用第三方库`community`的`louvain`函数来进行重叠社区发现: ```python import community # 使用Louvain算法进行重叠社区发现 partition = community.best_partition(G) # 输出每个节点所属的社区编号 for node, comm_id in partition.items(): print(f"Node {node}: Community {comm_id}") ``` 最后,我们可以根据节点的社区归属,将节点分组为不同的社区: ```python # 创建一个空的字典,用于存储每个社区的节点 communities = {} # 将节点按照所属社区归类 for node, comm_id in partition.items(): if comm_id not in communities: communities[comm_id] = [node] else: communities[comm_id].append(node) # 输出每个社区的节点 for comm_id, nodes in communities.items(): print(f"Community {comm_id}: {nodes}") ``` 通过以上代码,我们就可以实现重叠社区发现算法的功能,并将节点归类到不同的社区。 这是一个简单的用Python实现重叠社区发现算法的示例,实际使用时,还可以根据不同的问题和需求选择其他适合的算法和库来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值