【复杂网络建模】复杂网络中关键节点识别论文复现

概要

在复杂网络中,评估节点的重要性是理解网络结构和功能的关键。本篇博客介绍了三种主要的节点重要性评估方法:

  • Tsallis熵方法:杨松青等人提出的基于Tsallis熵的复杂网络节点重要性评估方法。详细见物理学报(2021)。
  • 改进的k-shell方法:Wang等人在Physica A中描述的改进版k-shell方法(2020)。
    -通过邻域核度识别和排名复杂网络中的关键传播者。在Physica A(2014)

功能性函数函数

在复杂网络节点重要性评估中,常常需要处理大量数据。以下是一些关键的功能性函数,用于保存、读取节点重要性数据以及计算相关指标。

读取和保存数据

def save_results(measure, name):
    # 打开一个文件以写入数据,文件名为传入的参数name
    outf = open("./importance_values/"+name+".dat", "w")
    for i in measure:
        #将键以字符串的形式写入文件中,中间用空格隔开,行末加上换行符号
        outf.write(str(i)+" "+str(measure[i])+"\n")
    outf.close()

该函数将节点的编号及其对应的重要性值保存到指定的文件中,以便后续分析。

读取重要性函数

def read_importance_values(name):
    # 读取重要性函数 创建一个新的字典,用于存放节点重要性数值
    measure = {}
    for line in np.loadtxt("./importance_values/"+name+".dat"):
        # 读取每一行数据分解为节点标签和对应的重要性数值 line[0]表示节点标签 line[1]代表节点的重要性值
        measure[int(line[0])] = line[1]
    return measure

该函数从文件中读取节点重要性数据,并将其存储在字典中,方便后续处理。

主流方法复现

核中心性Cnc+

核中心性 Cnc是通过累加节点邻居的测量值来评估节点的重要性,反映了节点的局部影响力。

def cal_C_nc(G, measure):
    # 用于存放每个邻居核度值的字典
    Cnc = {}
    for i in G.nodes():
        cnci = 0
        for j in nx.neighbors(G, i):
            # 每个邻居的度值加到cnci中
            cnci += measure[j]
        Cnc[i] = cnci
    return Cnc



def cal_Cnc_plus(G, measure):
    Cnc_plus = {}
    Cnc = cal_C_nc(G, measure)
    for i in G.nodes():
        cnci_plus = 0
        for j in nx.neighbors(G, i):
            cnci_plus += Cnc[j]
        Cnc_plus[i] = cnci_plus

    return Cnc_plus

TSM方法

Tsallis熵方法 (TSM) 结合了局部和全局拓扑信息,利用Tsallis熵来衡量节点的重要性。通过计算局部约束值和传播矩阵,TSM能够更全面地评估节点在网络中的角色和影响。

def TSM_method(G, km):
    N = len(G.nodes()) # 获取图中节点的数量
    nodes = list(G.nodes()) # 获取图中所有节点的列表
    # 计算qi
    q = {i: 1+ km[i]/sum(km.values()) for i in G.nodes()} # 计算节点的q值,用于计算转移概率矩阵
    P = np.zeros((N, N)) # 初始化转移概率矩阵
    RC = nx.constraint(G) # 计算节点的RC值
    for i in RC:
        if RC[i]>1:
            RC[i] = 1.0 # 如果节点的RC值大于1

    s_RC = {}
    # 计算节点的s_RC值
    for i in nodes:
        s = [1-RC[j] for j in nx.neighbors(G, i)]
        s_RC[i] = sum(s)

    for i in range(N):
        for j in nx.neighbors(G, i):
            P[i, j] = (1 - RC[j]) / s_RC[i]

    # print(P)
    T = {vi: (1-sum((P**q[vi])[i, :]))/(q[vi]-1) for i, vi in enumerate(nodes)}
    # print(T)
    IC = {i: (1-RC[i])*T[i] for i in G.nodes()}
    # print(IC)

    return cal_Cnc_plus(G, IC)

ADD方法

ADD方法将不同评估方法(如度中心性 DC、介数中心性 BC、k-shell KS)的结果进行综合,提供了一种综合性强的节点重要性指标。

def ADD_method(DC, BC, KS):
    D = {}
    for i in DC:
        D[i] = np.sqrt(DC[i]**2 + BC[i]**2 + KS[i]**2)
    return D

IKS方法

信息熵方法通过计算节点的度信息来评估其不确定性,进而衡量其在网络中的重要性。较高的信息熵值表明节点在网络中扮演了更加复杂的角色。

def information_entropy(G):
    deg = [G.degree(i) for i in G.nodes()]
    entropy = {}
    for i in G.nodes():
        s = 0
        for j in nx.neighbors(G, i):
            Ij = G.degree(j)/sum(deg)
            s += Ij*np.log(Ij)
        entropy[i] = -s
    return entropy

评价指标函数

MR指标

MR (Matching Ratio) 指标用于评估节点重要性排名的准确性。MR值越高,表示排名越准确。

def cal_MR(n,seq):
    # 将序列的值存放在列表中
    values = list(seq.values())
    
    # 统计每个值出现次数,并将结果存储在列表中
    counts = list(dict(Counter(values)).values())
    # 计算可能的不同排列数
    nom = n * (n - 1)
    
    # 计算重复排列数的总和
    total_repeats = 0
    for nr in counts:
        total_repeats += nr * (nr - 1)
    
    # 计算平均重复率
    MR = (1 - total_repeats / nom) ** 2

    return MR

肯德尔系数

肯德尔系数用于量化两个排序列表之间的一致性。值在-1到1之间,值越接近1表示两个排序越一致。

# 或者调用库函数计算Kendall_tau_coefficient
def cal_Kendall_tau_coefficient(X, Y):
    tau, p_value = stats.kendalltau(X, Y)
    return tau

实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

提示:这里可以添加总结

总结

TSM方法通过结合局部和全局拓扑信息,弥补了现有方法的不足,优化了资源利用,并提高了信息传播效率。在8个真实网络上的实验结果显示,TSM方法在节点重要性评估上表现优异,能够更好地区分节点重要性的差异,优于传统方法如DC、BC、MDD等。这证明了TSM方法在复杂网络分析中的实际应用价值。

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值