Использование косинусного расстояния с помощью 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, вы можете переключаться между различными метриками расстояния, которые вы хотите использовать в модели ближайшего соседа. Список доступных метрик расстояния можно найти здесь