Die nächsten Nachbarn suchen nach sehr hochdimensionalen Daten


17

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.


1
Ich habe gerade diesen Bereich untersucht und einen Blogeintrag über das geschrieben, was ich gefunden habe. Ich habe ein LSH verwendet, aber ich denke, mein Sparsity-Level war höher als Sie suchen. tttv-engineering.tumblr.com/post/109569205836/…
Philip Pearl

Antworten:


15

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 :

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 MapReduceModell unterstützt: http: //select.cs.cmu. edu / code / graphlab / clustering.html

Sie können meine Antwort hier auf Data Science StackExchange auch auf sparsame Regression überprüfen, um Links zu relevanten RPaketen und CRAN Task ViewSeiten zu erhalten: /datascience//a/918/2452 .


4

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 .


1

Sie sollten verwenden: PySparNN , eine kürzliche Implementierung von Facebook in Python, die blutig schnell ist. Es ist auch einfach zu bedienen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.