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

问题描述 投票:1回答:1

我遇到了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_matrix104矩阵的方形104。我发现了第一行和第一列之间的区别。然后我计算了零的数量,它小于104

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

编辑2。

我想做一个谱聚类。

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

r matrix igraph symmetric
1个回答
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如何工作(看起来像一个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
© www.soinside.com 2019 - 2024. All rights reserved.