社区发现算法问题&&NetworkX&&Gephi

在做东西的时候用到了社区发现,因此了解了一下有关社区发现的一些问题

1,社区发现算法

(1)SCAN:一种基于密度的社团发现算法

Paper: 《SCAN: A Structural Clustering Algorithm for Networks》  Auther: Xiaowei Xu, Nurcan Yuruk, Zhidan Feng, Thomas A. J. Schweiger  Conference: SIGKDD 2007

主要概念:

  • 节点相似度定义为两个节点共同邻居的数目与两个节点邻居数目的几何平均数的比值(这里的邻居均包含节点自身)。
  • 节点的 ? - 邻居定义为与其相似度不小于 ? 的节点所组成的集合
  • 核节点是指 ? 邻居的数目大于 μ 的节点。
  • 节点 w 是核节点 v 的 ? 邻居,那么称从 v 直接可达 w.
  • 节点 v 可达 w ,当且仅当存在一个节点链 v1,…,vn∈V,v1=v,vn=w,使得 vi+1 是 从vi 直接可达的。
  • 若核节点u可达节点v和节点w,则称节点v和节点w相连.

具体算法:

  • 对于每个未分配社团的节点 v ,检查 v 是否是核节点,是核节点则将其直接可达节点分配到一个社团中(社团标号记为该节点),并将其?-邻居放进队列中,重复进行1步骤(类似于对直接可达节点进行DFS)。
  • 若 v 不是核节点则将其标志为non-member。
  • 最后检查所有的non-menber节点,若其相邻节点存在于两个及以上的社团中,则将其标为hub节点,否则标为outlier。
ALGORITHM SCAN(G=<V, E>, ε, μ)

// all vertices in V are labeled as unclassified;
for each unclassified vertex v ∈ V do
// STEP 1. check whether v is a core;
    if COREε,μ(v) then
// STEP 2.1. if v is a core, a new cluster is expanded;
        generate new clusterID;
        insert all x ∈ Nε (v) into queue Q;
        while Q ≠ 0 do
            y = first vertex in Q;
            R = {x ∈ V | DirREACHε,μ(y, x)};
            for each x ∈ R do
                if x is unclassified or non-member then
                    assign current clusterID to x;
                if x is unclassified then
                    insert x into queue Q;
            remove y from Q;
    else
// STEP 2.2. if v is not a core, it is labeled as non-member
        label v as non-member;
