【发布时间】:2014-11-30 12:47:54
【问题描述】:
我有一个非常大的对称矩阵要在 RAM 中存储和操作(约
40,000 * 40,000),所以我使用 scispy.sparse 格式来存储它的一半,下面是我的代码
import numpy as np
from scipy.sparse import coo_matrix
def to_sparse(W):
tmp = np.tril(W)
del W
return coo_matrix(tmp)
然后我想根据公式L = D - W,计算W的拉普拉斯矩阵(对称矩阵),(其中D是对角矩阵,其对角线是W 的列或行的总和,根据L 的定义,我需要检查它是否是正半正定(PSD)。
但是好像计算稀疏格式存储的'L'的特征值不等于原来的问题,所以我必须将L转换为密集格式,然后检查? 我的问题:有没有更好的方法可以在不将 L 转换回密集矩阵的情况下实现这一目标?
下面是我生成 L 并检查 PSD 的代码:
from scipy.sparse import diags
from numpy import linalg
def gen_D(W):
# W is sparse matrix
tmp = W.sum(axis = 0)
tmp2 = W.sum(axis = 1).T - W.diagonal()
return np.squeeze(np.asarray(tmp + tmp2))
def gen_laplacian(W):
D = gen_D(W)
return diags(D, 0).tocoo() - W
def check_PSD(L):
origin_L = L.todense() + L.T.todense() - np.diag(L.diagonal())
E, V = linalg.eigh(origin_L)
return np.all(E > -1e-10)
很抱歉我在上传之前没有检查代码示例,现在我已经修复了错误,下面是一个示例:
W = np.random.random_integers(1, 100, size = (100, 100))
W = .5 * (W + W.T)
W = to_sparse(W)
L = gen_laplacian(W)
【问题讨论】:
-
给我们一个工作示例(带有一个小的
W)。有几个错误,例如删除后使用W,将.T应用于一维数组,缺少返回值。由于代码将无法正常工作。 -
@hpaulj 很抱歉我在检查之前赶紧上传代码,现在我已经修复了错误
-
使用
csr_matrix而不是coo可以节省一些时间(在数学运算中)。 -
@hpaulj 你是对的,我阅读了
scipy.sparse的文档,它一旦生成coo_matrix或lil_matrix,将其转换为csc_matrix或csr_matrix将加速计算.但我仍然想知道是否有更好的方法来检查 PSD,或者对称矩阵的特征值与其三角形特征值之间是否存在任何特定关系?
标签: python numpy scipy linear-algebra sparse-matrix