En informática y minería de datos , MinHash (o el esquema de hash sensible a la localidad de permutaciones independientes mínimas ) es una técnica para estimar rápidamente qué tan similares son dos conjuntos. El esquema fue inventado por Andrei Broder (1997), [1] y utilizado inicialmente en el motor de búsqueda AltaVista para detectar páginas web duplicadas y eliminarlas de los resultados de búsqueda. [2] También se ha aplicado en problemas de agrupación a gran escala , como la agrupación de documentos por la similitud de sus conjuntos de palabras. [1]
El coeficiente de similitud de Jaccard es un indicador comúnmente utilizado de la similitud entre dos conjuntos. Sea U un conjunto y A y B subconjuntos de U , entonces el índice de Jaccard se define como la relación entre el número de elementos de su intersección y el número de elementos de su unión :
Este valor es 0 cuando los dos conjuntos son disjuntos , 1 cuando son iguales y estrictamente entre 0 y 1 en caso contrario. Dos conjuntos son más similares (es decir, tienen relativamente más miembros en común) cuando su índice Jaccard está más cerca de 1. El objetivo de MinHash es estimar J ( A , B ) rápidamente, sin calcular explícitamente la intersección y la unión.
Sea h una función hash que asigna los miembros de U a enteros distintos, sea perm una permutación aleatoria de los elementos del conjunto U , y para cualquier subconjunto S de U defina h min ( S ) como el miembro mínimo de S con respecto a h ∘ perm —es decir, el miembro x de S con el valor mínimo de h ( perm ( x )) . (En los casos en los que se supone que la función hash utilizada tiene propiedades pseudoaleatorias, no se utilizará la permutación aleatoria).
Ahora, aplicando h min tanto a A como a B , y suponiendo que no haya colisiones hash, vemos que los valores son iguales ( h min ( A ) = h min ( B ) ) si y solo si entre todos los elementos de , el elemento con el El valor hash mínimo se encuentra en la intersección . La probabilidad de que esto sea cierto es exactamente el índice de Jaccard, por lo tanto:
Es decir, la probabilidad de que h min ( A ) = h min ( B ) sea verdadera es igual a la similitud J ( A , B ) , suponiendo que se obtenga permanente de una distribución uniforme. En otras palabras, si r es la variable aleatoria que es uno cuando h min ( A ) = h min ( B ) y cero en caso contrario, entonces r es un estimador insesgado de J ( A , B ) . r tiene una varianza demasiado alta para ser un estimador útil de la similitud de Jaccard por sí solo, porque siempre es cero o uno. La idea del esquema MinHash es reducir esta varianza promediando varias variables construidas de la misma manera.
La versión más simple del esquema minhash utiliza k funciones hash diferentes, donde k es un parámetro entero fijo y representa cada conjunto S mediante los k valores de h min ( S ) para estas k funciones.
Para estimar J ( A , B ) usando esta versión del esquema, sea y el número de funciones hash para las cuales h min ( A ) = h min ( B ) y use y / k como estimación. Esta estimación es el promedio de k diferentes variables aleatorias 0-1, cada una de las cuales es uno cuando h min ( A ) = h min ( B ) y cero en caso contrario, y cada una de las cuales es un estimador insesgado de J ( A , B ) . Por lo tanto, su promedio también es un estimador insesgado y, por desviación estándar, para sumas de 0-1 variables aleatorias, su error esperado es O(1/ √ k ) . [3]
Por lo tanto, para cualquier constante ε > 0 existe una constante k = O(1/ε 2 ) tal que el error esperado de la estimación es como máximo ε . Por ejemplo, se necesitarían 400 hashes para estimar J ( A , B ) con un error esperado menor o igual a 0,05.
Puede ser computacionalmente costoso calcular múltiples funciones hash, pero una versión relacionada del esquema MinHash evita esta penalización al usar solo una función hash y la usa para seleccionar múltiples valores de cada conjunto en lugar de seleccionar solo un valor mínimo por función hash. Sea h una función hash y sea k un número entero fijo. Si S es cualquier conjunto de k o más valores en el dominio de h , defina h ( k ) ( S ) como el subconjunto de los k miembros de S que tienen los valores más pequeños de h . Este subconjunto h ( k ) ( S ) se utiliza como firma para el conjunto S , y la similitud de dos conjuntos cualesquiera se estima comparando sus firmas.
Específicamente, sean A y B dos conjuntos cualesquiera. Entonces X = h ( k ) ( h ( k ) ( A ) ∪ h ( k ) ( B )) = h ( k ) ( A ∪ B ) es un conjunto de k elementos de A ∪ B , y si h es un función aleatoria, entonces es igualmente probable que se elija cualquier subconjunto de k elementos; es decir, X es una muestra aleatoria simple de A ∪ B . El subconjunto Y = X ∩ h ( k ) ( A ) ∩ h ( k ) ( B ) es el conjunto de miembros de X que pertenecen a la intersección A ∩ B . Por lo tanto, | Y |/ k es un estimador insesgado de J ( A , B ) . La diferencia entre este estimador y el estimador producido por múltiples funciones hash es que X siempre tiene exactamente k miembros, mientras que las múltiples funciones hash pueden conducir a un número menor de elementos muestreados debido a la posibilidad de que dos funciones hash diferentes puedan tener los mismos mínimos. . Sin embargo, cuando k es pequeño en relación con los tamaños de los conjuntos, esta diferencia es insignificante.
Según los límites estándar de Chernoff para el muestreo sin reemplazo, este estimador ha esperado un error O(1/ √ k ) , igualando el rendimiento del esquema de función hash múltiple.
El estimador | Y |/ k se puede calcular en el tiempo O( k ) a partir de las dos firmas de los conjuntos dados, en cualquier variante del esquema. Por lo tanto, cuando ε y k son constantes, el tiempo para calcular la similitud estimada a partir de las firmas también es constante. La firma de cada conjunto se puede calcular en tiempo lineal en el tamaño del conjunto, por lo que cuando es necesario estimar muchas similitudes por pares, este método puede generar un ahorro sustancial en el tiempo de ejecución en comparación con hacer una comparación completa de los miembros de cada conjunto. . Específicamente, para un tamaño de conjunto n, la variante de muchos hash requiere O( n k ) tiempo. La variante de hash único es generalmente más rápida y requiere O( n ) tiempo para mantener la cola de valores de hash mínimos suponiendo n >> k . [1]
Se han desarrollado una variedad de técnicas para introducir pesos en el cálculo de MinHashes. El más simple lo extiende a pesos enteros. [4] Amplíe nuestra función hash h para aceptar tanto un miembro del conjunto como un número entero, luego genere múltiples hashes para cada elemento, según su peso. Si el elemento i aparece n veces, genera hashes . Ejecute el algoritmo original en este conjunto ampliado de hashes. Al hacerlo, se obtiene el índice Jaccard ponderado como probabilidad de colisión.
Se han desarrollado más extensiones que logran esta probabilidad de colisión en pesos reales con mejor tiempo de ejecución, una para datos densos [5] y otra para datos dispersos. [6]
Otra familia de extensiones utiliza hashes distribuidos exponencialmente. Un hash uniformemente aleatorio entre 0 y 1 se puede convertir para que siga una distribución exponencial mediante inversión CDF . Este método explota las hermosas propiedades del mínimo de un conjunto de variables exponenciales .
Esto produce como probabilidad de colisión el índice de probabilidad de Jaccard [7]
Para implementar el esquema MinHash como se describe anteriormente, se necesita la función hash h para definir una permutación aleatoria en n elementos, donde n es el número total de elementos distintos en la unión de todos los conjuntos a comparar. ¡Pero porque hay n ! diferentes permutaciones, se requerirían Ω( n log n ) bits solo para especificar una permutación verdaderamente aleatoria, un número inviable incluso para valores moderados de n . Debido a este hecho, por analogía con la teoría del hash universal , se ha realizado un trabajo significativo para encontrar una familia de permutaciones que sea "min-independiente", lo que significa que para cualquier subconjunto del dominio, cualquier elemento tiene la misma probabilidad de ser el mínimo. Se ha establecido que una familia de permutaciones independientes mínimas debe incluir al menos
diferentes permutaciones y, por lo tanto, necesita Ω ( n ) bits para especificar una única permutación, aún inviablemente grande. [2]
Debido a la impracticabilidad anterior, se han introducido dos nociones variantes de independencia mínima: familias de permutaciones independientes mínimas restringidas y familias independientes mínimas aproximadas. La independencia mínima restringida es la propiedad de independencia mínima restringida a ciertos conjuntos de cardinalidad como máximo k . [8] La independencia mínima aproximada tiene como máximo una probabilidad fija ε de variar desde la independencia total. [9]
En 1999, Piotr Indyk demostró [10] que cualquier familia de funciones hash independientes en k también es aproximadamente independiente en min cuando es lo suficientemente grande. En particular, existen constantes tales que si , entonces
para todos los conjuntos y . (Tenga en cuenta que aquí significa que la probabilidad es, como máximo, un factor demasiado grande y, como máximo, demasiado pequeño).
Esta garantía es suficiente, entre otras cosas, para proporcionar el límite Jaccard requerido por el algoritmo MinHash. Es decir, si y son conjuntos, entonces
Dado que las funciones hash independientes de k se pueden especificar usando solo bits, este enfoque es mucho más práctico que usar permutaciones completamente independientes de min.
Otra familia práctica de funciones hash que brindan independencia mínima aproximada es el hash de tabulación .
Las aplicaciones originales de MinHash implicaban agrupar y eliminar casi duplicados entre documentos web, representados como conjuntos de palabras que aparecen en esos documentos. [1] [2] [11] También se han utilizado técnicas similares para agrupar y eliminar casi duplicados para otros tipos de datos, como imágenes: en el caso de datos de imágenes, una imagen se puede representar como un conjunto de subimágenes más pequeñas. recortadas de él, o como conjuntos de descripciones de características de imagen más complejas. [12]
En minería de datos , Cohen et al. (2001) utilizan MinHash como herramienta para el aprendizaje de reglas de asociación . Dada una base de datos en la que cada entrada tiene múltiples atributos (vista como una matriz 0-1 con una fila por entrada de la base de datos y una columna por atributo), utilizan aproximaciones basadas en MinHash al índice Jaccard para identificar pares candidatos de atributos que frecuentemente coinciden. ocurren, y luego calcular el valor exacto del índice solo para aquellos pares para determinar aquellos cuyas frecuencias de co-ocurrencia están por debajo de un umbral estricto determinado. [13]
El algoritmo MinHash se ha adaptado a la bioinformática, donde el problema de comparar secuencias genómicas tiene un fundamento teórico similar al de comparar documentos en la web. Las herramientas basadas en MinHash [14] [15] permiten una comparación rápida de los datos de secuenciación del genoma completo con los genomas de referencia (alrededor de 3 minutos para comparar un genoma con los 90000 genomas de referencia en RefSeq ), y son adecuadas para la especiación y tal vez un grado limitado de microbios. subtipificación. También existen aplicaciones para la metagenómica [14] y el uso de algoritmos derivados de MinHash para la alineación y el ensamblaje del genoma. [16] Se pueden generar valores promedio precisos de identidad de nucleótidos (ANI) de manera muy eficiente con algoritmos basados en MinHash. [17]
El esquema MinHash puede verse como un ejemplo de hash sensible a la localidad , una colección de técnicas para usar funciones hash para asignar grandes conjuntos de objetos a valores hash más pequeños de tal manera que, cuando dos objetos tienen una pequeña distancia entre sí , es probable que sus valores hash sean los mismos. En este caso, la firma de un conjunto puede verse como su valor hash. Existen otras técnicas de hash sensibles a la localidad para la distancia de Hamming entre conjuntos y la distancia del coseno entre vectores ; El hash sensible a la localidad tiene aplicaciones importantes en los algoritmos de búsqueda de vecinos más cercanos . [18] Para grandes sistemas distribuidos, y en particular MapReduce , existen versiones modificadas de MinHash para ayudar a calcular similitudes sin dependencia de la dimensión del punto. [19]
Google realizó una evaluación a gran escala en 2006 [20] para comparar el rendimiento de los algoritmos Minhash y SimHash [21] . En 2007, Google informó que utilizaba Simhash para la detección de duplicados en el rastreo web [22] y utilizaba Minhash y LSH para la personalización de Google News . [23]