Ho una grande matrice sparsa di utenti e oggetti che gli piacciono (nell'ordine di 1 milione di utenti e 100.000 articoli, con un livello molto basso di scarsità). Sto esplorando i modi in cui potrei eseguire la ricerca kNN su di esso. Date le dimensioni del mio set di dati e alcuni test iniziali che ho eseguito, la mia ipotesi è che il metodo che userò dovrà essere parallelo o distribuito. Quindi sto prendendo in considerazione due classi di possibili soluzioni: una disponibile (o implementabile in modo ragionevolmente semplice) su una singola macchina multicore, l'altra su un cluster Spark, ovvero come programma MapReduce. Ecco tre idee generali che ho considerato:
- Supponendo una metrica di somiglianza del coseno, eseguire la moltiplicazione completa della matrice normalizzata per la sua trasposizione (implementata come somma di prodotti esterni)
- Utilizzo dell'hashing sensibile alla località (LSH)
- Ridurre innanzitutto la dimensionalità del problema con un PCA
Gradirei qualsiasi pensiero o consiglio su possibili altri modi in cui potrei affrontare questo problema.