Использование косинусного расстояния с помощью scikit learn KNeighborsClassifier
можно ли использовать что - то вроде 1-косинусного сходства с KNeighborsClassifier scikit learn?
этой ответ говорит нет, но на документация для KNeighborsClassifier, он говорит, метрики, упомянутые в DistanceMetrics доступны. Метрики расстояния не включают явное косинусное расстояние, вероятно, потому, что это не расстояние, но предположительно можно ввести функцию в Метрику. Я попытался ввод линейного ядра scikit learn в KNeighborsClassifier, но это дает мне ошибку, что функции нужны два массива в качестве аргументов. Кто-нибудь еще пробовал?
2 ответов
косинусное сходство обычно определяется как xT y |(||x| | * || y|/), и выходы 1, если они одинаковы и переходит в -1, если они полностью разные. Это определение технически не является метрикой, и поэтому вы не можете использовать ускоряющие структуры, такие как деревья ball и kd. Если вы заставите scikit научиться использовать подход грубой силы,вы сможете использовать его как расстояние, если передадите ему свой собственный объект метрики расстояния. Существуют методы преобразования косинусное сходство в допустимую метрику расстояния, если вы хотите использовать шаровые деревья (вы можете найти его в библиотека JSAT)
обратите внимание, что xT y / (||x|| * ||y||) = (x/||x||)T (y|| / y//). Евклидово расстояние может быть эквивалентно записано как sqrt(xTx + yTy-2 xTy). Если мы нормализуем каждую точку данных, прежде чем передать ее в KNeighborsClassifier, то x^T x = 1
для всех x
. Так евклидово расстояние уменьшится до sqrt(2 − 2x^T y)
. Для полностью тех же входных данных мы получим sqrt(2-2*1) = 0
и для полных противоположностей sqrt(2-2*-1)= 2
. И это явно простая форма, поэтому вы можете получить тот же порядок, что и косинусное расстояние, нормализуя свои данные, а затем используя евклидово расстояние. Пока вы используете uniform
вариант Весов, результаты будут идентичны использованию правильного косинусного расстояния.
конструкторы семейного класса KNN имеют параметр metric
, вы можете переключаться между различными метриками расстояния, которые вы хотите использовать в модели ближайшего соседа.
Список доступных метрик расстояния можно найти здесь