MemoryError при вычислении скалярного произведения огромных разреженных матриц - PullRequest
0 голосов
/ 05 февраля 2019

Предположим следующий случай: я получил матрицу смежности двухрежимной сети, в которой одно измерение представляет некоторые элементы (сообщения), а другие теги встречаются под каждым элементом.Теперь я хочу свернуть эту сеть с двумя режимами, чтобы получить сеть с одним режимом отношений элемент-к-элементу, где значение каждой ссылки представляет количество общих тегов обоих элементов.Это может быть достигнуто с помощью простого умножения матрицы следующим образом:

enter image description here

или в коде:

from scipy.sparse import csr_matrix, save_npz, load_npz

# load matrix
tpm = csr_matrix(load_npz('tag_post_matrix.npz'))

# compute dot product
cn = tpm.transpose().dot(tpm)

# save result
save_npz('content_network_abs.npz', cn)

, который вызывает этоошибка после запуска в течение некоторого времени:

---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-27-10ff98c2505a> in <module>()
----> 1 cn = tpm.transpose().dot(tpm)
      2 save_npz(expand('content_network_abs.npz'), cn)
      3 

/opt/anaconda/lib/python3.7/site-packages/scipy/sparse/base.py in dot(self, other)
    359 
    360         """
--> 361         return self * other
    362 
    363     def power(self, n, dtype=None):

/opt/anaconda/lib/python3.7/site-packages/scipy/sparse/base.py in __mul__(self, other)
    477             if self.shape[1] != other.shape[0]:
    478                 raise ValueError('dimension mismatch')
--> 479             return self._mul_sparse_matrix(other)
    480 
    481         # If it's a list or whatever, treat it like a matrix

/opt/anaconda/lib/python3.7/site-packages/scipy/sparse/compressed.py in _mul_sparse_matrix(self, other)
    500                                     maxval=nnz)
    501         indptr = np.asarray(indptr, dtype=idx_dtype)
--> 502         indices = np.empty(nnz, dtype=idx_dtype)
    503         data = np.empty(nnz, dtype=upcast(self.dtype, other.dtype))
    504 

MemoryError: 

Я контролировал ОЗУ во время выполнения без каких-либо исключительных наблюдений (у меня достаточно памяти: ~ 1 ТБ).

Исходная матрица имеет ~ 24000000 ненулевых значенийзаписей (очень разреженных), и я ожидаю, что результирующая матрица тоже будет довольно разреженной.

Есть ли у меня общее недопонимание по теме или в коде есть ошибка?

Спасибозаранее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...