Ist es möglich, so etwas wie 1 - Kosinusähnlichkeit mit dem KNeighborsClassifier von scikit learn zu verwenden?
This Antwort sagt nein, aber auf der Dokumentation für KNeighborsClassifier heißt es Metriken, die in DistanceMetrics.html erwähnt werden, sind verfügbar. Entfernungsmetriken enthalten keine explizite Kosinusentfernung, wahrscheinlich weil es sich nicht wirklich um eine Entfernung handelt, aber es ist möglich, eine Funktion in die Metrik einzugeben. Ich habe versucht, den linearen Kernel scikit learn in KNeighborsClassifier einzugeben, aber es gibt mir einen Fehler, dass die Funktion zwei Arrays als Argumente benötigt. Hat das noch jemand ausprobiert?
Die Kosinusähnlichkeit ist allgemein definiert als x T y / (|| x || * || y ||) und gibt 1 aus, wenn sie gleich sind, und geht auf -1, wenn sie gleich sind sind ganz anders. Diese Definition ist technisch gesehen keine Metrik und somit können Sie keine beschleunigenden Strukturen wie Ball- und Kd-Bäume verwenden. Wenn Sie erzwingen, scikit lernen, die Brute-Force-Ansatz zu verwenden, sollten Sie in der Lage sein, es als eine Entfernung zu verwenden, wenn Sie Ihr eigenes benutzerdefiniertes Abstandsmetrikobjekt übergeben. Es gibt Methoden, die Cosinus-Ähnlichkeit in eine gültige Distanzmetrik zu transformieren, wenn Sie Ballbäume verwenden möchten (Sie finden einen in der JSAT-Bibliothek )
Beachten Sie jedoch, dass x T y / (|| x || * || y ||) = (x / || x ||) T ( y / || y ||). Der euklidische Abstand kann äquivalent geschrieben werden als sqrt (x T x + y T y - 2 x T y). Wenn wir jeden Datenpunkt normalisieren, bevor wir ihn dem KNeighborsClassifier geben, dann x^T x = 1
für alle x
. Der euklidische Abstand wird also auf sqrt(2 − 2x^T y)
reduziert. Für vollständig die gleichen Eingaben würden wir sqrt(2-2*1) = 0
und für vollständige Gegensätze sqrt(2-2*-1)= 2
erhalten. Und es ist eindeutig eine einfache Form, so dass Sie die gleiche Reihenfolge wie die Kosinus-Entfernung erhalten können, indem Sie Ihre Daten normalisieren und dann die euklidische Distanz verwenden. Solange Sie die Option uniform
wholesales verwenden, sind die Ergebnisse identisch mit der Verwendung einer korrekten Cosinus-Distanz.
Tags und Links python machine-learning scikit-learn knn