如何计算加权网络中的邻域重叠?

时间:2018-04-09 12:41:46

标签: graph networkx

如何在加权图中计算两个节点(i,j)之间的邻域重叠?

“...我们将连接A和B的边缘的邻域重叠定义为比率:(作为A和B的邻居的节点数)/(至少有一个节点的邻居的节点数) A或B)在分母中,我们不计算A或B本身(即使A是B的邻居,B是A的邻居)。“

https://www.cs.cornell.edu/home/kleinber/networks-book/networks-book-ch03.pdf

2 个答案:

答案 0 :(得分:0)

networkx有一个内置函数来查找图中两个节点的公共邻居:common_neighbors。现在我们只需要找到与A或B相邻的节点数。注意

| N(u) ⋃ N(v) | = |N(u)| + |N(v)| - | N(u) ⋂ N(v)|

其中N(u)u的邻居集合。由于我们不计算分母中的A或B,我们需要从| N(u) ⋃ N(v) |中减去2。

def neighborhood_overlap(g, u, v):
    n_common_nbrs = len(set(nx.common_neighbors(g, u, v)))
    n_join_nbrs = g.degree(u) + g.degree(v) - n_common_nbrs - 2
    return n_common_nbrs / n_join_nbrs

但是,如果分母为0,即节点A和B形成图的连通分量,你仍然需要决定会发生什么。

答案 1 :(得分:0)

我知道问题的标记是networkx,但是由于这是Google上弹出的第一件事,因此在igraph上该函数应该是

neighborhood_overlap <- function(g, node1, node2)
{
  nh1 = neighborhood(graph=g, order=1, nodes=node1)[[1]]
  nh2 = neighborhood(graph=g, order=1, nodes=node2)[[1]]
  common = intersect(nh1, nh2)
  commonl = length(common)
  # | N(u) ⋃ N(v) | = |N(u)| + |N(v)| - | N(u) ⋂ N(v)|
  union = degree(net_vc, v=node1) + degree(net_vc, v=node2) - commonl - 2
  return(commonl/union)
}