问题是:如何使用networkx计算图的特征向量集中度?
(不是针对单个节点,而是针对用于比较节点的整个图,使用Freeman的方法进行此操作)。
我需要比较一些不同的图表,我希望使用四种不同的中心性度量来比较它们:
目前,networkx没有计算整个网络的集中化的任何函数--所有函数都返回每个节点的中心性字典。
请注意,集中化是关于网络中中心性的分布。
我写了一个函数,可以计算前三个网络的中心性,但我不知道如何计算特征向量中心性。
理论上,它应该是每个节点的最大中心度除以n个大小的网络的理论最大值。
对于特征向量中心性,我能找到的最接近的方法是在这套讲稿的幻灯片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
(请注意,在将这些信息输入到此函数中时,不应将这些关系规范化)
更新:在回答后,代码已经完成,并作为基函数发布,供其他人使用
发布于 2017-08-31 03:55:15
为了澄清,你在寻找(我想)网络的特征向量集中化。集中度是一个节点级别的索引,并且只为网络的节点定义(考虑到它们的度量,这是有意义的)。(我记得,Freeman将集中化称为“图中心性”,但“集中化”一词已被取代,因此在注释中可能会出现混淆。)
特征向量集中的理论最大值是两个节点间只有一条边的相同尺寸的网络。在有向网络的情况下,这是n - 1
。在无向网络的情况下,它是sqrt(2)/2 * (n - 2)
。(见巴特,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
https://stackoverflow.com/questions/45789342
复制相似问题