这里来总结一些NetworkX的最基本使用方法。首先,NetworkX安装后,其源码的位置在:%Python安装目录%\Lib\site-packages\networkx-1.7-py2.7.egg\networkx下,可以阅读其源码了解实现细节。另外,NetworkX在线帮助文档在:http://networkx.github.com/documentation/development/
作为初学者,甚至有些朋友之前都没接触过Python,那么入门的NetworkX使用方法就是使用其进行一些最简单的复杂网络分析,这里以有向网络为例,来总结一些最基础的网络度量指标的计算。
分析复杂网络时,最先想到的是其度分布,如果是无向网络(下面代码中无向或有向网络,都用G表示),那么可以通过:
nx.degree_histogram(G)
def degree_analysis(G): in_degree = [] out_degree = [] list_in=G.in_degree() list_out=G.out_degree() for each_node in list_in: in_degree.append(list_in[each_node]) for each_node in list_out: out_degree.append(list_out[each_node])
def prob_density_function(xs): distKeys = range(min(xs),max(xs)+1) pdf = dict([(k,0) for k in distKeys]) for x in xs: pdf[x] += 1 return pdf
def cumlutive_degree_distribution(pdf): pdf_temp=pdf scope = range(min(pdf),max(pdf)+1) for degree in scope: k=degree+1 while k<=max(pdf): pdf[degree]+=pdf_temp[k] k+=1 return pdf
依然返回一个dictionary,键为度数,对应的值为大于或等于该度数的节点个数。使用上面两个function,我们就可以得到有向网络的入度、出度的累积度分布图了。另外,往往我们需要获取一个网络的很多度量指标,下面这个function给出了些例子,假设我们需要将网络度量指标输出到某个文件中:
def basic_info(G): f=open('basic_info.txt','w') f.write('网络节点数:') f.write(str(G.number_of_nodes()) + '\n') f.write('网络边数:') f.write(str(G.size()) + '\n') f.write('网络边加权和:') f.write(str(G.size(weight='weight')) + '\n') scc=nx.strongly_connected_components(G)#返回强连通子图的list wcc=nx.weakly_connected_components(G)#返回弱连通子图的list f.write('弱连通子图个数:') f.write(str(len(wcc)) + '\n') f.write('强连通子图个数:') f.write(str(len(scc)) + '\n') largest_scc=scc[0]#返回最大的强连通子图 f.write('最大强连通子图节点数:') f.write(str(len(largest_scc)) + '\n') f.write('有向图平均路径长度:') f.write(str(nx.average_shortest_path_length(G)) + '\n') G=G.to_undirected() f.write('平均聚类系数:') f.write(str(nx.average_clustering(G)) + '\n') f.write('平均路径长度:') f.write(str(nx.average_shortest_path_length(G)) + '\n')
大家稍微看看就知道代码具体含义。今天就总结这么多。
这里再补充一点,上面用到了中文的编码和注释,如果直接用Python去解析,可能会报错,这时只需要在py文件最开头加上一行:# -*- coding:GBK -*-或# -*- coding:UTF-8 -*-就可以。具体看用到什么汉字编码方式。