Tengo una gran matriz escasa de usuarios y elementos que les gustan (del orden de 1 millón de usuarios y 100 000 elementos, con un nivel muy bajo de escasez). Estoy explorando formas en que podría realizar una búsqueda de kNN en él. Dado el tamaño de mi conjunto de datos y algunas pruebas iniciales que realicé, supongo que el método que usaré deberá ser paralelo o distribuido. Por lo tanto, estoy considerando dos clases de posibles soluciones: una que está disponible (o implementable de una manera razonablemente fácil) en una sola máquina multinúcleo, la otra en un clúster Spark, es decir, como un programa MapReduce. Aquí hay tres ideas generales que consideré:
- Suponiendo una métrica de similitud de coseno, realice la multiplicación completa de la matriz normalizada por su transposición (implementada como una suma de productos externos)
- Uso de hashing sensible a la localidad (LSH)
- Reduciendo primero la dimensionalidad del problema con un PCA
Agradecería cualquier pensamiento o consejo sobre otras posibles formas en que podría abordar este problema.