【问题标题】:Why is the Laplacian Matrix not symmetric?为什么拉普拉斯矩阵不对称?
【发布时间】:2019-09-03 21:12:06
【问题描述】:

我遇到了why-laplacian-matrix-need-normalization-and-how-come-the-sqrt-of-degree-matrix

我有一个加权邻接矩阵adjm(Google Drive 上的文件data.csv)。矩阵adjm 是非对称的。我已经构建了有向图graph,然后删除了循环和多条边。结果图是连接的和简单的。我使用了igraph 包中的graph.laplacian() 函数。我希望得到对称矩阵,但是矩阵L_matrix 不是对称的。

library(igraph)

# read from file    
adjm = as.matrix(read.csv("data.csv", sep=",", row.names = 1))

isSymmetric(adjm) # FALSE

graph <- graph_from_adjacency_matrix(adjm, weighted=TRUE)

table(count_multiple(graph))

# remove loops and multiple edges
graph <- simplify(graph) 

is_connected(graph) # TRUE

L_matrix <- graph.laplacian(graph, norm=TRUE, 
                            weights = E(graph)$weight, 
                            sparse=FALSE)

isSymmetric(L_matrix) # FALSE

编辑。我尝试将容差 tol 从 0.1 更改为 0.0001,但结果是 FALSE

isSymmetric(L_matrix, tol = 0.01) # FALSE

L_matrix104104 矩阵的平方。我发现了第一行和第一列之间的区别。然后我计算了零的个数,小于104

test0 <- L_matrix[1,] - L_matrix[,1]
test0 <- test0[test0 == 0]
length(test0[test0 == 0])
[1] 90

编辑 2。

我想做一个谱聚类。

问题。 为什么拉普拉斯矩阵不对称?

【问题讨论】:

    标签: r matrix igraph symmetric


    【解决方案1】:

    “结果图是连通且简单的” 不正确:图仍然是有向的,并且邻接矩阵不是对称的。例如,

    as_adjacency_matrix(graph)[1:5, 1:5]
    # 5 x 5 sparse Matrix of class "dgCMatrix"
    #      dddd dddD ddDd ddDD dDdd
    # dddd    .    .    .    .    .
    # dddD    .    .    .    .    .
    # ddDd    .    .    .    .    .
    # ddDD    .    .    .    .    .
    # dDdd    .    1    .    .    .
    

    因此,拉普拉斯算子也不是对称的。

    编辑:为了使图形无向,我们可以使用

    adjm <- pmax(adjm, t(adjm))
    all(adjm == t(adjm))
    # [1] TRUE
    

    这样,两个元素 (i,j) 和 (j,i) 都被两者中较大的一个替换。有趣的是,它仍然不能使拉普拉斯算子对称:

    L_matrix[1:5, 1:5]
    #      dddd        dddD ddDd ddDD       dDdd
    # dddd    1  0.00000000    0    0  0.0000000
    # dddD    0  1.00000000    0    0 -0.0703125
    # ddDd    0  0.00000000    1    0  0.0000000
    # ddDD    0  0.00000000    0    1  0.0000000
    # dDdd    0 -0.06575342    0    0  1.0000000
    

    问题在于normalized = TRUE 的工作方式(看起来像一个错误;至少它与文档相矛盾)。手动执行标准化步骤

    L_matrix <- graph.laplacian(graph, norm = FALSE, 
                                weights = E(graph)$weight,
                                sparse = FALSE)
    L_matrix <- diag(1 / sqrt(diag(L_matrix))) %*% L_matrix %*% diag(1 / sqrt(diag(L_matrix)))
    isSymmetric(L_matrix)
    # [1] TRUE
    L_matrix[1:5, 1:5]
    #      [,1]        [,2] [,3] [,4]        [,5]
    # [1,]    1  0.00000000    0    0  0.00000000
    # [2,]    0  1.00000000    0    0 -0.06799476
    # [3,]    0  0.00000000    1    0  0.00000000
    # [4,]    0  0.00000000    0    1  0.00000000
    # [5,]    0 -0.06799476    0    0  1.00000000
    

    【讨论】:

    • igraph包中是否存在生成对称矩阵的函数?
    • 这不是关于现有的,而是关于你真正想要实现的目标。你想如何对称矩阵?如果两个有向边都存在,您是否希望存在无向边?还是一个就够了?
    • 我想做一个光谱聚类。我正在寻找相互的k-最近邻居。但我认为一个优势就足够了。
    • 感谢您的回答。为什么使用命令 all(adjm == t(adjm)) 而不是 isSymmetric(adjm)?因为 adjm 的对角线元素不是零?
    • @Nick,因为isSymmetric(adjm)FALSE,这显然是错误的,我不想寻找细节原因,但现在我检查并看到isSymmetric 对称要求列名和行名也要相同。 adjm 不满足这一点,因此返回 FALSE。修复行名后,它也会返回 TRUE
    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    相关资源
    最近更新 更多