基于边缘权重和图形连通性的子图提取

时间:2018-07-02 20:04:49

标签: r graph igraph threshold

给出一个描述所连接图形的边缘及其权重的矩阵(请参见下文),我想基于边缘权重的阈值 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()的权重中应用不同的阈值-是否连接了发生的图形?我在Google中搜索了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节的第四部分中引用了该技术。您可以将边缘相关性视为此处讨论的边缘权重。

1 个答案:

答案 0 :(得分: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