Purtroppo, non sono nemmeno sicuro delle parole chiave da utilizzare per questa domanda, quindi se è già stato chiesto per favore indicami la strada giusta.
Dato un set di vettori:
[3, 5, 3]
[10, 23, 5]
[123, 53, 97]
(qui, 'vettore' significa un insieme dimensionale di valori numerici).
Mi piacerebbe conoscere un modo per trovare la corrispondenza più simile a qualsiasi vettore di input. Ad esempio,
[2, 4, 5]
Restituirebbe il primo dalla mia lista come la corrispondenza più vicina. Mi piacerebbe anche conoscere la distanza della partita.
Un modo per visualizzarlo è come un grafico a linee.
Non voglio la ricerca lineare. Potrei avere milioni di vettori. Non mi interessa eseguire il tempo di pre-elaborazione; è il tempo di ricerca che voglio ottimizzare.
Definizione della "corrispondenza più vicina"
In questo caso, supponiamo che i dati siano numerici e che la "corrispondenza più vicina" sia un semplice confronto numerico, fornendo una distanza assoluta. Ad esempio, confrontando [2, 4, 5]
potresti fornire le distanze dei dati di test di:
[1, 1, 2]
[8, 19, 0]
[121, 49, 92]
Diversi vettori di dimensioni
Come si gestiscono i vettori di diverse dimensioni? Mi piacerebbe essere in grado di gestire casi come il seguente input:
[120, 99]
Corrispondenza del terzo esempio dai dati del test, in alcuni sensi con "punteggio inferiore". Questo perché i due valori sono simili al primo e all'ultimo valore nei dati del test, ignorando il valore medio e in ordine.
Un altro modo per descriverlo potrebbe essere: l'ordine dei valori nel vettore è importante, ma non la posizione.
Soluzioni di clustering
Ho preso in considerazione una qualche forma di clustering: l'hashing dei vettori in bucket, quindi l'hashing dell'input e il restituzione di tutti i vettori nel bucket corrispondente. Ma ciò che mi disturba è che cosa succede se un dato input è vicino al "limite" di un cluster - non sarebbero restituiti altri valori nei cluster adiacenti, vero?
Dominio applicazione
Voglio utilizzare questo algoritmo per trovare versioni musicali simili per le loro lunghezze di brani costitutive. In quanto tale, le lunghezze possono essere memorizzate come un numero intero in qualche unità di tempo (secondi o millisecondi, ad esempio) e i dati finiscono per apparire come sopra.
Così simile all'algoritmo CDDB (FreeDB), ma più clemenza e la capacità di definire ed esplorare la distanza. E supporto per diversi vettori di lunghezza.
Altre domande che ho esaminato
Come trovare il vettore più vicino a un dato vettore? sembra discutere di punti 2D - mentre questo potrebbe essere considerato in uno spazio 2D, i valori in ogni vettore devono essere considerati insieme.