You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用给定Python代码计算图degeneracy(k-core)并适配自定义数据集

图k-core计算与可视化实现方案

1. 数据集适配原k-core代码

你之前的邻接表生成方式不符合原代码要求,原代码的Graph类已经内置了邻接表维护逻辑,不需要手动生成,只需要遍历你的边数据集调用addEdge方法即可。注意要先对重复边去重(你的示例数据中同一条无向边会在两条记录中重复出现,比如A-F既出现在Node=A行也出现在Node=F行):

import pandas as pd

# 读取示例数据,sep='\s+'适配多空格分隔格式
df = pd.read_csv("your_data_path.csv", sep='\s+')

# 去重无向边:将边转为排序后的元组去重,避免重复添加同一条边
unique_edges = list({tuple(sorted([row.Node, row.Target])) for _, row in df.iterrows()})

# 初始化原代码的Graph实例
g = Graph()
# 批量添加边
for u, v in unique_edges:
    g.addEdge(u, v)

# 测试调用,打印2-core结果
g.PrintKCores(2)

2. k-core可视化实现

我们可以扩展原Graph类,新增返回k-core节点和边的方法,配合networkx+matplotlib实现可视化:

2.1 扩展Graph类

在原Graph类中新增如下方法即可:

def getKCores(self, k):
    visit = set()
    degree = defaultdict(lambda: 0)
    for i in list(self.graph):
        degree[i] = len(self.graph[i])
    for i in list(self.graph):
        if i not in visit:
            self.DFSUtil(i, visit, degree, k)
    # 收集符合条件的节点
    core_nodes = [i for i in self.graph if degree[i]>=k]
    # 收集符合条件的边
    core_edges = []
    for u in core_nodes:
        for v in self.graph[u]:
            if v in core_nodes and (v, u) not in core_edges:
                core_edges.append((u, v))
    return core_nodes, core_edges

2.2 可视化代码

import networkx as nx
import matplotlib.pyplot as plt

def plot_kcore(core_nodes, core_edges):
    nx_g = nx.Graph()
    nx_g.add_nodes_from(core_nodes)
    nx_g.add_edges_from(core_edges)
    # 选固定种子的弹簧布局保证输出结果一致
    pos = nx.spring_layout(nx_g, seed=42)
    # 绘制节点
    nx.draw_networkx_nodes(nx_g, pos, node_size=700, node_color='lightblue')
    # 绘制边
    nx.draw_networkx_edges(nx_g, pos, edgelist=core_edges, width=2)
    # 绘制节点标签
    nx.draw_networkx_labels(nx_g, pos, font_size=12, font_weight='bold')
    plt.axis('off')
    plt.show()

# 示例:获取2-core并绘制
k = 2
nodes, edges = g.getKCores(k)
plot_kcore(nodes, edges)

3. 图degeneracy等级计算

图的degeneracy等级是最大的k值,使得该图存在非空k-core,计算方法如下:

def calc_degeneracy(g):
    # 先获取所有节点的最大度作为遍历上限
    max_degree = max(len(adj) for adj in g.graph.values()) if g.graph else 0
    for k in range(max_degree, 0, -1):
        nodes, _ = g.getKCores(k)
        if len(nodes) > 0:
            return k
    return 0

# 计算示例数据的degeneracy等级
print("图的degeneracy等级为:", calc_degeneracy(g))

你提供的示例数据最大非空k-core是2-core,对应degeneracy等级为2。


内容的提问来源于stack exchange,提问作者Math

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:45:07