En informática y minería de datos , MinHash (o el esquema de hash sensible a la localidad de permutaciones independientes min-wise ) es una técnica para estimar rápidamente cuán similares son dos conjuntos. El esquema fue publicado por Andrei Broder en una conferencia de 1997, [1] y se utilizó 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 agrupamiento a gran escala , como el agrupamiento de documentos por la similitud de sus conjuntos de palabras. [1]
El coeficiente de similitud de Jaccard es un indicador de uso común 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 de 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 números 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ía la permutación aleatoria).
Ahora, aplicando h min tanto a A como a B , y suponiendo que no hay 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 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 extrae perm 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 para la similitud de Jaccard por sí solo, porque siempre es cero o uno. La idea del esquema MinHash es reducir esta varianza promediando juntas 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 por los k valores de h min ( S ) para estas k funciones.
Para estimar J ( A , B ) utilizando 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 la 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 requerirían 400 hashes para estimar J ( A , B ) con un error esperado menor o igual a 0,05.
Puede resultar computacionalmente costoso calcular múltiples funciones hash, pero una versión relacionada del esquema MinHash evita esta penalización al usar solo una única función hash y la usa para seleccionar múltiples valores de cada conjunto en lugar de seleccionar solo un único valor mínimo por función hash. Sea h una función hash y sea k un 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 usa como una firma para el conjunto S , y la similitud de dos conjuntos cualesquiera se estima comparando sus firmas.
En concreto, 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 una función aleatoria entonces cualquier subconjunto de k elementos tiene la misma probabilidad de ser elegido; 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 llevar 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 de Chernoff estándar para muestreo sin reemplazo, este estimador tiene un error esperado O(1/ √ k ) , que coincide con el rendimiento del esquema de funciones hash múltiples.
El estimador | Y |/ k puede calcularse en 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 puede calcularse en tiempo lineal sobre el tamaño del conjunto, por lo que cuando se necesitan estimar muchas similitudes por pares, este método puede llevar a 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 el tamaño de conjunto n, la variante de muchos hash toma O( n k ) tiempo. La variante de un solo hash es generalmente más rápida, requiriendo O( n ) tiempo para mantener la cola de valores hash mínimos suponiendo que n >> k . [1]
Se han desarrollado diversas técnicas para introducir pesos en el cálculo de MinHashes. La más simple la extiende a pesos enteros. [4] Extendemos nuestra función hash h para que acepte tanto un miembro del conjunto como un entero, luego generamos múltiples hashes para cada elemento, según su peso. Si el elemento i aparece n veces, generamos hashes . Ejecutamos el algoritmo original en este conjunto expandido de hashes. Al hacerlo, obtenemos el índice Jaccard ponderado como la probabilidad de colisión.
Se han desarrollado extensiones adicionales que logran esta probabilidad de colisión en pesos reales con un 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 de CDF . Este método explota las muchas y hermosas propiedades del mínimo de un conjunto de variables exponenciales .
Esto da como probabilidad de colisión el índice de probabilidad de Jaccard [7]
Para implementar el esquema MinHash como se describió 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 debido a que hay n ! permutaciones diferentes, se requerirían Ω( n log n ) bits solo para especificar una permutación verdaderamente aleatoria, un número inviablemente grande incluso para valores moderados de n . Debido a este hecho, por analogía con la teoría del hash universal , ha habido un trabajo significativo para encontrar una familia de permutaciones que sea "min-wise 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 independiente min-wise debe incluir al menos
diferentes permutaciones y, por lo tanto, se necesitan Ω( n ) bits para especificar una única permutación, todavía inviablemente grande. [2]
Debido a la impracticabilidad antes mencionada, 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 con respecto a la independencia completa. [9]
En 1999, Piotr Indyk demostró [10] que cualquier familia de funciones hash independientes en el orden de k es también aproximadamente independiente en el orden de min para valores suficientemente grandes. En particular, existen constantes tales que si , entonces
para todos los conjuntos y . (Nota: aquí significa que la probabilidad es, como máximo, un factor demasiado grande y, como máximo, demasiado pequeña).
Esta garantía es, entre otras cosas, suficiente para dar el límite de Jaccard requerido por el algoritmo MinHash. Es decir, si y son conjuntos, entonces
Dado que las funciones hash independientes k-wise se pueden especificar usando solo bits, este enfoque es mucho más práctico que usar permutaciones completamente independientes min-wise.
Otra familia práctica de funciones hash que brindan una independencia aproximada en términos mínimos es el hash de tabulación .
Las aplicaciones originales de MinHash implicaban la agrupación y eliminación de duplicados casi totales entre documentos web, representados como conjuntos de palabras que aparecían en esos documentos. [1] [2] [11] También se han utilizado técnicas similares para la agrupación y eliminación de duplicados casi totales para otros tipos de datos, como imágenes: en el caso de los datos de imágenes, una imagen puede representarse como un conjunto de subimágenes más pequeñas recortadas de ella, o como conjuntos de descripciones de características de imágenes más complejas. [12]
En minería de datos , Cohen et al. (2001) utilizan MinHash como una 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 base de datos y una columna por atributo), utilizan aproximaciones basadas en MinHash al índice de Jaccard para identificar pares candidatos de atributos que coocurren con frecuencia y luego calculan el valor exacto del índice solo para esos pares para determinar aquellos cuyas frecuencias de coocurrencia están por debajo de un umbral estricto dado. [13]
El algoritmo MinHash ha sido adaptado para 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 datos de secuenciación del genoma completo con 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 subtipificación microbiana. 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 precisos de identidad de nucleótido promedio (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 mapear 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í, sus valores hash probablemente 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 de coseno entre vectores ; el hash sensible a la localidad tiene aplicaciones importantes en algoritmos de búsqueda del vecino más cercano . [18] Para sistemas distribuidos grandes, y en particular MapReduce , existen versiones modificadas de MinHash para ayudar a calcular similitudes sin dependencia de la dimensión del punto. [19]
En 2006, Google realizó una evaluación a gran escala [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 que utilizaba Minhash y LSH para la personalización de Google News . [23]