Los vecinos más cercanos buscan datos dimensionales muy altos

17

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.

cjauvin
fuente
1
Acabo de investigar esta área y escribí una publicación de blog sobre lo que encontré. Utilicé un LSH, pero creo que mi nivel de dispersión fue más alto de lo que estabas buscando. tttv-engineering.tumblr.com/post/109569205836/…
Philip Pearl

Respuestas:

15

Espero que los siguientes recursos puedan brindarle ideas adicionales para resolver el problema:

1) Documento de investigación "Algoritmos de unión de vecinos más cercanos eficientes K para datos dispersos de alta dimensión" : http://arxiv.org/abs/1011.2807

2) Documento de proyecto de clase "Sistema de recomendación basado en filtrado colaborativo" (Universidad de Stanford): http://cs229.stanford.edu/proj2008/Wen-RecommendationSystemBasedOnCollaborativeFiltering.pdf

3) Proyecto para el concurso de premios de Netflix ( basado en k-NN ) : http://cs.carleton.edu/cs_comps/0910/netflixprize/final_results/knn/index.html

4) Trabajo de investigación "Hubs in Space: Vecinos más cercanos populares en datos de alta dimensión" sobre la maldición del fenómeno de dimensionalidad y su relación con el aprendizaje automático , en general, y el algoritmo k-NN , en particular: http://jmlr.org /papers/volume11/radovanovic10a/radovanovic10a.pdf

5) Software para la escasa clasificación de k-NN (gratuito, pero no parece ser de código abierto; podría aclarar con los autores): http://www.autonlab.org/autonweb/10408.html

6) Varios hilos de discusión en StackOverflow :

7) Preste atención a GraphLab , un marco paralelo de código abierto para el aprendizaje automático ( http://select.cs.cmu.edu/code/graphlab ), que admite la agrupación en paralelo a través del MapReducemodelo: http: //select.cs.cmu. edu / code / graphlab / clustering.html

También puede consultar mi respuesta aquí en Data Science StackExchange sobre regresión dispersa para enlaces a Rpaquetes y CRAN Task Viewpáginas relevantes : /datascience//a/918/2452 .

Aleksandr Blekh
fuente
4

Si está trabajando en el filtrado colaborativo, debe plantear el problema como una aproximación matricial de bajo rango, en la que ambos usuarios son elementos integrados en el mismo espacio de baja dimensionalidad. La búsqueda de similitud será mucho más simple entonces. Recomiendo usar LSH, como sugirió. Otra vía fructífera para la reducción de la dimensionalidad aún no mencionada es la proyección aleatoria .

Emre
fuente
1

Deberías usar: PySparNN , una implementación reciente de Facebook en Python que es muy rápida. También es fácil de usar.

Syzygyyy
fuente