Sto cercando di costruire un hash sensibile alla località coseno in modo da poter trovare coppie di oggetti simili simili senza dover confrontare ogni possibile coppia. L'ho sostanzialmente funzionante, ma la maggior parte delle coppie nei miei dati sembra avere una somiglianza del coseno nell'intervallo da -0,2 a +0,2, quindi sto cercando di tagliarlo abbastanza finemente e scegliere cose con somiglianza del coseno 0.1 e successive.
Ho letto il capitolo 3 dei set di dati di mining di mining in cui si parla di aumentare l'accuratezza della selezione delle coppie di candidati attraverso l'amplificazione di una famiglia sensibile alla località. Penso di aver quasi capito la spiegazione matematica, ma faccio fatica a vedere come lo pratico praticamente.
Quello che ho finora è il seguente
- Ho detto 1000 film ciascuno con voti da una selezione di utenti 1M. Ogni film è rappresentato da un vettore sparso di punteggi degli utenti (numero di riga = ID utente, valore = punteggio dell'utente)
- Costruisco N vettori casuali. La lunghezza del vettore corrisponde alla lunghezza dei vettori del film (ovvero il numero di utenti). I valori vettoriali sono +1 o -1. In realtà ho codificato questi vettori come binari per risparmiare spazio, con +1 mappato su 1 e -1 mappato su 0
- Costruisco vettori di schizzo per ogni film prendendo il punto prodotto del film e ciascuno degli N vettori casuali (o meglio, se creo una matrice R posizionando gli N vettori casuali in orizzontale e sovrapponendoli uno sopra l'altro quindi lo schizzo per il film m è R * m), quindi prendendo il segno di ogni elemento nel vettore risultante, quindi finisco con un vettore di schizzo per ogni film di + 1s e -1s, che di nuovo codifico come binario. Ogni vettore è lunghezza N bit.
- Quindi cerco schizzi simili procedendo come segue
- Ho diviso il vettore di schizzo in bande b di r bit
- Ogni banda di r bit è un numero. Combino quel numero con il numero di banda e aggiungo il filmato a un bucket hash sotto quel numero. Ogni film può essere aggiunto a più di un bucket.
- Poi guardo in ogni secchio. Tutti i film che si trovano nello stesso bucket sono coppie candidate.
Confrontando questo con 3.6.3 di mmds, il mio passo AND è quando guardo le bande di r bit - una coppia di film passa il passo AND se i bit r hanno lo stesso valore. Il mio passaggio OR avviene nei bucket: i film sono coppie candidate se sono entrambi in uno dei bucket.
Il libro suggerisce che posso "amplificare" i miei risultati aggiungendo più passi AND e OR, ma sono in perdita per come farlo praticamente poiché la spiegazione del processo di costruzione per ulteriori strati è in termini di controllo dell'uguaglianza a coppie piuttosto che venire con i numeri del secchio.
Qualcuno può aiutarmi a capire come farlo?