为什么 networkx 在查找直径时说我的有向图已断开连接?
Why does networkx say my directed graph is disconnected when finding diameter?
我正在爬取 slideshare.net 图,从我的节点开始,跟踪 BFS 中的所有用户,直到访问的节点数为 1000。
我通过以下方式执行 BFS:
from urllib.request import urlopen
from collections import deque
import sys
import json
import codecs
import csv
import io
import hashlib
import time
import xml.etree.ElementTree as etree
queue = deque(["himanshutyagi11"])
while len_visitedset < 1ooo:
vertex = queue.pop()
if vertex in visited:
continue
visited.add(vertex)
length_visited = len(visited)
print(vertex,length_visited)
crawl(vertex)
crawl() 是一个函数,在该函数中我按照说明进行 slideshare api 查询 here 通过使用我的 shared_secret 和 api_key 创建查询负载(给定在 api 注册时),发送查询并解析存储在变量 'response' 中的 XML 响应。解析后,我将当前节点的联系人添加到队列中。
request_timestamp = int(time.time())
request_hash_string = shared_secret+str(request_timestamp)
request_hash_value = hashlib.sha1(request_hash_string.encode('utf-8')).hexdigest()
request_url = 'https://www.slideshare.net/api/2/get_user_contacts?username_for='+username+'&api_key='+api_key+'&hash='+request_hash_value+'&ts='+str(request_timestamp)
response = etree.parse(urlopen(request_url)).getroot()
# Append all the adjacent nodes of this user to the queue.
for child in response:
friend_name = child[0].text
queue.appendleft(friend_name)
edge_file = open('non_anonymized.csv','a')
for child in response:
f_name = child[0].text # Name of friend is stored in variable 'f_name'
edge_file.write(username+','+f_name+'\n') # username is the name of user currently being crawled
edge_file.close()
在抓取的同时,我还创建了一个 edgelist.csv 文件,其中包含图中的所有边。这个文件好像没问题。
还有其他功能,如 degree()、in_degree()、average_clustering() 似乎工作正常。
然后我使用 networkx 创建一个图,它有 1000 个节点。但是如果我尝试使用以下函数找到该图的直径:
diameter = nx.diameter(graph)
使用上面的代码,我无法找到我的图形的直径,这没有 return 任何东西,我的程序卡在这一行。对可能发生的事情有任何见解吗?
我的是一个连通图。我正在使用 to_undirected()
函数将其转换为无向的。我用有向图累了运行它,我得到了以下错误
networkx.exception.NetworkXError: Graph not connected: infinite path length
我的问题是,我用的是BFS爬虫,怎么断网呢
Python 3.4
Networkx 1.9.1
直径的源代码是here。它依赖于 eccentricity
,这是源代码中的函数。 eccentricity
找到从一个节点到所有其他节点的最短路径。您收到的错误消息来自这部分代码:
if L != order:
msg = "Graph not connected: infinite path length"
raise networkx.NetworkXError(msg)
此处 L
是从给定节点可达的节点数,order
是网络中的节点数。 L != order
表示存在无法从给定节点访问的节点。在无向网络的情况下,这意味着网络未连接。但是,在您的情况下,您有一个定向网络。对于有向网络 L != order
意味着网络不是 "strongly-connected"。它实际上可能是弱连接,你的大概是。
所以您遇到了一条不太准确的错误消息。
对于您创建的有向网络,直径是无限大的:如果有一个节点 u
没有到 v
的路径,这意味着一个无限大的直径。
我来晚了,但遇到了同样的问题,估计其他人可能也会遇到。
Joel 已经解释了问题的根源。直径函数依赖于强连接的网络。
对于弱连通图,可以使用:diameter = nx.diameter(net.to_undirected())
您无法计算 1) 弱连通有向图或 2) 不连通图的直径,但您可以像这样使用最大最短路径:
diameter = max([max(j.values()) for (i,j) in nx.shortest_path_length(G)])
这会找到包含 G 中任意两个节点之间最短路径的列表的最大距离(使用 Dijkstra 算法计算),而不管它们属于哪个组件。
从技术上讲,断开连接的图形的直径是无限的,这就是 NetworkX 的内置方法不起作用的原因。上面的方法会找出G内所有分量中最大的直径,但不是G本身的直径
我正在爬取 slideshare.net 图,从我的节点开始,跟踪 BFS 中的所有用户,直到访问的节点数为 1000。 我通过以下方式执行 BFS:
from urllib.request import urlopen
from collections import deque
import sys
import json
import codecs
import csv
import io
import hashlib
import time
import xml.etree.ElementTree as etree
queue = deque(["himanshutyagi11"])
while len_visitedset < 1ooo:
vertex = queue.pop()
if vertex in visited:
continue
visited.add(vertex)
length_visited = len(visited)
print(vertex,length_visited)
crawl(vertex)
crawl() 是一个函数,在该函数中我按照说明进行 slideshare api 查询 here 通过使用我的 shared_secret 和 api_key 创建查询负载(给定在 api 注册时),发送查询并解析存储在变量 'response' 中的 XML 响应。解析后,我将当前节点的联系人添加到队列中。
request_timestamp = int(time.time())
request_hash_string = shared_secret+str(request_timestamp)
request_hash_value = hashlib.sha1(request_hash_string.encode('utf-8')).hexdigest()
request_url = 'https://www.slideshare.net/api/2/get_user_contacts?username_for='+username+'&api_key='+api_key+'&hash='+request_hash_value+'&ts='+str(request_timestamp)
response = etree.parse(urlopen(request_url)).getroot()
# Append all the adjacent nodes of this user to the queue.
for child in response:
friend_name = child[0].text
queue.appendleft(friend_name)
edge_file = open('non_anonymized.csv','a')
for child in response:
f_name = child[0].text # Name of friend is stored in variable 'f_name'
edge_file.write(username+','+f_name+'\n') # username is the name of user currently being crawled
edge_file.close()
在抓取的同时,我还创建了一个 edgelist.csv 文件,其中包含图中的所有边。这个文件好像没问题。 还有其他功能,如 degree()、in_degree()、average_clustering() 似乎工作正常。
然后我使用 networkx 创建一个图,它有 1000 个节点。但是如果我尝试使用以下函数找到该图的直径:
diameter = nx.diameter(graph)
使用上面的代码,我无法找到我的图形的直径,这没有 return 任何东西,我的程序卡在这一行。对可能发生的事情有任何见解吗?
我的是一个连通图。我正在使用 to_undirected()
函数将其转换为无向的。我用有向图累了运行它,我得到了以下错误
networkx.exception.NetworkXError: Graph not connected: infinite path length
我的问题是,我用的是BFS爬虫,怎么断网呢
Python 3.4
Networkx 1.9.1
直径的源代码是here。它依赖于 eccentricity
,这是源代码中的函数。 eccentricity
找到从一个节点到所有其他节点的最短路径。您收到的错误消息来自这部分代码:
if L != order:
msg = "Graph not connected: infinite path length"
raise networkx.NetworkXError(msg)
此处 L
是从给定节点可达的节点数,order
是网络中的节点数。 L != order
表示存在无法从给定节点访问的节点。在无向网络的情况下,这意味着网络未连接。但是,在您的情况下,您有一个定向网络。对于有向网络 L != order
意味着网络不是 "strongly-connected"。它实际上可能是弱连接,你的大概是。
所以您遇到了一条不太准确的错误消息。
对于您创建的有向网络,直径是无限大的:如果有一个节点 u
没有到 v
的路径,这意味着一个无限大的直径。
我来晚了,但遇到了同样的问题,估计其他人可能也会遇到。
Joel 已经解释了问题的根源。直径函数依赖于强连接的网络。
对于弱连通图,可以使用:diameter = nx.diameter(net.to_undirected())
您无法计算 1) 弱连通有向图或 2) 不连通图的直径,但您可以像这样使用最大最短路径:
diameter = max([max(j.values()) for (i,j) in nx.shortest_path_length(G)])
这会找到包含 G 中任意两个节点之间最短路径的列表的最大距离(使用 Dijkstra 算法计算),而不管它们属于哪个组件。 从技术上讲,断开连接的图形的直径是无限的,这就是 NetworkX 的内置方法不起作用的原因。上面的方法会找出G内所有分量中最大的直径,但不是G本身的直径