- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
用于网络社区检测的 Girvan-Newman 算法:
detects communities by progressively removing edges from the original graph. The algorithm removes the “most valuable” edge, traditionally the edge with the highest betweenness centrality, at each step. As the graph breaks down into pieces, the tightly knit community structure is exposed and the result can be depicted as a dendrogram.
import networkx as nx
G = nx.path_graph(10)
comp = nx.community.girvan_newman(G)
list(comp)
[({0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}), ({0, 1}, {2, 3, 4}, {5, 6, 7, 8, 9}), ({0, 1}, {2, 3, 4}, {5, 6}, {8, 9, 7}), ({0, 1}, {2}, {3, 4}, {5, 6}, {8, 9, 7}), ({0, 1}, {2}, {3, 4}, {5, 6}, {7}, {8, 9}), ({0}, {1}, {2}, {3, 4}, {5, 6}, {7}, {8, 9}), ({0}, {1}, {2}, {3}, {4}, {5, 6}, {7}, {8, 9}), ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8, 9}), ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9})]
scipy.cluster.hierarchy.dendrogram
但它需要一个我猜的“链接矩阵”,例如由
scipy.cluster.hierarchy.linkage
创建的那个。 ,但我不确定如何将这个元组列表转换为这个“链接矩阵”。
dendrogram
.
最佳答案
在@ItamarMushkin 之后,我遵循了@mdml 的答案,并稍作修改并得到了我想要的。在高层次上,我将 NetworkX 的 Girvan-Newman 迭代器输出变成另一个 DiGraph()
我最终希望看到一个树状图。然后我构建 Z
,一个链接矩阵 I 输入到 scipy.cluster.hierarchy.dendrogram
, 以边列表的形式包含每个树状图合并的实际高度。
我必须对@mdml 的回答进行两项修改:
index
的节点的元组键进行排序get_merge_height
函数,它根据边缘去除的 Girvan-Newman 输出顺序为每个合并提供其独特的高度。否则,两个节点的所有合并在树状图中将具有相同的高度,在合并两个节点的下一级中的所有合并以及另一个节点将具有相同的高度等。import networkx as nx
from itertools import chain, combinations
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram
# get simulated Graph() and Girvan-Newman communities list
G = nx.path_graph(10)
communities = list(nx.community.girvan_newman(G))
# building initial dict of node_id to each possible subset:
node_id = 0
init_node2community_dict = {node_id: communities[0][0].union(communities[0][1])}
for comm in communities:
for subset in list(comm):
if subset not in init_node2community_dict.values():
node_id += 1
init_node2community_dict[node_id] = subset
# turning this dictionary to the desired format in @mdml's answer
node_id_to_children = {e: [] for e in init_node2community_dict.keys()}
for node_id1, node_id2 in combinations(init_node2community_dict.keys(), 2):
for node_id_parent, group in init_node2community_dict.items():
if len(init_node2community_dict[node_id1].intersection(init_node2community_dict[node_id2])) == 0 and group == init_node2community_dict[node_id1].union(init_node2community_dict[node_id2]):
node_id_to_children[node_id_parent].append(node_id1)
node_id_to_children[node_id_parent].append(node_id2)
# also recording node_labels dict for the correct label for dendrogram leaves
node_labels = dict()
for node_id, group in init_node2community_dict.items():
if len(group) == 1:
node_labels[node_id] = list(group)[0]
else:
node_labels[node_id] = ''
# also needing a subset to rank dict to later know within all k-length merges which came first
subset_rank_dict = dict()
rank = 0
for e in communities[::-1]:
for p in list(e):
if tuple(p) not in subset_rank_dict:
subset_rank_dict[tuple(sorted(p))] = rank
rank += 1
subset_rank_dict[tuple(sorted(chain.from_iterable(communities[-1])))] = rank
# my function to get a merge height so that it is unique (probably not that efficient)
def get_merge_height(sub):
sub_tuple = tuple(sorted([node_labels[i] for i in sub]))
n = len(sub_tuple)
other_same_len_merges = {k: v for k, v in subset_rank_dict.items() if len(k) == n}
min_rank, max_rank = min(other_same_len_merges.values()), max(other_same_len_merges.values())
range = (max_rank-min_rank) if max_rank > min_rank else 1
return float(len(sub)) + 0.8 * (subset_rank_dict[sub_tuple] - min_rank) / range
# finally using @mdml's magic, slightly modified:
G = nx.DiGraph(node_id_to_children)
nodes = G.nodes()
leaves = set( n for n in nodes if G.out_degree(n) == 0 )
inner_nodes = [ n for n in nodes if G.out_degree(n) > 0 ]
# Compute the size of each subtree
subtree = dict( (n, [n]) for n in leaves )
for u in inner_nodes:
children = set()
node_list = list(node_id_to_children[u])
while len(node_list) > 0:
v = node_list.pop(0)
children.add( v )
node_list += node_id_to_children[v]
subtree[u] = sorted(children & leaves)
inner_nodes.sort(key=lambda n: len(subtree[n])) # <-- order inner nodes ascending by subtree size, root is last
# Construct the linkage matrix
leaves = sorted(leaves)
index = dict( (tuple([n]), i) for i, n in enumerate(leaves) )
Z = []
k = len(leaves)
for i, n in enumerate(inner_nodes):
children = node_id_to_children[n]
x = children[0]
for y in children[1:]:
z = tuple(sorted(subtree[x] + subtree[y]))
i, j = index[tuple(sorted(subtree[x]))], index[tuple(sorted(subtree[y]))]
Z.append([i, j, get_merge_height(subtree[n]), len(z)]) # <-- float is required by the dendrogram function
index[z] = k
subtree[z] = list(z)
x = z
k += 1
# dendrogram
plt.figure()
dendrogram(Z, labels=[node_labels[node_id] for node_id in leaves])
plt.savefig('dendrogram.png')
关于python - 绘制 NetworkX Girvan-Newman 算法找到的社区的树状图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59821151/
我正在尝试使用 HTML 报告器安装和运行 Postman 的 Newman 测试集合(在带有来自 Postman 帐户的 docker 图像的 jenkins podTemplate 容器上)但它一
我有一个 curl 命令,我想使用 newman 作为一个集合运行它: curl -i -v \ -H "X-FromAppId: APPLICATION" \ -H "X-Transaction
对特定服务器的所有请求都超时,并显示错误 ETIMEDOUT。 [...]$ newman -c Test.json.postman_collection Iteration 1 of 1 Reque
我对 ubuntu(linux) os 有非常基本的了解,并且刚刚开始使用 dockers。 现在我必须创建一个 postman/newman docker,它有一个包含 postman 集合 jso
几个月前,我在 AWS CodeBuild 上安装了 Newman( postman cli),它运行良好。然后这个错误突然出现:error: Unknown encoding: latin1 在本地
我有一个 Postman 集合,我正在尝试与 newman 一起使用,但我的环境变量没有被使用。 请求 URL 只是 {{url}},然后我有一个同名的环境变量。我正在使用此命令运行我的测试: new
我有兴趣经营 Newman 的modularity大图上的聚类算法。如果您可以将我指向实现它的库(或 R 包等),我将不胜感激。 最好的 ~拉拉 最佳答案 使用 R 的 igraph 包: http:
在 Newman 中,我想进行测试以确保响应代码正确、响应时间合理且响应值正确。 在某些情况下,由于网络故障或其他系统条件,某些请求可能会出现超时或错误值,如果几秒钟后处理相同的请求,这些问题就会得到
我关注了以下Medium发布关于如何在 Azure DevOps 或 TFS 中配置 postman/newman API 测试并发布 HTML 结果? 在我的管道中,我有一个安装 newman 的任
我关注了以下Medium发布关于如何在 Azure DevOps 或 TFS 中配置 postman/newman API 测试并发布 HTML 结果? 在我的管道中,我有一个安装 newman 的任
我与 Newman 有以下几行(工作正常),但我希望在同一个请愿书中执行两个文件夹。首先将执行 Login_full 然后另一个(这不是必需的) newman run Example.postman_
我在我的计算机上全局安装了“newman”包并且能够在命令行上运行 newman npm install -g newman 但是,我需要在 nodejs 脚本中运行我的测试集合,下面的语句会抛出异常
我正在使用 newman 和 postman 来运行一套 postman 请求和相关的测试脚本。 我有一个环境变量,它是一条我无法存储在磁盘上的敏感信息(因此我无法在 JSON 测试文件中声明它)。我
运行 newman v.3.2.0 时出现此错误: #失败细节 1.错误的自签名证书 最佳答案 通过运行此修复此问题: $ newman run examples/sample-collection.
仅供引用:这不是家庭作业 我尝试在 Python 中实现 Clauset-Newman-Moore 社区检测算法,当它运行时,它输出的模块化 (Q) 值始终因某些因素而偏离。完整的代码如下 - 它接受
这是我第一次使用 Jenkins 进行自动化测试。我尝试通过将 Newman 与 Jenkins 集成来运行测试,但我总是得到 控制台错误 "Newman : command not found" 结
我已经定义了几个 Postman 测试集合/文件夹及其相关的测试数据文件。通过 Postman Collection Runner 和 Newman 单独运行它们可以正常工作。我想一起批处理多个运行,
我正在尝试使用 Newman 为 Postman 脚本生成 HTML 报告。 但是,我没有看到在所需位置生成的报告。 我正在使用 azure DevOps。 [command]/usr/local/b
我有一个 GitLab CI 作业,它使用自定义环境运行一系列 Postman 请求。我正在使用 Newman 将它们与 newman-reporter-htmlextra 一起运行生成测试报告的 n
我正在尝试使用 Newman 为 Postman 脚本生成 HTML 报告。 但是,我没有看到在所需位置生成的报告。 我正在使用 azure DevOps。 [command]/usr/local/b
我是一名优秀的程序员,十分优秀!