python - 寻找巨大稀疏矩阵的最大特征值
问题描述
我试图找到一个非常稀疏的邻接矩阵的最大特征值。我尝试使用我看到的所有可用方法:
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。
解决方案
SciPy 试图创建密集表示的唯一原因是因为您特别要求一个:
L.A
别那样做。scipy.sparse.linalg.eigs
采用稀疏矩阵。您不需要密集阵列.A
产生。此外,'LA'
这不是which
文档中允许的值之一;你可能想要'LM'
(默认)。
推荐阅读
- sql - 如何构建我的 WHERE 子句以根据此特定条件提取记录?
- python - 需要帮助了解如何在 tkinter python 中初始化类
- php - 如何在 Windows 中安装 php-xml 扩展?
- javascript - MediaElement.js 如何检查当前视频是否来自大量广告
- java - 在前一个 Activity 的 RadioButton 中选择另一个项目时,当前 Activity 的文本框不会更新。安卓/Java
- python - python 上的 isnull 方法
- flutter - 行中的 AutoSizeText 问题
- angular - 将 *NgFor 用于表标题并使用单独的 *NgFor 用于行并将行与列匹配
- javascript - 我们如何验证 Signaturepad 中的单个点
- javascript - 如何使用javascriptexecutor在webdriverio中获取特定shadow dom web元素的文本