我有一个定向加权图,我使用networkx成功创建。
我试图在这个网络上产生一些统计推断,但我遇到了麻烦。他们在这里:
(i)网络的平均程度。 (我唯一能找到的是average_degree_connectivity,它返回一个字典而不是一个浮点数,具有整个网络的平均度)
(ii)网络的平均加权度。 (与上述相同)
(iii)网络的平均聚类系数。 (我知道我必须使用nx.average_clustering(g),但是我如何考虑它是加权有向图的事实?我不断得到错误: NetworkXError :('聚类算法未定义','用于有向图。')
谢谢!
答案 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