我遇到了why-laplacian-matrix-need-normalization-and-how-come-the-sqrt-of-degree-matrix。
我有一个加权邻接矩阵adjm
(Google Drive上的文件data.csv)。矩阵adjm
是非对称的。我已经构建了有向图graph
,然后删除循环和多个边。结果图表连接简单。我使用了graph.laplacian()
包中的igraph
函数。我期望获得对称矩阵,但矩阵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_matrix
是104
矩阵的方形104
。我发现了第一行和第一列之间的区别。然后我计算了零的数量,它小于104
。
test0 <- L_matrix[1,] - L_matrix[,1]
test0 <- test0[test0 == 0]
length(test0[test0 == 0])
[1] 90
编辑2。
我想做一个谱聚类。
题。为什么拉普拉斯矩阵不对称?
“结果图是连通且简单的”是不对的:图仍然是定向的,并且邻接矩阵不是对称的。例如。,
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
如何工作(看起来像一个bug;至少它与文档相矛盾)。我们手动执行规范化步骤
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