end for.
// STEP 3. further classifies non-members
for each non-member vertex v do
    if (? x, y ∈ Γ(v) ( x.clusterID ≠ y.clusterID) then
        label v as hub
    else
        label v as outlier;
end for.
end SCAN.

(2)复杂网络社区结构发现算法-基于python networkx clique渗透算法

Paper: G. Palla, I. Derényi, I. Farkas, and T. Vicsek, “Uncovering the overlapping community structure of complex networks in nature and society,” Nature, vol. 435, pp. 814-818, 2005.

clique渗透算法简介:

对于一个图G而言,如果其中有一个完全子图(任意两个节点之间均存在边),节点数是k,那么这个完全子图就可称为一个k-clique。

进而,如果两个k-clique之间存在k-1个共同的节点,那么就称这两个clique是“相邻”的。彼此相邻的这样一串clique构成最大集合,就可以称为一个社区(而且这样的社区是可以重叠的,即所谓的overlapping community,就是说有些节点可以同时属于多个社区)。下面第一组图表示两个3-clique形成了一个社区,第二组图是一个重叠社区的示意图。

2.NetWorkX安装使用和示例

NetworkX是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。这里主要介绍clique渗透算法,

(1)安装

首先是软件的下载地址, https://pypi.python.org/pypi/networkx/,我下载的是whl文件

接着就是安装whl文件,具体安装过程网上有好多可以参考这个 windows7下怎样安装whl文件(python)

接着安转完就是看如何执行算法了,我使用了pycharm IDE,我执行的是clique渗透算法,下边是这个算法的主要实现


"""Find k-clique communities in graph using the percolation method.

A k-clique community is the union of all cliques of size k that can be reached through adjacent (sharing k-1 nodes) k-cliques.Parameters:

k (int) – Size of smallest clique    cliques (list or generator) – Precomputed cliques (use networkx.find_cliques(G))

Return type:

Yields sets of nodes, one for each k-clique community.
"""import networkx as nx
import sys
import time
def find_community(graph,k):
    return list(nx.k_clique_communities(graph,k))
G = nx.Graph()
##testFile=open("F://2.txt","r") ##2-6
testFile=open("F://21.txt","r") ##5,10
for line in testFile:
    a=line.strip(‘\n‘).split(",")
    G.add_edge(a[0],a[1])

for k in range(5,10):
        print ("############# k值: %d ################" % k)
        start_time = time.clock()
        rst_com = find_community(G,k)
        end_time = time.clock()
        print ("计算耗时(秒):%.3f" % (end_time-start_time))
        print ("生成的社区数:%d" % len(rst_com))
        print(rst_com)

其中文件的格式是

a,b
c,d
a,c
a,d

3.gephi

Gephi是一款开源免费跨平台基于JVM的复杂网络分析软件, 其主要用于各种网络和复杂系统,动态和分层图的交互可视化与探测开源工具。

gephi.org, 可在官网上免费下载此软件。

目前gephi已有中文教程,网址为:udemy.com/gephi 。

参考文献:http://blog.csdn.net/DawnRanger/article/details/51108433

时间: 2024-11-08 20:22:30

社区发现算法问题&&NetworkX&&Gephi的相关文章

模块度与Louvain社区发现算法

Louvain算法是基于模块度的社区发现算法,该算法在效率和效果上都表现较好,并且能够发现层次性的社区结构,其优化目标是最大化整个社区网络的模块度. 模块度(Modularity) 模块度是评估一个社区网络划分好坏的度量方法,它的物理含义是社区内节点的连边数与随机情况下的边数只差,它的取值范围是 [−1/2,1),其定义如下: $$Q = \frac{1}{2m}\sum_{i,j}[A_{ij} - \frac{k_ik_j}{2m}]\delta(c_i,c_j)$$ $$\delta(u,

Louvain社区发现算法

社区发现(Community Detection)算法(转)

作者: peghoty 出处: http://blog.csdn.net/peghoty/article/details/9286905 社区发现(Community Detection)算法用来发现网络中的社区结构,也可以看做是一种聚类算法. 以下是我的一个 PPT 报告,分享给大家. 从上述定义可以看出:社区是一个比较含糊的概念,只给出了一个定性的刻画. 另外需要注意的是,社区是一个子图,包含顶点和边. 下面我们以新浪微博用户对应的网络图为例,来介绍相应的社区发现算法. 这里在相互关注的用户

[转] 社区发现(Community Detection)算法

作者: peghoty 出处: http://blog.csdn.net/peghoty/article/details/9286905 社区发现(Community Detection)算法用来发现网络中的社区结构,也可以看做是一种聚类算法. 以下是我的一个 PPT 报告,分享给大家. 社区是一个子图,包含顶点和边. 下面我们以新浪微博用户对应的网络图为例,来介绍相应的社区发现算法.     这里在相互关注的用户之间建立连接关系,主要是为了简化模型,此时对应的图为无向图. 当然,我们也可以采用

社区发现SLPA算法

社区(community)定义:同一社区内的节点与节点之间关系紧密,而社区与社区之间的关系稀疏. 设图G=G(V,E),所谓社区发现是指在图G中确定nc(>=1)个社区C={C1,C2,...,Cnv},使得各社区的顶点集合构成V的一个覆盖. 若任意两个社区的顶点集合的交际均为空,则称C为非重叠社区(disjoint communities);否则称为重叠社区(overlapping communities). SLPA(Speaker-listener Label Propagation Al

社区发现(Community Detection)算法

作者: peghoty 出处: http://blog.csdn.net/peghoty/article/details/9286905 社区发现(Community Detection)算法用来发现网络中的社区结构,也可以看做是一种聚类算法. 以下是我的一个 PPT 报告,分享给大家. 从上述定义可以看出:社区是一个比较含糊的概念,只给出了一个定性的刻画. 另外需要注意的是,社区是一个子图,包含顶点和边. 下面我们以新浪微博用户对应的网络图为例,来介绍相应的社区发现算法. 这里在相互关注的用户

什么是社区发现?

  朋友要我通俗地讲讲什么是"社区发现",这下还真觉得有些为难.之前写东西,上来就是概念.术语.公式和算法,这些对于有专业基础的朋友当然没问题,但对于那些没有基础而且也只想知道个大概的朋友显然就不适合了.尝试着写了写,觉得通俗和严谨之间的度还真不容易把握.看来,通俗易懂地表达东西也是门需要花时间修炼的功夫,以后这样的内容还是要多多练习才行. 如果你仔细观察,你会发现,我们的生活中存在着各种各样的网络,如科研合作网络.演员合作网络.城市交通网络.电力网.以及像 QQ.微博.微信这样的社交

复杂网络社区结构发现算法-基于python networkx clique渗透算法

前言 最近因为业务数据分析的需要,看社区发现相关的东东稍多些,刚刚写过一篇基于igraph C library的方法(http://km.oa.com/group/22323/articles/show/240332),然后想用kclique衍生的clique渗透算法时发现igraph C library 并未提供现成的api,对于懒人来说,这很不幸.既而发现networkx这个python包中是有的(且是唯一一个用于社区发现的算法),故而折腾折腾,记录下处理过程,供同道朋友们参考吧. 准备工作

社区发现的学习笔记

社区发现 社团结构与计算机中的图分割和社会学中的分级聚类有密切关系. 分级聚类是寻找网络中社团结构的一类传统算法,根据向网络中添加边还是从网络中移除边,该类算法可分为两类:凝聚方法.分裂方法. 一.基于模块度 **无向无权图:** 模块度(Modularity)是近年常用的一种衡量社团划分质量的标准.基本思想就是把社团划分后的网络与相应的零模型进行比较,来估量实际的网络和随机的网络的差别. 社团内部边的总和:Q(real)=1/2*Sigma(a(ij)*delta(C(i),C(j))) 零模