存储在稀疏矩阵中的对称矩阵半定性的一种更好的检验方法?

2024-03-29 09:59:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大的对称矩阵要在RAM中存储和操作(大约40,000 * 40,000),所以我使用scispy.稀疏格式存储它的一半,下面是我的代码
import numpy as np
from scipy.sparse import coo_matrix
def to_sparse(W):
    tmp = np.tril(W)
    del W
    return coo_matrix(tmp)
然后我要计算W对称的拉普拉斯矩阵),根据公式L = D - W(其中D是对角线矩阵,其对角线是W的列或行的和),根据L的定义,我需要检查它是否是半正定的(PSD)。 但是,计算稀疏格式存储的'L'的特征值似乎并不等同于原始问题,所以我必须将L转换为密集格式,然后检查?我的问题:有没有更好的方法来实现这一点而不将L转换回稠密矩阵?

下面是我生成L并检查PSD的代码:

^{pr2}$

很抱歉在上传之前没有检查代码示例,现在我已经修复了这些错误,下面是一个示例:

W = np.random.random_integers(1, 100, size = (100, 100))
W = .5 * (W + W.T)
W = to_sparse(W)
L = gen_laplacian(W)

Tags: to代码import示例格式np矩阵random
1条回答
网友
1楼 · 发布于 2024-03-29 09:59:14

原始数组是否已经稀疏(大量的零),或者那些仅仅是tril的乘积?如果是后者,则使用稀疏代码可能无法节省空间或时间。例如

def gen1(W):
    tmp = np.tril(W)
    d = tmp.sum(0)+tmp.sum(1)-tmp.diagonal()
    return np.diag(d) - tmp

对于这个100x100测试,比gen_laplacian(to_sparse(W))快8倍。在

^{pr2}$

甚至check(L.A)也快2倍。在

但是你需要构造orginal_L?看起来linalg.eigh(L.A)会产生相同的结果,因为the calculation is done with the lower triangular part。并不是说构造orginal_L需要很多时间。在

但测试问题的关键在于,像eigsh这样的sparse.linalg函数是否产生与eigh等价的东西。在

我对这些eigh函数了解得不够多,不深入了解文档就可以了。在

相关问题 更多 >