Ich habe eine sehr große scipy spärliche CSR-Matrix. Es ist eine 100.000x2.000.000 dimensionale Matrix. Nennen wir es X
. Jede Zeile ist ein Beispielvektor in einem 2.000.000 dimensionalen Raum.Wie man die verdichtete Form der paarweisen Abstände direkt erhält?
Ich muss die Kosinusabstände zwischen jedem Probenpaar sehr effizient berechnen. Ich habe sklearn pairwise_distances
Funktion mit einer Untermenge von Vektoren in X
verwendet, die mir eine dichte Matrix D gibt: die quadratische Form der paarweisen Abstände, die redundante Einträge enthält. Wie kann ich sklearn pairwise_distances
verwenden, um die komprimierte Form direkt zu erhalten? Bitte beachten Sie http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html, um zu sehen, was die kondensierte Form ist. Es ist die Ausgabe von scipy pdist
Funktion.
Ich habe Speicher Einschränkungen und ich kann nicht berechnen die quadratische Form und dann die verdichtete Form. Aufgrund von Speicherbeschränkungen kann ich scipy pdist
auch nicht verwenden, da es eine dichte Matrix X
benötigt, die nicht wieder in den Speicher passt. Ich dachte daran, verschiedene Blöcke von X
zu durchlaufen und die verdichtete Form für jeden Block zu berechnen und sie zu verbinden, um die vollständige kondensierte Form zu erhalten, aber das ist relativ umständlich. Irgendwelche besseren Ideen?
Jede Hilfe wird sehr geschätzt. Danke im Voraus.
Unten ist ein reproduzierbares Beispiel (natürlich zu Demonstrationszwecken X
ist viel kleiner):
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')
Wie Sie sehen dist2
in kondensierter Form und ist ein 499.500-dimensionaler Vektor. Aber dist1
ist in der symmetrischen Quadratform und ist eine 1000x1000 Matrix.
Sie benötigen ein konkretes Beispiel zu addieren; etwas, das wir kopieren-n-einfügen und ausführen können. Offensichtlich wird es nicht auf die Speicherprobleme stoßen. Aber Ihre verbale Beschreibung ist schwer zu folgen, es sei denn, wir arbeiten an genau dem gleichen Problem. Ich kenne den Sparse-Matrix-Code gut, habe aber nicht mit 'sklearn' gearbeitet. Eine Terminologie wie "verdichtete Form" ist also fremd. – hpaulj
@hpaulj Es scheint, als ob alles auf stackoverflow gefragt wird, eventuell: http://stackoverflow.com/questions/13079563/how-does-condensed-distance-matrix-work-pdist –
Es gab auch Fragen zum Ausfüllen eines oberen/Unteres Dreieck (oder beides) aus einem Vektor von Werten. – hpaulj