SNAP 图总结#

这是一个使用基于属性和成对边的节点分组 (SNAP) 算法来总结基于节点属性和边属性的图的示例(请勿与斯坦福网络分析项目混淆)。该算法通过节点属性值的独特组合以及与其他节点组的边类型来对节点进行分组,从而生成一个总结图。然后,总结图可以用来推断具有不同属性值的节点与图中的其他节点如何关联。

SNAP Summarization, Original (12 nodes, 12 edges), SNAP Aggregation (6 nodes, 7 edges)
import networkx as nx
import matplotlib.pyplot as plt


nodes = {
    "A": {"color": "Red"},
    "B": {"color": "Red"},
    "C": {"color": "Red"},
    "D": {"color": "Red"},
    "E": {"color": "Blue"},
    "F": {"color": "Blue"},
    "G": {"color": "Blue"},
    "H": {"color": "Blue"},
    "I": {"color": "Yellow"},
    "J": {"color": "Yellow"},
    "K": {"color": "Yellow"},
    "L": {"color": "Yellow"},
}
edges = [
    ("A", "B", "Strong"),
    ("A", "C", "Weak"),
    ("A", "E", "Strong"),
    ("A", "I", "Weak"),
    ("B", "D", "Weak"),
    ("B", "J", "Weak"),
    ("B", "F", "Strong"),
    ("C", "G", "Weak"),
    ("D", "H", "Weak"),
    ("I", "J", "Strong"),
    ("J", "K", "Strong"),
    ("I", "L", "Strong"),
]
original_graph = nx.Graph()
original_graph.add_nodes_from(n for n in nodes.items())
original_graph.add_edges_from((u, v, {"type": label}) for u, v, label in edges)


plt.suptitle("SNAP Summarization")

base_options = {"with_labels": True, "edgecolors": "black", "node_size": 500}

ax1 = plt.subplot(1, 2, 1)
plt.title(
    f"Original ({original_graph.number_of_nodes()} nodes, {original_graph.number_of_edges()} edges)"
)
pos = nx.spring_layout(original_graph, seed=7482934)
node_colors = [d["color"] for _, d in original_graph.nodes(data=True)]

edge_type_visual_weight_lookup = {"Weak": 1.0, "Strong": 3.0}
edge_weights = [
    edge_type_visual_weight_lookup[d["type"]]
    for _, _, d in original_graph.edges(data=True)
]

nx.draw_networkx(
    original_graph, pos=pos, node_color=node_colors, width=edge_weights, **base_options
)

node_attributes = ("color",)
edge_attributes = ("type",)
summary_graph = nx.snap_aggregation(
    original_graph, node_attributes, edge_attributes, prefix="S-"
)

plt.subplot(1, 2, 2)

plt.title(
    f"SNAP Aggregation ({summary_graph.number_of_nodes()} nodes, {summary_graph.number_of_edges()} edges)"
)
summary_pos = nx.spring_layout(summary_graph, seed=8375428)
node_colors = []
for node in summary_graph:
    color = summary_graph.nodes[node]["color"]
    node_colors.append(color)

edge_weights = []
for edge in summary_graph.edges():
    edge_types = summary_graph.get_edge_data(*edge)["types"]
    edge_weight = 0.0
    for edge_type in edge_types:
        edge_weight += edge_type_visual_weight_lookup[edge_type["type"]]
    edge_weights.append(edge_weight)

nx.draw_networkx(
    summary_graph,
    pos=summary_pos,
    node_color=node_colors,
    width=edge_weights,
    **base_options,
)

plt.tight_layout()
plt.show()

脚本总运行时间: (0 分钟 0.198 秒)

示例集由 Sphinx-Gallery 生成