2015-12-07 20 views
7

È possibile utilizzare qualcosa come la somiglianza 1 - cosine con KNeighborsClassifier di scikit learn?Utilizzo della distanza coseno con scikit learn KNeighborsClassifier

This risposta dice no, ma su documentation per KNeighborsClassifier, si dice che le metriche menzionate in DistanceMetrics sono disponibili. Le metriche di distanza non includono una distanza del coseno esplicita, probabilmente perché non è realmente una distanza, ma presumibilmente è possibile inserire una funzione nella metrica. Ho provato ad inserire lo scikit per imparare il kernel lineare in KNeighborsClassifier, ma mi dà un errore che la funzione ha bisogno di due array come argomenti. Qualcun altro ha provato questo?

+0

È probabile che il classificatore KNN utilizzi alcune ottimizzazioni basate sulla disuguaglianza triangolare. La metrica coseno non obbedisce, quindi non è garantito il corretto comportamento di KNN. –

+2

@ Barmaley.exe la metrica coseno può essere fatta per obbedire alla disuguaglianza triangolare, e lo stesso ordinamento può essere ottenuto senza una implementazione esplicita comunque. Vedi la mia risposta per i dettagli –

risposta

20

La somiglianza del coseno è generalmente definita come x T y/(|| x || * || y ||) e produce 1 se sono uguali e passa a -1 se sono completamente diversi. Questa definizione non è tecnicamente una metrica, e quindi non puoi usare strutture acceleranti come palle e alberi kd con essa. Se imponi a scikit di imparare a usare l'approccio della forza bruta, dovresti essere in grado di usarlo come distanza se passi il tuo oggetto metrico di distanza personalizzato. Ci sono metodi di trasformare la somiglianza del coseno in una distanza valida metrica se si desidera utilizzare gli alberi a sfera (si può trovare uno nella JSAT library) Avviso

però, che x T y/(|| x || * || y ||) = (x/|| x ||) T (y/|| y ||). La distanza euclidea può essere equivalentemente scritta come sqrt (x T x + y T y - 2 x T y). Se normalizziamo ogni datapoint prima di darlo al KNeighborsClassifier, quindi x^T x = 1 per tutti x. Quindi la distanza euclidea diminuirà a sqrt(2 − 2x^T y). Per gli stessi input, otterremmo sqrt(2-2*1) = 0 e per gli opposti completi sqrt(2-2*-1)= 2. Ed è chiaramente una forma semplice, quindi è possibile ottenere lo stesso ordine della distanza del coseno normalizzando i dati e quindi utilizzando la distanza euclidea. Finché si utilizza l'opzione di ponderazione uniform, i risultati saranno identici a quelli che hanno utilizzato una distanza coseno corretta.