2014-10-12 12 views
7

Angesichts einer MatrixFactorizationModel, was wäre der effizienteste Weg, um die vollständige Matrix der Benutzer-Produkt-Vorhersagen (in der Praxis, durch einen bestimmten Schwellenwert gefiltert, um Sparsity zu erhalten) zurückgeben?Wie bewertet man alle Benutzer-Produkt-Kombinationen im Spark MatrixFactorizationModel?

Über die aktuelle API könnte einmal ein kartesisches Produkt von Benutzer-Produkt an die Vorhersage-Funktion übergeben werden, aber es scheint mir, dass dies eine Menge zusätzlicher Verarbeitung tun wird.

Würde der Zugriff auf die privaten userFeatures, productFeatures der richtige Ansatz sein, und wenn ja, gibt es eine gute Möglichkeit, andere Aspekte des Frameworks zu nutzen, um diese Berechnung effizient zu verteilen? Gibt es einen einfachen Weg, besser zu tun, als alle Paare von userFeature, productFeature "von Hand" zu multiplizieren?

Antwort

5

Spark 1.1 verfügt über eine recommendProducts-Methode, die jeder Benutzer-ID zugeordnet werden kann. Dies ist besser als nichts, aber nicht wirklich für die Empfehlung an alle Benutzer optimiert.

Ich würde überprüfen, dass Sie wirklich wollen, Empfehlungen für alle zu machen; im Maßstab ist dies inhärent eine große langsame Operation. Berücksichtigen Sie die Vorhersage für Benutzer, die erst kürzlich aktiv waren.

Ansonsten ist Ihre beste Wette, Ihre eigene Methode zu erstellen. Der kartesische Join der Feature-RDDs ist wahrscheinlich zu langsam, da so viele Kopien der Feature-Vektoren gemischt werden. Wählen Sie den größeren Benutzer/Produkt-Featuresatz und ordnen Sie diesen zu. Halten Sie in jedem Worker den anderen Produkt/Benutzer-Feature-Satz in Arbeitsspeicher in jedem Worker. Wenn dies nicht möglich ist, können Sie dies komplexer machen und mehrere Teilmengen der kleineren RDD im Speicher zuordnen.

+0

Ja, es ist eine große Operation, weshalb es die Mühe wert schien weiter zu optimieren, um zu versuchen. Danke für die Vorschläge! – cohoz