在R

时间:2016-02-24 13:21:11

标签: r adjacency-matrix

我使用函数amat从包'bnlearn'得到一个邻接矩阵(矩阵是非循环的)。例如:

    +---+-------------------------------+               
    |   |   1     2     3     4     5   |               
    +---+-------------------------------+               
    | 1 |   0     1     0     0     0   |               
    | 2 |   0     0     1     0     0   |               
    | 3 |   0     0     0     1     0   |               
    | 4 |   0     0     0     0     1   |               
    | 5 |   0     0     0     0     0   |               
    +---+-------------------------------+           

我需要从中找到完整的依赖矩阵。 对于一个滞后依赖矩阵,我可以使用:

New_matrix<- if(old_matrix+old_matrix*old_matrix)>0 then 1 else 0

对于两个滞后依赖矩阵,我可以使用:

New_matrix_2<- if(new_matrix+new_matrix*old_matrix)>0 then 1 else 0

问题是我不知道邻接在哪里完成,也就是说我运行了多少次迭代以获得包含所有相互依赖性的最终矩阵?

    +---+-------------------------------+               
    |   |   1     2     3     4     5   |               
    +---+-------------------------------+               
    | 1 |   0     1     1     1     1   |               
    | 2 |   0     0     1     1     1   |               
    | 3 |   0     0     0     1     1   |               
    | 4 |   0     0     0     0     1   |               
    | 5 |   0     0     0     0     0   |               
    +---+-------------------------------+ 

为此,答案是3次迭代。但我需要解决的矩阵是500x500。 是否有直接的方法来达到完整的邻接矩阵?

1 个答案:

答案 0 :(得分:1)

要查找所有节点的路径,可能更容易使用igraph包。

使用您的示例,

library(bnlearn)
library(igraph)

# Create BN in your example
g <- empty.graph(LETTERS[1:5])
amat(g) <- rbind(cbind(0, diag(4)),0)
amat(g)
#   A B C D E
# A 0 1 0 0 0
# B 0 0 1 0 0
# C 0 0 0 1 0
# D 0 0 0 0 1
# E 0 0 0 0 0
# Convert to igraph object using BN adj. matrix as input
g1 <- graph_from_adjacency_matrix(amat(g))

# You can find all ancestors for each node by using 
# the mode="in" argument, and order to specify the depth of the search
neighborhood(g1, order=nrow(amat(g)), mode="in")

# Similarly, you can get the full connected graph 
# using the same options
ances <- connect(g1, order=nrow(amat(g)), mode="in" )
get.adjacency(ances, sparse=FALSE)
#   A B C D E
# A 0 1 1 1 1
# B 0 0 1 1 1
# C 0 0 0 1 1
# D 0 0 0 0 1
# E 0 0 0 0 0 

或者,您可以使用矩阵指数

m <- amat(g)
1* as.matrix((Matrix::expm(m) - diag(ncol(m))) > 0)