gpt4 book ai didi

r - 从概率有向图的一阶邻接矩阵计算二阶邻接矩阵的快速算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:15:14 26 4
gpt4 key购买 nike

我正在使用如下所示的邻接矩阵:

N <- 5
A <- matrix(round(runif(N^2),1),N)
diag(A) <- 0

1> A
[,1] [,2] [,3] [,4] [,5]
[1,] 0.0 0.1 0.2 0.6 0.9
[2,] 0.8 0.0 0.4 0.7 0.5
[3,] 0.6 0.8 0.0 0.8 0.6
[4,] 0.8 0.1 0.1 0.0 0.3
[5,] 0.2 0.9 0.7 0.9 0.0

概率和定向。

这是一种缓慢的方法来计算 i 通过至少一个其他节点链接到 j 的概率:

library(foreach)
`%ni%` <- Negate(`%in%`) #opposite of `in`
union.pr <- function(x){#Function to calculate the union of many probabilities
if (length(x) == 1){return(x)}
pr <- sum(x[1:2]) - prod(x[1:2])
i <- 3
while(i <= length(x)){
pr <- sum(pr,x[i]) - prod(pr,x[i])
i <- 1+i
}
pr
}

second_order_adjacency <- function(A, i, j){#function to calculate probability that i is linked to j through some other node
pr <- foreach(k = (1:nrow(A))[1:nrow(A) %ni% c(i,j)], .combine = c) %do% {
A[i,k]*A[k,j]
}
union.pr(pr)
}
#loop through the indices...
A2 <- A * NA
for (i in 1:N){
for (j in 1:N){
if (i!=j){
A2[i,j] <- second_order_adjacency(A, i, j)
}
}}
diag(A2) <- 0
1> A2
[,1] [,2] [,3] [,4] [,5]
[1,] 0.000000 0.849976 0.666112 0.851572 0.314480
[2,] 0.699040 0.000000 0.492220 0.805520 0.831888
[3,] 0.885952 0.602192 0.000000 0.870464 0.790240
[4,] 0.187088 0.382128 0.362944 0.000000 0.749960
[5,] 0.954528 0.607608 0.440896 0.856736 0.000000

此算法可扩展为 N^2,并且我有数千个节点。而且我的矩阵并不是那么稀疏——很多小数字和一些大数字。我可以将它并行化,但我只会除以核心数。是否有一些矢量化技巧可以让我利用矢量化操作的相对速度?

tl;dr:如何快速计算概率有向图中的二阶邻接矩阵?

最佳答案

你的 union.pr 函数比简单高效的方法慢 500 倍。因此,将 union.pr 替换为 1-prod(1-pr),您将获得 500 倍的速度。

x <- runif(1000)*0.01

t1 <- proc.time()
for (i in 1:10000){
y <- union.pr(x)
}
t1 <- proc.time()-t1
print(t1)
# user system elapsed
# 21.09 0.02 21.18

t2 <- proc.time()
for (i in 1:10000){
y <- 1-prod(1-x)
}
t2 <- proc.time() - t2
print(t2)
# user system elapsed
# 0.04 0.00 0.03

关于r - 从概率有向图的一阶邻接矩阵计算二阶邻接矩阵的快速算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42033675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com