NetworkX学习笔记-2-基本使用方法举例

这里来总结一些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)

来返回一个表示度分布频率的list,list的元素代表度的数量,在list中的index表示度数。但如果是有向网络,那么分析的过程就要复杂些:

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])

上面这段代码获得两个list,分别是in_degree和out_degree,每个元素表示一个度数,计算度分布时,可以用下面这个function:

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

这里暂没有考虑归一化的问题,返回一个dictionary,键为度数,对应的值为度的个数。而我们在分析度分布时,往往会用累积度分布(cumulative frequency distributions),这里的累积度分布表示大于或等于某个度数k的节点个数。那么基于上面的结果,可以很容易得到累积度分布:

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 -*-就可以。具体看用到什么汉字编码方式。

posted on 2013-03-17 14:12  qysh123  阅读(3747)  评论(0编辑  收藏  举报

导航