最近因为业务数据分析的需要,看社区发现相关的东东稍多些,刚刚写过一篇基于igraph C library的方法(http://blog.csdn.net/a_step_further/article/details/51176973),然后想用kclique衍生的clique渗透算法时发现igraph C library 并未提供现成的api,对于懒人来说,这很不幸。既而发现networkx这个python包中是有的(且是唯一一个用于社区发现的算法),故而折腾折腾,记录下处理过程,供同道朋友们参考吧。
networkx安装的时候,会依赖 decorator、setuptools 这样的包,所以全部需要安装
安装好之后,进入python交互环境,测试一下
import networkx as nx
如果没有报错,就算准备好基础工作了。可以开始使用networkx这个网络分析包了。因为本文聚焦于网络中社区结构的发现,故而networkx的基础使用方法就略过了,各位看官可自行google之。
clique渗透算法简介
对于一个图G而言,如果其中有一个完全子图(任意两个节点之间均存在边),节点数是k,那么这个完全子图就可称为一个k-clique。
进而,如果两个k-clique之间存在k-1个共同的节点,那么就称这两个clique是“相邻”的。彼此相邻的这样一串clique构成最大集合,就可以称为一个社区(而且这样的社区是可以重叠的,即所谓的overlapping community,就是说有些节点可以同时属于多个社区)。下面第一组图表示两个3-clique形成了一个社区,第二组图是一个重叠社区的示意图。
networkx中实现的clique渗透算法接口如下:
找社区(上代码)
以无向无权图为示例
import sys
import networkx as nx
import time
def find_community(graph,k):
return list(nx.k_clique_communities(graph,k))
if __name__ == '__main__':
if len(sys.argv) < 2:
print "Usage: %s <InputEdgeListFile>" % sys.argv[0]
sys.exit(1)
edge_list_file = sys.argv[1]
wbNetwork = nx.read_edgelist(edge_list_file,delimiter='\t')
print "图的节点数:%d" % wbNetwork.number_of_nodes()
print "图的边数:%d" % wbNetwork.number_of_edges()
for k in xrange(3,6):
print "############# k值: %d ################" % k
start_time = time.clock()
rst_com = find_community(wbNetwork,k)
end_time = time.clock()
print "计算耗时(秒):%.3f" % (end_time-start_time)
print "生成的社区数:%d" % len(rst_com)
算法输出及讨论
单机64G内存的机器上测试了几个不同规模的网络,相应的输出如下:
可见该算法在单机上适合于计算10万以下节点中小规模网络社区结构。对于大规模的社交网络,必须要用分布式集群才行啊。
复杂网络
在现代科学中具有极为重要的地位,它被广泛应用于社会、生物、物理、化学等领域。本文将介绍如何使用
Python
语言实现
复杂网络
的构建、可视化和分析。我们可以使用
Python
中的
networkx
库来构建
复杂网络
。聚类系数是指网络中一个节点的邻居节点之间已经形成了多少条边。最短路径是指从一个节点到另一个节点的最短路径长度。度分布是指每个节点的度数在整个网络中出现的频率。我们可以使用
networkx
库来对
复杂网络
进行各种分析。我们可以使用matplotlib库来绘制
复杂网络
。
problem: Prove that the following problem is NP-complete:given an undirected graph G=(V,E) and an integer k,
return a
cli
que
of size k as well as an independent set of size k,provided both exist.
本人因为研究(谈不上研究,就是借鉴大佬们的方法)的是这个方向,
发现
使用
python
的不是很多,而且有些比较模糊,本人就自己的理解,分析在学习这个途中遇到的一些问题以及解决的办法,希望对你们有帮助,码字不易,顺带点个赞呗~
author:xiao黄
缓慢而坚定的生长
安装
networkx
这里就不过多讲述了,可以参考我的一篇博客。传送门
import
networkx
as nx...
前言最近因为业务数据分析的需要,看
社区
发现
相关的东东稍多些,刚刚写过一篇基于igraph C library的方法(http://km.oa.com/group/22323/articles/show/240332),然后想用k
cli
que
衍生的
cli
que
渗透
算法
时
发现
igraphC library 并未提供现成的api,对于懒人来说,这很不幸。既而
发现
networkx
这个
python
包中是有的...
一、
社区
发现
概述根据图论,加权网络表示为𝐺=(𝑉,𝐸,𝑊),未加权网络表示为𝐺=(𝑉,𝐸),其中𝑉和𝐸表示节点和边的集合,𝑊分别表示𝐸相应的权重,以连接的强度或容量为单位。在未加权的网络中,𝑊被视为1。子图𝑔⊆𝐺是保留原始网络
结构
的图划分。子图的划分遵循预定义(pre-define)的规则,不同的规则可能会导致不同形式的子图。
社区
是代表真实社会现象的一种子图。换句话说,
社区
是一组具有共同特征的人或对象。
一、总体概述
目前针对图网络
结构
,比较热门的一个部分就是知识图谱,知识图谱是基于二元关系知识库,构成网络
结构
,基本组成单位是”实体-关系-实体“的三元组,实体之间通过关系相互联结。
主要可以应用的场景有:风险预测、反欺诈、精准营销、智能搜索等
常用的是采用个人信息进行一个场景构建,构建知识图谱的流程例子如下所示:
1、通过对数据进行清理,抽取,构建知识图谱的节点,比如:姓名、ip、...
算法
是以供水管网数据为例,后面给出了
社区
发现
结果评价指标,模块度的计算结果。如有代码疑问,私聊即可。
注:代码本人手写,未考虑任何效率问题,只是将
算法
过程实现,关于
算法
的介绍需要自行查看。
SCAN
算法
中重要的两个参数为密度阈值(对标DBSCAN中的min_pts),节点
结构
相似度阈值(对标DBSCAN的邻域半径)。其中节点
结构
相似度阈值范围【0,1】,密度阈值最好大于等于2。
import wntr as wr
from plotly import *
import
networkx
as nx
团(
cli
que
):一个无向图的子图,该子图中所有任意两个顶点之间都存在一条边。
极大团(maximal
cli
que
):是一个团,该团不能被更大的团所包含,换句话说,再也不存在一个点能加入这个团。
最大团(maximum
cli
que
):是指一个图中size最大的极大团。团的size是指极大团的顶点个数。
模块度用来衡量一个网络切分的好坏。
It was designed to measure the strength of division of.
k-
cli
que
.:是G的k个顶点的集合,使得每对顶点都有一条边。
k-ECC. A k-ECC (k-edge connected component):G的一个子图,在去掉任何k–1边后,它仍然是连通的。