¿Qué es el algoritmo LSH Forest?

El problema de encontrar k-Nearest Neighbours (también llamado k-NN en resumen) es el siguiente: dado un conjunto [matemático] S [/ matemático] de puntos en un espacio [matemático] M [/ matemático] y un punto de consulta [ matemática] q [/ matemática] ∈ [matemática] M [/ matemática], encuentre los puntos [matemática] K [/ matemática] más cercanos en [matemática] S [/ matemática] a [matemática] q [/ matemática] . Resulta que resolver este problema requiere mucho cálculo y, por lo tanto, es demasiado lento. En la práctica, a menudo estamos de acuerdo con el intercambio de cierta precisión por una gran ganancia de velocidad. Y así, en lugar de resolver el problema exactamente, tratamos de encontrar un conjunto de puntos [matemáticos] K [/ matemáticos] en S que sean aproximadamente [1] los puntos k más cercanos a [matemáticos] q [/ matemáticos].

El hashing sensible a la localidad (LSH en resumen) es una clase de algoritmos para resolver este problema. La idea principal es la siguiente:

  1. Tome [matemáticas] C [/ matemáticas] planos aleatorios [2] en el espacio. Estos planos dividen la región [matemáticas] M [/ matemáticas] en un grupo de subregiones.
  2. Hash cada punto en [matemática] S [/ matemática] a una secuencia binaria de [matemática] 0 [/ matemática] sy [matemática] 1 [/ matemática] de longitud [matemática] C [/ matemática] tal que la [matemática ] El bit i ^ {th} [/ math] en esta secuencia es [math] 0 [/ math] si el punto está en un lado del plano [math] i ^ {th} [/ math] (por ejemplo, el lado con proyección negativa) y [matemática] 1 [/ matemática] si está del otro lado.
  3. Intuitivamente, los puntos que están cerca uno del otro estarían en el mismo lado de muchos de estos planos. Como resultado, sus representaciones binarias serían idénticas en muchos bits.
  4. Realice un preprocesamiento tal que encontrar los puntos con un cierto patrón de bits (por ejemplo, el bit 3 sea 0, el bit 4 sea 1 y el bit 7 también sea 1) se vuelva eficiente.
  5. Cuando entra un punto de consulta [math] q [/ math], divídelo usando el mismo conjunto de planos.
  6. Luego, itere sobre un conjunto de bits que deben ser idénticos entre los valores hash del punto de consulta y los puntos en [math] S [/ math] y recopile todos esos puntos en un gran conjunto de candidatos [math] R [/ math].
  7. Evalúe la distancia exacta entre [matemática] q [/ matemática] y cada punto en [matemática] R [/ matemática] y devuelva los puntos superiores [matemática] K [/ matemática].

Dependiendo de cómo se elija el patrón de bits en el paso 6, esto puede considerarse como la construcción de un árbol de todos los puntos en [matemática] S [/ matemática] tal que:

  • Hay un plano en cada nodo interno del árbol.
  • Los puntos van al subárbol izquierdo o al subárbol derecho dependiendo del lado del avión que los enfrenta
  • Cuando llega un punto de consulta, el conjunto de candidatos consta de todos los puntos que van a la misma hoja (o una cercana) que el punto de consulta.

Si bien esto funciona bien, aún no encontrará todos los puntos más cercanos al punto de consulta. La razón es simple: dependiendo de cómo se eligieron los planos iniciales, algunos puntos podrían estar muy cerca del punto de consulta, pero desafortunadamente irían a hojas algo distantes (por ejemplo, porque no estaban en el mismo lado de algunos hiperplanos).

Para darle a nuestro algoritmo una mejor oportunidad de descubrir más puntos cercanos, podríamos cultivar un bosque de árboles independientes con sus propios planos aleatorios y devolver los puntos superiores [matemáticos] K [/ matemáticos] obtenidos de todos los árboles. Este algoritmo se llama algoritmo LSH-forest.

También puede leer una descripción más detallada pero probablemente más fácil de seguir del algoritmo en la excelente publicación de blog de Erik Bernhardsson: Vecinos más cercanos y modelos vectoriales – parte 2 – algoritmos y estructuras de datos.

[1] Hay maneras de hacer que esta idea de ‘aproximación’ sea más rigurosa, pero eso no es demasiado útil para esta respuesta.

[2] Hay muchas formas diferentes de elegir estos planos y diferentes formas pueden tener diferentes propiedades, por ejemplo, hacer que el árbol sea un árbol binario equilibrado.

More Interesting

¿Qué es el algoritmo de soporte?

1,000 participantes toman un examen que consta de 100 preguntas y 5 opciones por pregunta. ¿Cuál es el mejor enfoque (algoritmo) para encontrar todos los pares posibles de participantes con al menos un 80% de coincidencia en las opciones que eligieron?

¿Cuáles son los mejores algoritmos de agrupamiento para puntos de datos numéricos multidimensionales?

Cómo comprender la recursividad en backtracking de campo profundo y todo relacionado, programación dinámica, etc.

Si llamo k veces getSuccessor () de un nodo con altura h en una búsqueda de árbol binario. ¿Cómo pruebo que el tiempo de ejecución tomará solo O (k + h)?

¿Cómo se calculan los puntos de clasificación para un desafío en CodeEval?

¿Cómo asigno enteros de o a n en una matriz bidimensional en Java?

¿Qué factores principales distinguen las estructuras de datos avanzadas y elementales?

Si una cadena de números contiene todas las demás cadenas de números, ¿eso significa que la cadena también se contiene estrictamente a sí misma?

Como principiante, ¿debería leer el libro CLRS antes de comenzar con Interviewbit?

¿Cómo saben los codificadores cómo codificar e implementar un algoritmo instintivamente?

¿Se introdujo la recursión a propósito?

¿Cuál es la relación entre el análisis probabilístico y el algoritmo aleatorio?

En Codeforces Round # 308 (Div. 2), ¿cómo descubrieron todos la cantidad de dígitos de un número usando un algoritmo eficiente de toma de tiempo? ¿Alguien puede explicarlo?

Dado que solo quedan 2 meses para las regiones regionales de ACM ICPC, ¿cuántos problemas podría resolver allí si comenzara a practicar ahora, teniendo solo la idea más básica sobre algoritmos?