【问题标题】:How can I calculate neighborhood overlap in weighted network?如何计算加权网络中的邻域重叠?
【发布时间】:2018-04-09 12:41:46
【问题描述】:

如何计算加权图中两个节点 (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

【问题讨论】:

  • 什么是邻域重叠?到目前为止,您尝试过什么?
  • "...我们将连接 A 和 B 的边的邻域重叠定义为比率:(作为 A 和 B 的邻居的节点数)/(作为邻居的节点数A 或 B 中的至少一个),其中在分母中我们不计算 A 或 B 本身(即使 A 是 B 的邻居,B 是 A 的邻居)。” cs.cornell.edu/home/kleinber/networks-book/…

标签: graph networkx


【解决方案1】:

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 形成图的连通分量时,您仍然需要确定会发生什么。

【讨论】:

    【解决方案2】:

    我知道问题的标签是 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)
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 2019-10-27
      • 2018-09-28
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多