Ich habe eine große, spärliche Matrix von Benutzern und Elementen, die sie mögen (in der Größenordnung von 1 Million Benutzern und 100.000 Elementen mit einem sehr geringen Grad an Sparsamkeit). Ich suche nach Möglichkeiten, wie ich eine kNN-Suche durchführen kann. Angesichts der Größe meines Datensatzes und einiger von mir durchgeführter Ersttests gehe ich davon aus, dass die von mir verwendete Methode entweder parallel oder verteilt sein muss. Daher denke ich über zwei Klassen möglicher Lösungen nach: eine, die entweder auf einem einzelnen Multicore-Computer verfügbar ist (oder auf relativ einfache Weise implementiert werden kann), die andere in einem Spark-Cluster, dh als MapReduce-Programm. Hier sind drei allgemeine Ideen, die ich in Betracht gezogen habe:
- Unter der Annahme einer Cosinus-Ähnlichkeitsmetrik führen Sie die vollständige Multiplikation der normalisierten Matrix mit ihrer Transponierung durch (implementiert als Summe der äußeren Produkte).
- Lokalitätsabhängiges Hashing (LSH) verwenden
- Reduzieren Sie zuerst die Dimensionalität des Problems mit einem PCA
Ich würde mich über Gedanken oder Ratschläge über mögliche andere Möglichkeiten freuen, wie ich dieses Problem angehen könnte.
Antworten:
Ich hoffe, dass Sie mit den folgenden Ressourcen weitere Ideen zur Lösung des Problems erhalten:
1) Forschungsarbeit "Effiziente K-Nearest Neighbor Join-Algorithmen für hochdimensionale, spärliche Daten" : http://arxiv.org/abs/1011.2807
2) Projektarbeit "Empfehlungssystem basierend auf kollaborativer Filterung" (Stanford University): http://cs229.stanford.edu/proj2008/Wen-RecommendationSystemBasedOnCollaborativeFiltering.pdf
3) Projekt für den Netflix-Preiswettbewerb ( k-NN- basiert) : http://cs.carleton.edu/cs_comps/0910/netflixprize/final_results/knn/index.html
4) Forschungsarbeit "Hubs in Space: Beliebte Nachbarn in hochdimensionalen Daten" über den Fluch des Dimensionalitätsphänomens und seine Beziehung zum maschinellen Lernen im Allgemeinen und zum k-NN-Algorithmus im Besonderen: http://jmlr.org /papers/volume11/radovanovic10a/radovanovic10a.pdf
5) Software für die spärliche k-NN-Klassifizierung (kostenlos, scheint jedoch nicht Open Source zu sein - kann mit den Autoren geklärt werden): http://www.autonlab.org/autonweb/10408.html
6) Mehrere Diskussionsthreads zu StackOverflow :
Python
, bezieht sich diese auf dasR
Ökosystem)7) Achten Sie auf GraphLab , ein Open-Source- Parallelframework für maschinelles Lernen ( http://select.cs.cmu.edu/code/graphlab ), das paralleles Clustering über das folgende
MapReduce
Modell unterstützt: http: //select.cs.cmu. edu / code / graphlab / clustering.htmlSie können meine Antwort hier auf Data Science StackExchange auch auf sparsame Regression überprüfen, um Links zu relevanten
R
Paketen undCRAN Task View
Seiten zu erhalten: /datascience//a/918/2452 .quelle
Wenn Sie an der kollaborativen Filterung arbeiten, sollten Sie das Problem als eine Matrixnäherung mit niedrigem Rang darstellen, bei der beide Benutzer Elemente sind, die in denselben Raum mit niedriger Dimension eingebettet sind. Die Ähnlichkeitssuche wird dann viel einfacher. Ich empfehle die Verwendung von LSH, wie Sie vorgeschlagen haben. Eine weitere fruchtbare Möglichkeit zur Reduzierung der Dimensionalität, die noch nicht erwähnt wurde, ist die Zufallsprojektion .
quelle
Sie sollten verwenden: PySparNN , eine kürzliche Implementierung von Facebook in Python, die blutig schnell ist. Es ist auch einfach zu bedienen.
quelle