如何基于二元矩阵计算概率矩阵?

时间:2019-04-18 06:45:36

标签: r matrix vector igraph

enter image description here 我的尝试是:

library(igraph)

set.seed(41)
n<-10

A <- sample.int (2, n*n, TRUE)-1L; dim(A) <- c(n,n); 
m <- sum(A)

g <- graph_from_adjacency_matrix(A)

k_in  <- degree(g, v = V(g), mode = "in", loops = TRUE, normalized = FALSE)#; k_in
k_out <- degree(g, v = V(g), mode = "out", loops = TRUE, normalized = FALSE)#; k_out

p <- (k_in %*% t(k_out) / (2*m))/(k_in %*% t(k_out) / (2*m) + k_in %*% t(k_out) / (2*m)) 

round(p, 3)

概率矩阵p的所有值均为0.5。

我认为p的分母有误,因为矩阵A不是对称的。

问题。如何正确指定分母?

编辑。在斯特凡·洛朗(StéphaneLaurent)回答之后。

我认为我们应该具有不同的值:k_j_out,k_i_in,k_i_out,k_j_in。 enter image description here

最后,我需要获得权重矩阵W。

I <- matrix(0, n, n); diag(I) <- 1
W <- A %*% (I - P) - t(A) %*% (I - P)

我认为这个矩阵应该对称。

1 个答案:

答案 0 :(得分:1)

2m是无用的,因为它同时出现在分子和分母上。您可以这样做:

p <- (k_in %*% t(k_out))/(k_out %*% t(k_in) + k_in %*% t(k_out))

或者,只需较少的计算即可:

M <- k_in %*% t(k_out)
M / (M + t(M))

编辑

我们可以检查:

i <- 2; j <- 3
k_out[j] * k_in[i] / (k_out[j] * k_in[i] + k_out[i] * k_in[j])
# 0.5384615
p[i,j]
# 0.5384615