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