如何解决NetworkX最小生成树是否具有相同数据的不同群集排列?
我有一个大型数据集,该数据集将产品与相关性度量进行比较,如下所示:
product1 product2 relatedness
0101 0102 0.047619
0101 0103 0.023810
0101 0104 0.095238
0101 0105 0.214286
0101 0106 0.047619
... ... ...
我使用以下代码将数据输入到NetworkX图形工具中并生成MST图:
import networkx as nx
import matplotlib.pyplot as plt
products = (data['product1'])
products = list(dict.fromkeys(products))
products = sorted(products)
G = nx.Graph()
G.add_nodes_from(products)
print(G.number_of_nodes())
print(G.nodes())
row = 0
for c in data['product1']:
p = data['product2'][row]
w = data['relatedness'][row]
if w > 0:
G.add_edge(c,p,weight=w,with_labels=True)
row = row + 1
nx.draw(nx.minimum_spanning_tree(G),with_labels=True)
plt.show()
结果图如下:https://i.imgur.com/pBbcPGc.jpg
但是,当我重新运行代码时,使用相同的数据且未进行任何修改,集群的排列似乎发生了变化,因此看上去却有所不同,例如:https://i.imgur.com/4phvFGz.jpg,这里的第二个例子:{ {3}}。簇,边和权重似乎没有变化,但是它们在图空间上的排列每次都在变化。
是什么导致节点的排列每次更改而对代码或数据没有任何更改?我该如何重新编写此代码以生成每次具有相同数据的节点和边的布局几乎相同的网络图?
解决方法
nx.draw
方法默认使用spring_layout
(link to the doc)。此布局实现了以{strong> random 初始位置开头的Fruchterman-Reingold force-directed algorithm。这是您在重复试验中看到的这种布局效果。
如果要“固定”位置,则应显式调用spring_layout
函数并在pos
参数中指定初始位置。
为清楚起见,请分配G = nx.minimum_spanning_tree(G)
。然后
nx.draw(G,with_labels=True)
等同于
pos = nx.spring_layout(G)
nx.draw(G,pos=pos,with_labels=True)
由于您不希望每次运行脚本时都随机计算pos
,因此保持pos
稳定的唯一方法是将其存储一次并在每次重新运行后从文件中检索。您可以在pos
之前使用此脚本以改进的方式计算nx.draw(G,with_labels=True)
:
import os,json
def store(pos):
#form of dictionary to be stored dictionary retrieved
return {k: v.tolist() for k,v in pos.items()}
def retrieve(pos):
#form of dictionary to be retrieved
return {float(k): v for k,v in pos.items()}
if 'nodes.txt' in os.listdir():
json_file = open('pos.txt').read()
pos = retrieve(json.loads(json_file)) #retrieving dictionary from file
print('retrieve',pos)
else:
with open('pos.txt','w') as outfile:
pos = nx.spring_layout(new_G) #calculates pos
print('store',pos)
json.dump(store(pos),outfile,indent=4) #records pos dictionary into file
这是一个丑陋的解决方案,因为它无条件依赖于pos
词典中使用的数据类型。它对我有用,但是您可以定义store
和retrieve
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。