0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

发现一个宝藏Python库,玩社区发现算法的不能错过!

Android编程精选 来源:任识算法 2023-02-08 11:11 次阅读
网络是由一些紧密相连的节点组成的,并且根据不同节点之间连接的紧密程度,网络也可视为由不同簇组成。簇内的节点之间有着更为紧密的连接,不同簇之间的连接则相对稀疏。这种簇被称为网络中的社区结构(community structure)。

由此衍生出来的社区发现(community detection)算法用来发现网络中的社区结构,这类算法包括Louvain 算法、Girvan-Newman 算法以及 Bron-Kerbosch 算法等。

最近,在 GitHub 上发现了一个可以发现图中社区结构的 Python 库 communities,该库由软件工程师 Jonathan Shobrook 创建。

6aa6c156-a736-11ed-bfe3-dac502259ad0.png

项目地址:https://github.com/shobrook/communities

首先,该库可以实现以下几种社区发现算法:

  • Louvain 算法
  • Girvan-Newman 算法
  • 层次聚类
  • 谱聚类
  • Bron-Kerbosch 算法

其次,用户还可以使用 communities 库来可视化上述几种算法,下图为空手道俱乐部(Zachary's karate club)网络中 Louvain 算法的可视化结果:

6abd92c8-a736-11ed-bfe3-dac502259ad0.gif

该库的安装方法也非常简单,可采用 pip 的方式安装 communities,代码如下:

importnumpyasnp

fromcommunities.algorithmsimportlouvain_method

adj_matrix=np.array([[0,1,1,0,0,0],
[1,0,1,0,0,0],
[1,1,0,1,0,0],
[0,0,1,0,1,1],
[0,0,0,1,0,1],
[0,0,0,1,1,0]])

communities,_=louvain_method(adj_matrix)

>>communities
[{0,1,2},{3,4,5}]

对于这个 Python 库,很多网友给予了高度评价,表示会去尝试。

6b316234-a736-11ed-bfe3-dac502259ad0.png

算法详解

1、Louvain 算法

louvain_method(adj_matrix:numpy.ndarray,n:int=None)->list

该算法来源于文章《Fast unfolding of communities in large networks》,简称为 Louvian。

作为一种基于模块度(Modularity)的社区发现算法,Louvain 算法在效率和效果上都表现比较好,并且能够发现层次性的社区结构,其优化的目标是最大化整个图属性结构(社区网络)的模块度。

Louvain 算法对最大化图模块性的社区进行贪婪搜索。如果一个图具有高密度的群体内边缘和低密度的群体间边缘,则称之为模图。

示例代码如下:

fromcommunities.algorithmsimportlouvain_methodad

j_matrix=[...]

communities,_=louvain_method(adj_matrix)

2、Girvan-Newman 算法

girvan_newman(adj_matrix:numpy.ndarray,n:int=None)->list

该算法来源于文章《Community structure in social and biological networks》。

Girvan-Newman 算法迭代删除边以创建更多连接的组件。每个组件都被视为一个 community,当模块度不能再增加时,算法停止去除边缘。

示例代码如下:

fromcommunities.algorithmsimportgirvan_newman

adj_matrix=[...]

communities,_=girvan_newman(adj_matrix)

3、层次聚类

hierarchical_clustering(adj_matrix:numpy.ndarray,metric:str="cosine",linkage:str="single",n:int=None)->list

层次聚类实现了一种自底向上、分层的聚类算法。每个节点从自己 的社区开始,然后,随着层次结构的建立,最相似的社区被合并。社区会一直被合并,直到在模块度方面没有进一步的进展。

示例代码如下:

fromcommunities.algorithmsimporthierarchical_clustering

adj_matrix=[...]

communities=hierarchical_clustering(adj_matrix,metric="euclidean",linkage="complete")

4、谱聚类

spectral_clustering(adj_matrix:numpy.ndarray,k:int)->list

这种类型的算法假定邻接矩阵的特征值包含有关社区结构的信息

示例代码如下:

fromcommunities.algorithmsimportspectral_clustering

adj_matrix=[...]

communities=spectral_clustering(adj_matrix,k=5)

5、Bron-Kerbosch 算法

bron_kerbosch(adj_matrix:numpy.ndarray,pivot:bool=False)->list
Bron-Kerbosch 算法实现用于最大团检测maximal clique detection)。图中的最大团是形成一个完整图的节点子集,如果向该子集中添加其他节点,则它将不再完整。将最大团视为社区是合理的,因为团是图中连接最紧密的节点群。因为一个节点可以是多个社区的成员,所以该算法有时会识别重叠的社区。示例代码如下:
fromcommunities.algorithmsimportbron_kerbosch

adj_matrix=[...]

communities=bron_kerbosch(adj_matrix,pivot=True)

可视化

绘图

draw_communities(adj_matrix:numpy.ndarray,communities:list,dark:bool=False,filename:str=None,seed:int=1)

可视化图(graph),将节点分组至它们所属的社区和颜色编码中。返回代表绘图的 matplotlib.axes.Axes。示例代码如下:

fromcommunities.algorithmsimportlouvain_method

fromcommunities.visualizationimportdraw_communities

adj_matrix=[...]

communities,frames=louvain_method(adj_matrix)

draw_communities(adj_matrix,communities)

可视化图如下:

6b4d0958-a736-11ed-bfe3-dac502259ad0.jpg

Louvain 算法的动图展示

louvain_animation(adj_matrix:numpy.ndarray,frames:list,dark:bool=False,duration:int=15,filename:str=None,dpi:int=None,seed:int=2)

Louvain 算法在图中的应用可以实现动图展示,其中每个节点的颜色代表其所属的社区,并且同一社区中的节点聚类结合在一起。

