【问题标题】:subgraph extraction based on the edges weights and graph connectivity基于边权重和图连通性的子图提取
【发布时间】:2019-05-23 01:53:11
【问题描述】:

给定一个描述连通图的边及其权重的矩阵(见下文),我想根据边权重的阈值 x 提取子图。在文献中,我读到可以搜索 最大 x,从而使诱导子图是连通的。

由于假设初始图是连通的,因此必须有一个临界阈值x-critical,对于任何x <= x-critical,提取的子图都是连通的。

我想知道如何在 R 中实现它。例如,我的矩阵 (weights.matrix) 看起来像

| FROM | TO | WEIGHT |
| A    | B  | 0.0042 |
| A    | V  | 0.23   |
| G    | W  | 0.82   |
| ...  | ...| ...    |

我正在创建整个图表,使用 igraph 包,例如:

g <- igraph::graph_from_data_frame(weights.matrix, directed = TRUE)

有没有办法重复检查 - 通过在权重中应用不同的阈值从 min()max() - 如果发生的图表是连接的?我在谷歌中搜索了 igraph 中的此类功能,但找不到任何有用的东西。

这里有一些用于构建此类图表的代码。

library(igraph)

mat <- expand.grid(LETTERS[1:10], LETTERS[1:10])
mat$Weight <- runif(nrow(mat), 0.01, max = 1)
mat <- mat[mat$Var1!=mat$Var2, ] 

g <- graph_from_data_frame(mat)

另外here is a paper 在 pdf 的第 15 页,第 5 节第四节中提到了该技​​术。您可以将边缘相关性视为此处讨论的边缘权重。

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。
  • 我编辑了我最初的帖子并添加了一些代码示例。

标签: r graph igraph threshold


【解决方案1】:

我在 python 中工作,而不是 R,所以以下只是伪代码。

我会处理邻接矩阵(不是 igraph 对象),因为这将是最快的。 令A 为邻接矩阵,W 为权重排序列表,wW 的元素。 基本思想是遍历邻接矩阵A 中的所有权重,每个权重的阈值A 并检查空行(如果图是有向的,则检查列)。

那么有向案例的伪代码为:

function (A) -> w

W = sort(list(A))

for w in W:
    A' = A > w
    for row in A':
        if sum(row) == 0:
            for col in A':
                if sum(column) == 0: 
                     return w

有很多方法可以优化这一点,但这可以理解基本思想。 #

最快的方法可能是计算每行和每列的最大权重maxima_rowsmaxima_columns,找到它们的最小值min_max_rowmin_max_col,然后取它们中的最大值两个值来获取w

编辑:

在 python 中,快速方法如下所示:

from numpy import min, max

def find_threshold_that_disjoints_graph(adjacency_matrix):
    """
    For a weighted, fully connected graph, find the weight threshold that results in multiple components.

    Arguments:
    ----------
    adjacency_matrix: (N, N) ndarray of floats

    Returns:
    --------
    threshold: float

    """
    maxima_rows = max(adajacency_matrix, axis=1) # (N, ) vector
    maxima_cols = max(adajacency_matrix, axis=0) # (N, ) vector

    min_max_rows = min(maxima_rows) # float
    min_max_cols = min(maxima_cols) # float

    threshold = max([min_max_rows, min_max_cols])

    return threshold

【讨论】:

  • 这样的算法对我们正在寻找的东西有帮助吗(geeksforgeeks.org/bridge-in-a-graph)?
  • 我认为图是加权的并且最初是完全连接的?该页面似乎讨论了您希望以非常不同的方式处理的未加权案例。
  • 是的,你的想法是对的。我也在谈论加权图。我
  • 上面的伪代码实现了您链接的论文和问题描述中第 15 页的过程。这是否能很好地转化为“桥梁”的概念取决于这些权重在物理上实际代表什么。如果不深入了解数据采集和处理,这个问题是无法回答的。
  • 你好。您在此处建议的最快方法是否适用于无向图?如果是,我应该只关心行吗?另外,我无法准确理解min_max_rows 代表什么。它是一个值向量还是只是maxima_rows 的最小权重?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2021-04-10
  • 1970-01-01
相关资源
最近更新 更多