寻找巨大的稀疏矩阵的最大特征值

时间:2018-11-28 00:30:31

标签: python numpy scipy sparse-matrix eigenvalue

我试图找到一个非常稀疏的邻接矩阵的最大特征值。我尝试使用我认为可用的所有方法:

mat = scipy.io.mmread(f)
mat = scipy.sparse.csr_matrix(mat)
G = nx.to_networkx_graph(mat)
mat = None

# compute largest eigenvalue
L = nx.normalized_laplacian_matrix(G)

# impl 1
e = numpy.linalg.eigvals(L.A)
# impl 2
e, _ = scipy.sparse.linalg.eigs(L.A, k=1, which='LA')
# impl 3
e, _ = scipy.sparse.linalg.eigs(L.A)

这三种实现在某个时刻都遇到类似的内存错误:

 e, _ = scipy.sparse.linalg.eigs(L.A)
 File "/usr/lib64/python3.7/site-packages/scipy/sparse/base.py", line 674, in __getattr__
return self.toarray()
File "/usr/lib64/python3.7/site-packages/scipy/sparse/compressed.py", line 947, in toarray
out = self._process_toarray_args(order, out)
File "/usr/lib64/python3.7/site-packages/scipy/sparse/base.py", line 1184, in _process_toarray_args
return np.zeros(self.shape, dtype=self.dtype, order=order)
MemoryError
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /usr/lib64/python3.7/site packages/scipy/sparse/base.py(1184)_process_toarray_args()
-> return np.zeros(self.shape, dtype=self.dtype, order=order)

(Pdb) print(self.shape)
(14259278, 14259278)

尝试生成1.6PB numpy数组后,大概是矩阵的密集表示形式。显然,我对此没有记忆。我确实有很多(128GB)。是否有一些不需要生成密集矩阵的实现方式或替代方式?不必是Python。

2 个答案:

答案 0 :(得分:3)

SciPy试图创建密集表示的唯一原因是因为您明确要求:

L.A

停止这样做。 scipy.sparse.linalg.eigs采用稀疏矩阵。您不需要.A产生的密集数组。另外,'LA'不是文档中which允许的值之一;您可能想要'LM'(默认设置)。

答案 1 :(得分:2)

使用networkx代替使用scipy.sparse.csgraph.laplacian(..., normed=True)。正如其他人指出的,L.A为您提供了密集的数组。