generic_weighted_projected_graph#

generic_weighted_projected_graph(B, nodes, weight_function=None)[source]#

用户指定权重函数的B的加权投影。

二分网络B被投影到指定的节点上,其权重由用户指定的函数计算。该函数必须接受两个节点的邻域集作为参数,并返回一个整数或浮点数。

节点保留其属性,并且在生成的图中如果它们在原始图中有一条共同的边相连。

Parameters:
BNetworkX图

输入图应该是二分的。

nodes列表或可迭代对象

要投影到的节点(“底部”节点)。

weight_function函数

该函数必须接受与本函数相同的输入图和两个节点作为参数,并返回一个整数或浮点数。默认函数计算共享邻居的数量。

Returns:
GraphNetworkX图

投影到给定节点的图。

Notes

没有尝试验证输入图B是否为二分图。图和节点的属性被(浅层)复制到投影图中。

有关NetworkX中如何处理二分图的更多详细信息,请参阅:mod:bipartite文档

Examples

>>> from networkx.algorithms import bipartite
>>> # 定义一些自定义权重函数
>>> def jaccard(G, u, v):
...     unbrs = set(G[u])
...     vnbrs = set(G[v])
...     return float(len(unbrs & vnbrs)) / len(unbrs | vnbrs)
>>> def my_weight(G, u, v, weight="weight"):
...     w = 0
...     for nbr in set(G[u]) & set(G[v]):
...         w += G[u][nbr].get(weight, 1) + G[v][nbr].get(weight, 1)
...     return w
>>> # 一个包含4个节点和4条边的完全二分图
>>> B = nx.complete_bipartite_graph(2, 2)
>>> # 为边添加一些任意权重
>>> for i, (u, v) in enumerate(B.edges()):
...     B.edges[u, v]["weight"] = i + 1
>>> for edge in B.edges(data=True):
...     print(edge)
(0, 2, {'weight': 1})
(0, 3, {'weight': 2})
(1, 2, {'weight': 3})
(1, 3, {'weight': 4})
>>> # 默认情况下,权重是共享邻居的数量
>>> G = bipartite.generic_weighted_projected_graph(B, [0, 1])
>>> print(list(G.edges(data=True)))
[(0, 1, {'weight': 2})]
>>> # 要指定自定义权重函数,请使用weight_function参数
>>> G = bipartite.generic_weighted_projected_graph(
...     B, [0, 1], weight_function=jaccard
... )
>>> print(list(G.edges(data=True)))
[(0, 1, {'weight': 1.0})]
>>> G = bipartite.generic_weighted_projected_graph(
...     B, [0, 1], weight_function=my_weight
... )
>>> print(list(G.edges(data=True)))
[(0, 1, {'weight': 10})]