首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为整个网络创建特征向量集中的networkx函数?(弗里曼)

如何为整个网络创建特征向量集中的networkx函数?(弗里曼)
EN

Stack Overflow用户
提问于 2017-08-21 04:30:44
回答 1查看 1.2K关注 0票数 2

问题是:如何使用networkx计算图的特征向量集中度?

(不是针对单个节点,而是针对用于比较节点的整个图,使用Freeman的方法进行此操作)。

我需要比较一些不同的图表,我希望使用四种不同的中心性度量来比较它们:

  • 亲密性
  • 中间性
  • 学位
  • 特征向量

目前,networkx没有计算整个网络的集中化的任何函数--所有函数都返回每个节点的中心性字典。

请注意,集中化是关于网络中中心性的分布。

我写了一个函数,可以计算前三个网络的中心性,但我不知道如何计算特征向量中心性。

理论上,它应该是每个节点的最大中心度除以n个大小的网络的理论最大值。

对于特征向量中心性,我能找到的最接近的方法是在这套讲稿的幻灯片32上看到这方面的理论,它看起来如下:

代码语言:javascript
运行
复制
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中的代码占了其他三种类型的代码,但是我不知道这段代码正在做什么(上面的代码)。代码中我找不出的部分是指示的。所有的帮助都很感激。

代码语言:javascript
运行
复制
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

(请注意,在将这些信息输入到此函数中时,不应将这些关系规范化)

更新:在回答后,代码已经完成,并作为基函数发布,供其他人使用

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-31 03:55:15

为了澄清,你在寻找(我想)网络的特征向量集中化。集中度是一个节点级别的索引,并且只为网络的节点定义(考虑到它们的度量,这是有意义的)。(我记得,Freeman将集中化称为“图中心性”,但“集中化”一词已被取代,因此在注释中可能会出现混淆。)

特征向量集中的理论最大值是两个节点间只有一条边的相同尺寸的网络。在有向网络的情况下,这是n - 1。在无向网络的情况下,它是sqrt(2)/2 * (n - 2)。(见巴特,2016年,pg。56)

所以考虑到这一点:

代码语言:javascript
运行
复制
from math import sqrt
if (c_type=="eigen"):
    c_denominator = sqrt(2)/2 * (n_val - 2)

或者:

代码语言:javascript
运行
复制
if (c_type=="eigen"):
    c_denominator = n_val - 1
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45789342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档