Verbesserte Leistung der Multiplikation von Scipy-Sparse-Matrizen

8

Angesichts einer Scipy CSC Sparse-Matrix "sm" mit Dimensionen (170k x 170k) mit 440 Millionen Nicht-Null-Punkten und einem spärlichen CSC-Vektor "v" (170k x 1) mit einigen Nicht-Null-Punkten, gibt es irgendetwas das kann getan werden, um die Leistung der Operation zu verbessern:

%Vor%

?

Momentan dauert es ungefähr 1 Sekunde. Durch das Initialisieren der Matrizen als CSR wurde die Zeit um bis zu 3 Sekunden erhöht, sodass CSC besser abschnitt.

SM ist eine Matrix von Ähnlichkeiten zwischen Produkten und V ist der Vektor, der angibt, welche Produkte der Benutzer gekauft oder angeklickt hat. Also für jeden Benutzer sm ist das gleiche.

Ich benutze Ubuntu 13.04, Intel i3 @ 3.4GHz, 4 Cores.

Recherchiere über SO Ich lese über Ablas-Paket. Ich tippte in das Terminal:

%Vor%

Was dazu führte:

%Vor%

Und was ich verstanden habe, bedeutet, dass ich bereits ein Hochleistungspaket von Ablas verwende. Ich bin mir immer noch nicht sicher, ob dieses Paket bereits parallele Berechnungen implementiert, aber es sieht so aus.

Könnte die Multi-Core-Verarbeitung die Leistung steigern? Wenn ja, gibt es eine Bibliothek, die in Python hilfreich sein könnte?

Ich habe auch über die Idee nachgedacht, dies in Cython zu implementieren, aber ich weiß nicht, ob dies zu guten Ergebnissen führen würde.

Vielen Dank im Voraus.

    
Willian Fuks 03.09.2013, 15:24
quelle

2 Antworten

10

Die Sparse-Matrix-Multiplikationsroutinen sind direkt in C ++ codiert, und soweit ein kurzer Blick auf die Quelle zeigt, scheint es keinen Haken bei einer optimierten Bibliothek zu geben. Außerdem scheint es nicht auszunutzen, dass die zweite Matrix ein Vektor ist, um Berechnungen zu minimieren. So können Sie die Dinge wahrscheinlich etwas beschleunigen, indem Sie auf die Eingeweide der dünn besetzten Matrix zugreifen und den Multiplikationsalgorithmus anpassen. Der folgende Code tut dies in reinem Python / Numpy, und wenn der Vektor wirklich "ein paar Nicht-Null-Punkte" hat, stimmt er mit der Geschwindigkeit von scipys C ++ Code überein: Wenn Sie ihn in Cython implementiert haben, sollte der Geschwindigkeitsanstieg spürbar sein:

%Vor%

Eine kurze Erklärung dessen, was vor sich geht: Eine CSC-Matrix ist in drei linearen Arrays definiert:

  • data enthält die Nicht-Null-Einträge, die in der Reihenfolge der Spalten gespeichert sind.
  • indices enthält die Zeilen der Nicht-Null-Einträge.
  • indptr hat einen Eintrag mehr als die Anzahl der Spalten der Matrix, und Elemente in der Spalte j werden in data[indptr[j]:indptr[j+1]] gefunden und sind in Zeilen indices[indptr[j]:indptr[j+1]] .

Um also mit einem dünnen Spaltenvektor zu multiplizieren, können Sie über data und indices des Spaltenvektors iterieren und für jedes (d, r) -Paar die entsprechende Spalte der Matrix extrahieren und mit d multiplizieren , zB data[indptr[r]:indptr[r+1]] * d und indices[indptr[r]:indptr[r+1]] .

    
Jaime 03.09.2013, 19:13
quelle
1

Kürzlich hatte ich das gleiche Problem. Ich habe es so gelöst.

%Vor%

Der Trick hier ist, dass wir eine Version der Matrix als Zeilenrepräsentation und die andere Version als Spaltenrepräsentation erstellen müssen.

    
Vaali 16.10.2016 23:11
quelle