【问题标题】:From a matrix of distances to a matrix of adjacency从距离矩阵到邻接矩阵
【发布时间】:2016-03-09 10:24:38
【问题描述】:

我有一个 1024x1024 的距离矩阵,其中包含所有术语之间的所有距离。我想从那开始定义一个图表。所以我定义了一个最小生成树,并计算了它的邻接矩阵。

我的距离矩阵是distMat

matrix_of_distances <- as.matrix(distMat)
myGraph <- graph.adjacency(matrix_of_distances, weighted=TRUE)

我的图是一个包含所有可能弧线的图(因为所有项之间的距离都是有限值)。我需要另一个更稀疏的图:

mst <- as.undirected(minimum.spanning.tree(myGraph))

从该稀疏图中,我可以计算邻接矩阵:

adjacency <- as_adjacency_matrix(mst, type = c("both", "upper", "lower"), attr = NULL, edges = FALSE, names = TRUE, sparse =igraph_opt("sparsematrices"))

现在我想以不同的方式创建矩阵邻接,传递另一个最小生成树对象。假设我创建了另一棵生成树:

spt <- spantree(matrix_of_distances)

如果我这样做:

adjacency <- as_adjacency_matrix(spt, type = c("both", "upper", "lower"), attr = NULL, edges = FALSE, names = TRUE, sparse =igraph_opt("sparsematrices"))

我得到错误:

as_adjacency_matrix(spt, type = c("both", "upper", "lower"), : 不是图形对象

我再次尝试从最小生成树生成邻接矩阵。我该如何解决?

【问题讨论】:

    标签: r distance igraph minimum-spanning-tree adjacency-matrix


    【解决方案1】:

    错误来自您在 spantree 类的对象上使用函数 as_adjacency_matrix,而它需要 igraph

    由于您使用的是igraph,一个简单的解决方案是使用igraph 的函数mst 从原始“距离图”计算最小生成树。

    下面是spantree 计算最小生成树的方法:

    require(vegan)
    data(dune)
    dis <- vegdist(dune)
    tr <- spantree(dis)
    

    结果是下面的树 (plot(tr, type="t"))

    :

    您只能使用igraph 函数获得相同的结果:

    library(igraph)
    g  <- graph.adjacency(as.matrix(dis), weighted=TRUE)
    g_mst <- mst(g)
    

    生成的树看起来像这样 (plot(g_mst, vertex.color=NA, vertex.size=10, edge.arrow.size=0.5)):

    一旦你有了你的igraph 树,你就已经知道你可以用函数as_adjacency_matrix 将它转换成一个邻接矩阵:

    A <- as_adjacency_matrix(mst)
    

    【讨论】: