Sono una persona visiva. Ecco cosa funziona per me come intuizione.
Di 'che ognuna delle cose che vuoi cercare approssimativamente sono oggetti fisici come una mela, un cubo, una sedia.
La mia intuizione per un LSH è che è simile a prendere le ombre di questi oggetti. Come se prendessi l'ombra di un cubo 3D ottieni un quadrato 2D come su un pezzo di carta, o una sfera 3D ti darà un'ombra simile a un cerchio su un pezzo di carta.
Alla fine, ci sono molte più di tre dimensioni in un problema di ricerca (in cui ogni parola in un testo potrebbe essere una dimensione) ma l' analogia dell'ombra è ancora molto utile per me.
Ora possiamo confrontare in modo efficiente stringhe di bit nel software. Una stringa di bit di lunghezza fissa è più o meno, come una linea in una singola dimensione.
Quindi, con un LSH, proietto le ombre degli oggetti alla fine come punti (0 o 1) su una singola linea fissa / stringa di bit.
Il trucco è prendere le ombre in modo che abbiano ancora un senso nella dimensione inferiore, ad esempio assomigliano all'oggetto originale in un modo abbastanza buono che possa essere riconosciuto.
Un disegno 2D di un cubo in prospettiva mi dice che questo è un cubo. Ma non riesco a distinguere facilmente un quadrato 2D dall'ombra di un cubo 3D senza prospettiva: entrambi mi sembrano un quadrato.
Il modo in cui presento il mio oggetto alla luce determinerà se ottengo una buona ombra riconoscibile o meno. Quindi penso a un "buon" LSH come quello che trasformerà i miei oggetti davanti a una luce in modo tale che la loro ombra sia meglio riconoscibile come rappresentante del mio oggetto.
Quindi, per ricapitolare: penso alle cose da indicizzare con un LSH come oggetti fisici come un cubo, un tavolo o una sedia, e proietto le loro ombre in 2D e infine lungo una linea (una stringa di bit). E una "buona" funzione "LSH" è il modo in cui presento i miei oggetti davanti a una luce per ottenere una forma approssimativamente distinguibile nella pianura 2D e successivamente nella mia stringa di bit.
Alla fine, quando voglio cercare se un oggetto che ho è simile ad alcuni oggetti che ho indicizzato, prendo le ombre di questo oggetto "query" usando lo stesso modo per presentare il mio oggetto davanti alla luce (alla fine finendo con un po ' anche stringa). E ora posso confrontare quanto è simile quella stringa di bit con tutte le mie altre stringhe di bit indicizzate che è un proxy per la ricerca di tutti i miei oggetti se trovassi un modo valido e riconoscibile per presentare i miei oggetti alla mia luce.