Estoy tratando de construir un hash sensible a la localidad coseno para poder encontrar pares de artículos similares candidatos sin tener que comparar cada par posible. Básicamente funciona, pero la mayoría de los pares en mis datos parecen tener una similitud de coseno en el rango de -0.2 a +0.2, así que estoy tratando de cortarlo con precisión y elegir cosas con una similitud de coseno 0.1 y superior.
He estado leyendo el capítulo 3. Conjuntos de datos masivos de minería. Habla de aumentar la precisión de la selección de pares de candidatos amplificando una familia sensible a la localidad. Creo que casi entiendo la explicación matemática, pero me cuesta ver cómo implemento esto prácticamente.
Lo que tengo hasta ahora es el siguiente
- Tengo 1000 películas cada una con calificaciones de una selección de 1 millón de usuarios. Cada película está representada por un vector escaso de puntajes de usuario (número de fila = ID de usuario, valor = puntaje de usuario)
- Construyo N vectores aleatorios. La longitud del vector coincide con la longitud de los vectores de la película (es decir, el número de usuarios). Los valores del vector son +1 o -1. En realidad, codifico estos vectores como binarios para ahorrar espacio, con +1 asignado a 1 y -1 asignado a 0
- Construyo vectores de croquis para cada película tomando el producto escalar de la película y cada uno de los N vectores aleatorios (o mejor dicho, si creo una matriz R colocando los N vectores aleatorios horizontalmente y superponiéndolos uno encima del otro, entonces el croquis para la película m es R * m), luego tomo el signo de cada elemento en el vector resultante, así que termino con un vector de boceto para cada película de + 1s y -1s, que nuevamente codifico como binario. Cada vector tiene una longitud de N bits.
- Luego busco bocetos similares haciendo lo siguiente
- Dividí el vector de croquis en b bandas de r bits
- Cada banda de r bits es un número. Combino ese número con el número de banda y agrego la película a un cubo de hash debajo de ese número. Cada película se puede agregar a más de un cubo.
- Luego miro en cada cubo. Cualquier película que esté en el mismo grupo son pares de candidatos.
Comparando esto con 3.6.3 de mmds, mi paso AND es cuando miro bandas de r bits: un par de películas pasan el paso AND si los bits r tienen el mismo valor. Mi paso OR ocurre en los grupos: las películas son pares de candidatos si ambos están en alguno de los grupos.
El libro sugiere que puedo "amplificar" mis resultados agregando más pasos AND y OR, pero no sé cómo hacerlo prácticamente, ya que la explicación del proceso de construcción para capas adicionales es en términos de verificar la igualdad por pares en lugar de proponiendo números de cubo.
¿Alguien puede ayudarme a entender cómo hacer esto?
fuente