使用最短路径计算连接概率

时间:2015-10-01 01:19:16

标签: r graph igraph adjacency-matrix

我想知道igraph中是否有函数来计算加权图中顶点之间的连接概率,其中边的权重是相邻顶点连接的概率。

我已经基于这样的邻接矩阵构建了一个图形,其中相邻连接概率形成权重(这适用于河网,因此图的每个节点仅连接到单个下游节点)。

我原本希望在igraph中使用类似shortest.paths函数的东西,但是总和权重而不是计算它们的乘积,我无法找到改变它的方法。

下面的示例显示了我如何根据我拥有的数据构建邻接矩阵,即顶点连接到其下游顶点(ProbConn)的概率,然后是下游顶点(下游)的标识。最下游的顶点是河口,因此它与其他顶点无关(因此称为下游的向量以NA开头)。

library(igraph)

# vector of probability of connectivity to downstream vertex
ProbConn <- c(0, 1, 0.945881098491627, 0.997349787519144, 0.891475447373691,
0.993221681072185, 0.48071450525165, 0.0292543433507856, 0.0248645581575872,
1, 0.00540807765075205, 0.661465657844344, 0.108524549747512,
0.383311676351655, 0.708853495942148, 0.00150109592270933, 0.463859846404347,
0.0011491165581467, 2.87879700370202e-09, 0.536140153595653,
0.00831752330277812, 0.00185182893416988, 0.0186237313262708,
0.398961560996748, 0.582414707676981, 0.338534342155656, 1, 0.00137024127706289,
0.291146504057852, 1, 0.0743301054564134, 0.0514743607033332,
1, 1)

# the downstream vertex of each node
downstream <- c(NA, 1, 2, 3, 4, 5, 6, 2, 2, 7, 5, 8, 4, 6, 10, 3, 11, 3, 4,
11, 6, 6, 9, 9, 9, 8, 12, 5, 10, 13, 6, 6, 14, 15)

# Create the adjacency matrix from these vectors
adjacPI <- matrix(0, nrow=length(downstream), ncol=length(downstream)) # Set up the adjacency matrix to build the distance matrix

for (i in 1:length(downstream)) {
  adjacPI[i, downstream[i]] <- ProbConn[i]  # Fill the adjacency matrix
}

# create the graph reflecting the downstream connectivity
PIgraph <- graph.adjacency(adjacPI, weighted=T)
plot(PIgraph) # visualise the graph 

PIpath <- shortest.paths(PIgraph, mode="out") 
# creates  the shortest paths matrix based on summing the distances of each step along each path   

为了从最短路径矩阵PIpath中提取示例,顶点10和34通过顶点15连接。如在PIpath中计算的,顶点10和34之间的路径距离(PIpath [34,10])是1.708,这是顶点34和15之间连接概率的总和(PIpath [34,15] = 1),顶点15和10(PIpath [15,10] = 0.708)我希望它是一个产品,所以路径& #34;距离&#34; 10到34之间是1 * 0.708。

我不完全确定命名法,但我所寻找的矩阵的元素将是连接顶点之间每一步的转移概率的乘积。基本上用产品替换shortest.paths中的sum函数。

是否可以使用igraph中的函数计算,或者我是否需要单独编写一些代码才能执行此操作?

1 个答案:

答案 0 :(得分:5)

如果路径的链接具有成功的概率p_1, p_2, ..., p_n,那么(假设链接成功概率的独立性,我将在整个答案中执行)整个路径成功的概率是{{1 }}。正如您所说,这是一种产品,但最短的路径可以最小化总和;将产品转换为总和的常见技巧是取对数。路径成功的概率日志为p_1 * p_2 * ... * p_n。最大化(我们的目标)相当于最小化log(p_1) + log(p_2) + ... + log(p_n)。由于所有概率都介于0和1之间,因此它们的日志是非正数,因此其日志的负数是非负数。

总之,您可以将所有权重设置为(-log(p_1)) + (-log(p_2)) + ... (-log(p_n)),其中-log(p_i)是连接成功的概率,以及一对节点之间的最短路径(由{{计算] 1}} p_i中的函数将是最大化连接概率的路径。通过切换到shortest.paths,您可以根据向量igraphProbConn将图表构建为单线:

downstream