示例代码如下:

fromcommunities.algorithmsimportlouvain_method

fromcommunities.visualizationimportlouvain_animation

adj_matrix=[...]

communities,frames=louvain_method(adj_matrix)

louvain_animation(adj_matrix,frames)

动图展示如下:

6b64fc8e-a736-11ed-bfe3-dac502259ad0.gif

参考链接:

https://www.codenong.com/cs105912940/

https://www.reddit.com/r/MachineLearning/comments/lozys9/p_i_made_communities_a_library_of_clustering/

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4611

    浏览量

    92866
  • 可视化
    +关注

    关注

    1

    文章

    1194

    浏览量

    20938
  • python
    +关注

    关注

    56

    文章

    4796

    浏览量

    84664

原文标题:发现一个宝藏 Python 库,玩社区发现算法的不能错过!

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于复杂网络社区结构的论坛热点主题发现

    社区结构是复杂网络的重要特征之,该文通过构造基于兴趣的论坛用户网络,成功地将社区结构发现的理论与方法应用于论坛热点主题的自动发现,提出了极
    发表于 04-22 08:45 12次下载

    基于链接分析和用户兴趣的微博社区发现算法

    微博网络中的每一个节点代表微博用户,微博用户之间除了存在定的社会关系外,用户本身也具有定的特性。用户之间明显的链接关系可以为
    发表于 11-21 17:06 3次下载

    种基于聚集系数的社区发现算法

    社区发现变得更为复杂。提出了种局部社区发现算法,该算法
    发表于 12-05 16:03 2次下载
    <b class='flag-5'>一</b>种基于聚集系数的<b class='flag-5'>社区</b><b class='flag-5'>发现</b><b class='flag-5'>算法</b>

    基于标签影响力的半同步社区发现算法

    微博网络与社交网络等的交互式社会信息网络规模的快速增长对社区发现提出巨大挑战。标签传播算法( LPA)虽然在时间复杂度上具有很大的优势,但是其内在的多种随机策略使得算法稳定性不高。针对
    发表于 12-17 11:34 0次下载

    种加权稠密子图社区发现算法

    目前,针对复杂网络的社区发现算法大多仅根据网络的拓扑结构来确定社区,然而现实复杂网络中的边可能带有表示连接紧密程度或者可信度意义的权重,这些先验信息对
    发表于 12-25 10:13 0次下载

    融合多维数据的微博社区发现算法

    随着微博用户的不断增加,微博网络已成为用户进行信息交流的平台,针对由于博文长度受限,传统的社区发现算法无法有效解决微博网络的稀疏性等问题,提出了DC-DTM(discovery community
    发表于 01-02 16:26 3次下载
    融合多维数据的微博<b class='flag-5'>社区</b><b class='flag-5'>发现</b><b class='flag-5'>算法</b>

    自动编码器的社区发现算法

    社区结构是复杂网络的重要特征之社区发现对研究网络结构有重要的应用价值.K均值等经典聚类算法是解决社区
    发表于 01-02 18:32 0次下载
    自动编码器的<b class='flag-5'>社区</b><b class='flag-5'>发现</b><b class='flag-5'>算法</b>

    基于标签传播的社交网络的社区发现模型

    针对基于标签传播的复杂网络重叠社区发现算法中预先输入参数在真实网络中的局限性以及标签冗余等问题,提出种基于标签传播的面向大规模学术社交网络的社区
    发表于 01-04 16:49 0次下载
    基于标签传播的社交网络的<b class='flag-5'>社区</b><b class='flag-5'>发现</b>模型

    组合29简单Python代码块,自动发现算法

    本文提出了种基于演化算法的搜索策略,将其AAD中实现。AAD可以基于Python的子集作为语法结构,组合成复杂度相对较高的程序(循环,嵌套块,嵌套函数调用等),并生成可执行的Python
    的头像 发表于 04-19 13:47 3528次阅读

    多层网络社区发现相关研究及对比

    社区发现是复杂网络分析的重要任务」现有的社区发现方法大多面向单层网络,对现实世界中广泛存在的多层网络中的社区
    发表于 04-07 15:41 23次下载
    多层网络<b class='flag-5'>社区</b><b class='flag-5'>发现</b>相关研究及对比

    结合改进差分进化和模块密度的社区发现算法

    引入社区发现中,提出了种结合改进差分进化和模块密度的社区发现算法。该
    发表于 04-12 14:54 4次下载
    结合改进差分进化和模块密度的<b class='flag-5'>社区</b><b class='flag-5'>发现</b><b class='flag-5'>算法</b>

    复杂网络社区发现下的多目标五行环优化算法

    社区结构作为复杂网络的重要特性,对理解网络的功能和结构具有重要意义。为了解决复杂网络的社区发现问题,提出了种多目标五行环优化算法( Mul
    发表于 05-17 16:47 2次下载

    通用的动态社区发现研究框架综述

    随着社交媒体多样性的増加,实时分析社交网络的需求不断増大,动态社区发现的硏究受到了广泛的关注。已有的社区发现综述多是侧重静态社区
    发表于 06-04 15:15 5次下载

    基于谱聚类的多目标复杂网络社区发现算法

    多目标优化算法在复杂网络社区发现中具有很强的竞争力,然而,在处理社区结构较为模糊、网络数据规模大的问题时难以得到满意的效果。为克服现有多目标方法的不足,提岀
    发表于 06-17 15:02 11次下载

    ESN中基于贪婪派系扩张的重叠社区发现算法

    传统局部扩张方法在对企业社会化网络(ESN)中的重叠社区结构进行识别时,存在计算冗余与社区挖掘不彻底的问题。为此,提出种基于贪婪派系扩张的重叠社区
    发表于 06-24 11:16 16次下载