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.