概要
在复杂网络中,评估节点的重要性是理解网络结构和功能的关键。本篇博客介绍了三种主要的节点重要性评估方法:
- 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方法在复杂网络分析中的实际应用价值。