Scipy разреженные матрицы не эффективны в памяти в подобии косинуса - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь реализовать косинусное сходство, используя скудные разреженные матрицы, так как получаю ошибку памяти с нормальными матрицами (не разреженными).Однако я заметил, что объем памяти (в байтах) косинусного подобия разреженных и не разреженных матриц почти одинаков, когда размер входной матрицы (наблюдений) велик.Я делаю что-то не так или есть способ обойти это?Вот код, где вход имеет 5% как 1 и 95% как 0.

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from scipy import sparse
A = np.random.rand(10000, 1000)<.05
A_sparse = sparse.csr_matrix(A)
similarities = cosine_similarity(A_sparse)

# output sparse matrices
similarities_sparse = cosine_similarity(A_sparse,dense_output=False)

print("1's percentage", np.count_nonzero(A)/np.size(A))
print('memory percentage', similarities_sparse.data.nbytes/similarities.data.nbytes)

Выход одной руны:

1's percentage 0.0499615
memory percentage 0.91799018

1 Ответ

0 голосов
/ 26 марта 2019

Обработка комментариев @ hpaulj в ответ:

Оба ваших звонка на cosine_similarity возвращают одни и те же базовые данные.Эта матрица сходства косинусов в основном не равна нулю, поэтому использование разреженного формата не экономит место.

Входные данные, состоящие в основном из нулей, необязательно (или даже обычно) дают матрицу сходства косинусов, которая в основном состоит из нулей.Косинус (i, j) = 0 происходит (*) только для пары строк (i, j) матрицы, если они не имеют значений ни в одном из столбцов.

(* Или если точкаВ противном случае товар выходит на 0, но это побочный момент здесь.)

...