【问题标题】:Ranking non edges of graph based on score matrix基于分数矩阵对图的非边进行排名
【发布时间】:2017-12-01 16:22:16
【问题描述】:
import networkx as nx
import numpy as np
G = nx.MultiGraph()
G.add_edges_from([('1', '2'), ('1', '3'),('1','5'),('2','4')])
l= list(nx.non_edges(G))

score=np.array([[0.9,0.7,0.2,0.6,0.4],[0.7,0.9,0.6,0.8,0.3],[0.2,0.6,0.9,0.4,0.7],[0.6,0.8,0.4,0.9,0.3],[0.4,0.3,0.7,0.3,0.9]])

我想根据分数矩阵对非边缘进行排名,即非边缘 1-4 的分数为 0.6,2-5 的分数为 0.3,因此输出将为 [1-4,2-5]

edit-我的实际数据采用 pandas 数据框的形式(下面是我的实际数据集的玩具数据集示例),我将其转换为 networkx 图形对象。

data1 = { 'node1': [1,1,1,2],
     'node2': [2,3,5,4],
     'weight': [1,1,1,1], }
df1 = pd.DataFrame(data1, columns = ['node1','node2','weight'])

分数矩阵是一个 5X5 矩阵的形式,其中元素 score[1,4] 表示节点 1 和 4 之间的边,其分数为 0.6

edit2-
从图 1 我们可以看到缺失的边是 1-4,2-3,2-5,3-4,3-5,3-5,它们各自的得分是 0.6 0.6 0.3 0.4 0.3 0.7 所以我们根据分数对它们进行排名,最终输出为 3-5 1-4 2-3 3-4 2-5 4-5

【问题讨论】:

  • 更多信息会有所帮助:1) 您是否假设您的图表将包含 5 个元素? 2)分数数组中的位置是否对应于图的邻接矩阵? 3) 我在分数数组中的任何地方都看不到 0.5——如何将该值分配给任何边缘(或非边缘)?
  • @apollo2020 看到上面的编辑

标签: python graph networkx


【解决方案1】:

虽然您可以使用 nx.non_edges() 找到图中缺少边的位置,但该函数实际上并没有返回可以分配数据的对象——逻辑图中不存在非边,之后全部。但是,您可以创建第二个图表,其中包含第一个图表中没有的所有边,然后将您的分数分配给第二个图表中的边。

import networkx as nx
import numpy as np


G1 = nx.MultiGraph()
G1.add_edges_from([
    ('1', '2'),
    ('1', '3'),
    ('1', '5'),
    ('2', '4')])

G2 = nx.MultiGraph()
G2.add_edges_from(nx.non_edges(G1))

score = np.array([
    [0.9, 0.7, 0.2, 0.6, 0.4],
    [0.7, 0.9, 0.6, 0.8, 0.3],
    [0.2, 0.6, 0.9, 0.4, 0.7],
    [0.6, 0.8, 0.4, 0.9, 0.3],
    [0.4, 0.3, 0.7, 0.3, 0.9]])

for u, v, d in G2.edges(data=True):
    i = int(u) - 1
    j = int(v) - 1
    d['score'] = score[i, j]

编辑-

现在我知道您只关心排序的边向量,不需要为边分配分数,无需调用第二张图即可完成。您可以使用内置的 sorted() 函数并为 key 参数指定一个 lambda 函数。 lambda 查找每条边的得分值并使用该值进行排序。由于您首先需要高分边缘,因此您还必须指定 reverse=True。

import networkx as nx
import numpy as np


G = nx.MultiGraph()
G.add_edges_from([
    ('1', '2'),
    ('1', '3'),
    ('1', '5'),
    ('2', '4')])

score = np.array([
    [0.9, 0.7, 0.2, 0.6, 0.4],
    [0.7, 0.9, 0.6, 0.8, 0.3],
    [0.2, 0.6, 0.9, 0.4, 0.7],
    [0.6, 0.8, 0.4, 0.9, 0.3],
    [0.4, 0.3, 0.7, 0.3, 0.9]])

ranked_non_edges = sorted(
    nx.non_edges(G),
    key=lambda e: score[int(e[0])-1, int(e[1])-1],
    reverse=True)

【讨论】:

  • 输出向量是哪一个?
  • 由于您没有定义函数或提供所有代码,我不确定上面示例中的输出是什么意思。您能解释一下为什么上面示例的输出是 [1-4, 2-5] 吗?
  • 从图1我们可以看到缺失的边是1-4,2-3,2-5,3-4,3-5,3-5,它们各自的得分是0.6 0.6 0.3 0.4 0.3 0.7 所以我们根据分数对它们进行排名,所以最终的输出是 3-5 1-4 2-3 3-4 2-5 4-5
  • 我在上面更新了我的答案。知道您只需要排序的边向量而不需要在图中存储分数会更容易。
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多