我有以下网络:
g <- graph(c("Amy", "Ram",
"Ram", "Li",
"Li", "Amy",
"Amy", "Li",
"Kate", "Li"), directed=TRUE)
我想知道如何计算这个网络的紧密度中心性。根据我对文档的理解,紧密度是从网络的一个顶点到所有其他顶点的所有最短路径的平均值的倒数。直观地说,我将这样计算它:
Dist <- distances(g, mode="out")
Dist[Dist == Inf] <- NA
1/rowMeans(Dist, na.rm=T)
然而,这很可能是不正确的,因为内置igraph函数中用于计算紧密度中心度的值显示了不同的结果:
closeness(g, mode = "out")
我想了解如何计算接近度,以及如何在不使用内置函数的情况下一步一步地得到相同的结果。
2条答案
按热度按时间evrscar21#
这里有几个问题。你的代码中确实有一个错误,但最大的问题是
closeness
函数--要么是它的实现,要么是它的文档。首先,我们应该计算什么?closeness
的igraph文档说:一个顶点的接近中心度定义为到/来自图中所有其他顶点的最短路径的平均长度的倒数:
1/和(d(v,i),i!= v)
如果在顶点v和i之间没有(有向)路径,则在公式中使用顶点总数而不是路径长度。
让我们将其与Wikipedia article on closeness_centrality中的内容进行比较。
Bavelas(1950)将接近度定义为远度的倒数,即:
C(x)= 1/∑ d(y,x)
其中d(y,x)是顶点x和y之间的距离。当谈到接近中心度时,人们通常指的是它的归一化形式,表示最短路径的平均长度,而不是它们的总和。它通常由前面的公式乘以N − 1给出,其中N是图中的节点数。对于大型图,这个差异变得无关紧要,所以去掉− 1得到:
C(x)= N/∑ d(y,x)
此调整允许在不同大小的图形的节点之间进行比较。
首先,igraph文档对
i != v
求和。单词"平均长度的倒数"意味着
C(x) = (N-1) / ∑ d(y,x)
,但是公式是1 / ∑ d(y,x)
,事实上,我们将看到,closeness
函数计算的结果对应于原始定义,尽管单词表示规范化版本。但是还有一个问题,您将Inf值更改为NA,然后使用
na.rm=T
,请注意igraph文档中的最后一句话。如果在顶点v和i之间没有(有向)路径,则在公式中使用顶点总数而不是路径长度。
我们不应该忽略这些节点,我们应该将距离设置为图中节点的总数,因此,要得到与igraph相同的结果,我们需要计算:
当然,igraph的文档是不一致的,文字上说它计算规范化的接近度,但公式(以及它实际计算的内容)是非规范化的形式。
我希望这能清楚地说明正在计算的是什么,并帮助您选择要用于分析的内容。
1/rowMeans(Dist)
时,你包含了igraph忽略的v = i的情况(距离为零)。这意味着你计算的是C(x) = N / ∑ d(y,x)
而不是C(x) = (N-1) / ∑ d(y,x)
。正如维基百科所指出的,对于大型图,它们本质上是相同的,但我只是想确保你知道你在计算什么。oknwwptz2#
看起来
igraph
在@G5W发布优秀的answer之后可能已经发生了变化。closeness
的igraph文档已经发生了变化:一个顶点的接近中心度定义为到图中所有其他顶点的距离之和的倒数:
如果顶点v和i之间没有(有向)路径,则i从计算中省略。如果没有其他顶点可以从v到达,则它的接近度返回为NaN。
输出也是如此。使用原始示例:
结果与上面的例子不同,正确的答案不会被接受的答案(链接在上面,复制在这里)复制,因为函数igraph::closeness可能已经改变:
注意:这仍然匹配@G5W的输出,但不再匹配
closeness(g, mode = "out")
。相反,更类似于OP的东西,除了用rowSums
而不是rowMeans
给出igraph::closeness
的匹配:会话信息: