当前位置: 首页 > 科技观察

本图聚类Python工具火爆:社区结构可视化、检测

时间:2023-03-17 20:34:12 科技观察

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。最近,又一款Python可视化工具火了起来。这次的功能是检测和可视化图聚类问题的社区结构。有关该项目的帖子一发布在reddit上,就被推到了“机器学习板”列表的顶部。来看看它能做什么用吧~功能亮点这个工具叫做communities,是一个用于图聚类问题社区结构检测的Python库。支持多种算法,包括:Louvain算法;Girvan-Newman算法;层次聚类算法;谱聚类算法;Bron-Kerbosch算法。更好的是,社区还可以将这些算法可视化。了解更多关于导入算法和插入矩阵这里以Louvain算法为例。这是一种基于模块化的社区发现算法,也是一种贪心算法。它根据顶点的共享边将顶点排列成一个社区结构,即将节点划分为多个社区,每个社区共享的连接很少,但同一社区的节点共享的连接很多。最终让整个社交网络呈现出一种模块化聚合的结构,使整个社交网络的模块化最大化。所以首先,我们需要构造一个表示无向图的邻接矩阵,可以带权也可以不带权,矩阵是一个2Dnumpy数组。n*n矩阵表示有n个节点,矩阵的每个位置表示节点之间的边关系。有边则为1,无边则为0。然后,从communities.algorithms导入算法,插入矩阵即可。importnumpyasnpfromcommunities.algorithmssimportlouvain_methodadj_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]])社区,_=louvain_method(adj_matrix)#>>>[{0,1,2},{3,4,5}]接下来输出社区列表,每个社区是一组节点。实现可视化和颜色编码使用社区可视化图形,将节点划分为社区并进行颜色编码,还可以选择深色或浅色背景、保存图片、选择图片分辨率等。draw_communities(adj_matrix:numpy.ndarray,communities:list,dark:bool=False,filename:str=None,seed:int=1)各参数具体含义为:adj_matrix(numpy.ndarray):图的邻接矩阵;dark(bool,optional(default=False)):如果为True,绘图将有深色背景,否则为浅色背景;filename(strorNone,optional(default=None)):图片可以通过文件名路径保存为PNG格式;设置None以交互方式显示图像;dpi(intorNone,optional(default=None)):每英寸点数,控制图像的分辨率;seed(int,optional(default=2)):随机种子。具体到Louvain算法的可视化,代码如下:fromcommunities.algorithmssimportlouvain_methodfromcommunities.visualizationimportdraw_communitiesadj_matrix=[...]communities,frames=louvain_method(adj_matrix)draw_communities(adj_matrix,communities)动画可以分发到社区的过程。louvain_animation(adj_matrix:numpy.ndarray,frames:list,dark:bool=False,duration:int=15,filename:str=None,dpi:int=None,seed:int=2)参数含义如下:adj_matrix(numpy.ndarray):图的邻接矩阵;frames(list):算法每次迭代的字典列表;每个字典有两个键:“C”包含从节点到社区的查找表,“Q”表示图的模块化值;这个字典列表就是louvain_method的第二个返回值;dark(bool,optional(default=False)):如果为True,则动画为深色背景和配色方案,否则为浅色配色方案;duration(int,optional(default=15)):所需的动画持续时间,以秒为单位;filename(strorNone,optional(default=None)):通过文件名路径将动画保存为GIF;将无设置为以交互方式显示动画;dpi(intorNone,optional(default=None)):每英寸点数,控制动画分辨率;seed(int,optional(default=2)):随机种子。比如空手道俱乐部网络中Louvain算法的动画:fromcommunities.algorithmssimportlouvain_methodfromcommunities.visualizationimportlouvain_animationadj_matrix=[...]communities,frames=louvain_method(adj_matrix)louvain_animation(adj_matrix,frames)我们首先可以看到动态过程Louvain算法:中的所有节点,将每个节点视为一个独立的社区;接下来遍历每个节点的邻居节点,判断是否将该节点加入到邻居节点所在的社区中,以提高模块性;这个过程不断迭代,直到每个节点的社区归属稳定为止;最后,将同一社区内的所有节点压缩成一个新节点,并计算新节点的权重,直到整个图的模块化稳定。可以通过文末链接自行尝试其他算法~另外,还可以用于社区间邻接矩阵、拉普拉斯矩阵、模块化矩阵。对于这款工具,不少网友给出了“牛逼”、“真酷!”等花哨的赞美,表示这正是他们所需要的。当然也有网友提出疑问,比如:是否可以指定迭代次数执行(例如:earlystop)?开发人员说:没有,但是对于某些算法,可以指定将图划分为多少个社区。关于作者JonathanShobrook,项目开发者,目前是美国一家电子商务公司的软件工程师。之前GitHub上的热门项目Rebound也是他创建的,目前已经获得了3.5kstars。更多内容请点击下方链接学习~相关链接:[1]https://github.com/shobrook/communities[2]https://www.reddit.com/r/MachineLearning/comments/lozys9/p_i_made_communities_a_library_of_clustering/