Networkx统计推断

时间:2015-03-15 18:39:07

标签: python graph social-networking networkx

我有一个定向加权图,我使用networkx成功创建。

我试图在这个网络上产生一些统计推断,但我遇到了麻烦。他们在这里:

(i)网络的平均程度。 (我唯一能找到的是average_degree_connectivity,它返回一个字典而不是一个浮点数,具有整个网络的平均度)

(ii)网络的平均加权度。 (与上述相同)

(iii)网络的平均聚类系数。 (我知道我必须使用nx.average_clustering(g),但是我如何考虑它是加权有向图的事实?我不断得到错误: NetworkXError :('聚类算法未定义','用于有向图。')

谢谢!

4 个答案:

答案 0 :(得分:6)

  

(i)网络的平均程度。 (我能找到的唯一一个是   average_degree_connectivity,返回字典而不是a   单浮点数与整个网络的平均度数)

假设您的Graph对象为G

degrees = G.degree()
sum_of_edges = sum(degrees.values())

计算平均值只是除以节点数。

  

(ii)网络的平均加权度。 (与上述相同)

获取所有节点的列表,为每个节点获取所有边的列表,为每个节点总结权重属性:

edgesdict = G.edge
total = 0
for node_adjacency_dict in edgesdict.valuess():
    total += sum([adjacency.get("weight",0) for adjacency in node_adjacency_dict.values()]) 
  

(iii)网络的平均聚类系数。 (我知道   我必须使用nx.average_clustering(g),但是我如何看待这个事实   它是加权有向图吗?我一直在   错误:NetworkXError :('聚类算法未定义',   '用于有向图。'))

重点是,在定义它之前,它没有明确定义。我认为,对于StackOverflow答案来说,这有点多了,所以我给你留下了为你的特定问题定义算法的问题。

  

(iv)最大的最短路径长度   网络。 (我知道你发现巨大的组成部分:巨人=   max(nx.connected_component_subgraphs(G),key = len)但我们如何得到   它中最大的最短路径长度?)

运行ipython或其他东西。输入giant.;您将获得使用giant可以执行的操作列表。

答案 1 :(得分:2)

以下是@ marcus-müller写的更多想法。

对于平均度数(关于你的有向图的注释,这是进出度的总和)

In [1]: import networkx as nx
G
In [2]: G = nx.DiGraph()

In [3]: G.add_edge(1,2,weight=7)

In [4]: G.add_edge(3,4,weight=17)

In [5]: sum(G.degree().values())/float(len(G))
Out[5]: 1.0

In [6]: sum(G.degree(weight='weight').values())/float(len(G))
Out[6]: 12.0

NetworkX中没有加权定向群集的定义。已有提案https://github.com/networkx/networkx/issues/859但尚未完成实施。

对于有向图,最大连通分量的概念分为两​​个定义。弱连接的组件是在考虑图的无向版本时连接的组件(用无向的方式替换每个有向边)。强连接组件是每对节点彼此可达的组件(具有路径)。

答案 2 :(得分:1)

从 Networkx 2.5 (2021) 开始,您可以使用 networkx.info(G) 获得图形的平均度

代码:

print(nx.info(G))

输出:

Name:
Type: Graph
Number of nodes: 85
Number of edges: 63
Average degree:   1.4824

答案 3 :(得分:0)

关于点(i):有向图的网络平均度, Networkx内部计算如下:

nnodes = G.number_of_nodes()
deg = sum(d for n, d in G.in_degree()) / float(nnodes)
info += "Average in degree: %8.4f\n" % deg
deg = sum(d for n, d in G.out_degree()) / float(nnodes)
info += "Average out degree: %8.4f" % deg

你可以check it on github