问题是:如何使用 networkx 计算图的特征向量中心化?
(例如,不是针对单个节点,而是针对整个图来比较节点,使用 Freeman 的方法来执行此操作)。
我需要比较许多不同的图表,并且我希望使用四种不同的中心性度量来比较它们:
- 亲密
- 之间
- 学位
- 特征向量
目前,networkx 没有任何计算整个网络集中度的函数 - 所有函数都会返回每个节点的中心度字典。
请注意,集中化是指网络内中心性的分布。
我编写了一个函数,可以计算前三个的整个网络的中心性,但我不知道如何计算特征向量中心性。
理论认为,它应该是总和(最大中心性 - 每个节点的中心性)除以大小为 n 的网络的理论最大值。
我能弄清楚如何实现特征向量中心性的最接近方法是在this set of lecture notes的第32张幻灯片上查看相关理论。看起来像这样:
Ce<-function(Y)
{
n<-nrow(Y)
e<-evecc(Y)
Y.sgn<-matrix(0,n,n) ; Y.sgn[1,-1]<-1 ; Y.sgn<-Y.sgn+t(Y.sgn)
e.sgn<-evecc(Y.sgn)
sum(max(e)-e)/ sum(max(e.sgn)-e.sgn)
}
这似乎是(最大特征中心性减去每个节点特征中心性)除以一些没有意义的东西的总和 - 这是我无法弄清楚的分母。
到目前为止,我在 python 中的代码说明了其他三种类型,但我不知道这段代码在做什么(上面)。代码中我无法弄清楚的部分已指出。非常感谢所有帮助。
def getCentrality(centrality, c_type):
c_denominator = float(1)
n_val = float(len(centrality))
print (str(len(centrality)) + "," + c_type + "\n")
if (c_type=="degree"):
c_denominator = (n_val-1)*(n_val-2)
if (c_type=="close"):
c_top = (n_val-1)*(n_val-2)
c_bottom = (2*n_val)-3
c_denominator = float(c_top/c_bottom)
if (c_type=="between"):
c_denominator = (n_val*n_val*(n_val-2))
if (c_type=="eigen"):
c_denominator = [THIS PART I CAN'T FIGURE OUT]
c_node_max = max(centrality.values())
c_sorted = sorted(centrality.values(),reverse=True)
print "max node" + str(c_node_max) + "\n"
c_numerator = 0
for value in c_sorted:
if c_type == "degree":
#remove normalisation for each value
c_numerator += (c_node_max*(n_val-1) - value*(n_val-1))
else:
c_numerator += (c_node_max - value)
print ('numerator:' + str(c_numerator) + "\n")
print ('denominator:' + str(c_denominator) + "\n")
network_centrality = float(c_numerator/c_denominator)
if c_type == "between":
network_centrality = network_centrality * 2
return network_centrality
(请注意,将紧密度和介数输入此函数时不应标准化)
更新:根据答案,代码已完成并发布为 gist function供其他人使用
最佳答案
需要明确的是,您正在寻找(我认为)网络的特征向量中心化。 中心性是一个节点级指数,仅为网络节点定义(考虑到它们测量的内容,这是有道理的)。 (据我记得,弗里曼将中心化称为“图中心性”,但“中心化”一词已被取代,因此评论中可能会出现困惑。)
特征向量集中的理论最大值是两个节点之间只有一条边的相同大小的网络。在有向网络的情况下,这是n - 1
。在无向网络的情况下,它是sqrt(2)/2 * (n - 2)
。 (参见Butts, 2016, pg. 56)
考虑到这一点:
from math import sqrt
if (c_type=="eigen"):
c_denominator = sqrt(2)/2 * (n_val - 2)
或者:
if (c_type=="eigen"):
c_denominator = n_val - 1
关于python - 如何为整个网络创建特征向量集中化的 networkx 函数? (弗里曼),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45789342/