У меня очень большая scipy разреженная матрица csr. Это размерная матрица 100 000x2 000 000. Назовем его X
. Каждая строка представляет собой выборочный вектор в 2 000 000-мерном пространстве.
Мне нужно очень эффективно вычислять косинусные расстояния между каждой парой выборок. Я использовал функцию sklearn pairwise_distances
с подмножеством векторов в X
, что дает мне плотную матрицу D: квадратную форму попарных расстояний, которая содержит избыточные элементы. Как я могу использовать sklearn pairwise_distances
для прямого получения сжатой формы? См. http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html, чтобы увидеть, что такое сжатая форма. Это результат функции scipy pdist
.
У меня ограниченная память, и я не могу вычислить квадратную форму, а затем получить сжатую форму. Из-за ограничений памяти я также не могу использовать scipy pdist
, так как для этого требуется плотная матрица X
, которая опять же не помещается в памяти. Я подумал о том, чтобы пройтись по разным фрагментам X
и вычислить сжатую форму для каждого фрагмента и соединить их вместе, чтобы получить полную сжатую форму, но это относительно громоздко. Есть идеи получше?
Любая помощь очень ценится. Заранее спасибо.
Ниже приведен воспроизводимый пример (конечно, в демонстрационных целях X
намного меньше):
from scipy.sparse import rand
from scipy.spatial.distance import pdist
from sklearn.metrics.pairwise import pairwise_distances
X = rand(1000, 10000, density=0.01, format='csr')
dist1 = pairwise_distances(X, metric='cosine')
dist2 = pdist(X.A, 'cosine')
Как вы видите, dist2
находится в сжатой форме и представляет собой 499500-мерный вектор. Но dist1
имеет симметричную квадратную форму и представляет собой матрицу 1000x1000.
sklearn
. Поэтому такая терминология, как «конденсированная форма», чужда. - person hpaulj   schedule 12.07.2016