给出一个描述所连接图形的边缘及其权重的矩阵(请参见下文),我想基于边缘权重的阈值 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节的第四部分中引用了该技术。您可以将边缘相关性视为此处讨论的边缘权重。
答案 0 :(得分:1)
我在python中工作,而不是R,所以下面只是伪代码。
我将处理邻接矩阵(而不是igraph对象),因为这将是最快的。
假设A
是邻接矩阵,W
是权重的排序列表,w
是W
的元素。
基本思想是对每个权重的邻接矩阵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_rows
和maxima_columns
,找到其中的最小值min_max_row
和min_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