Использование косинусного расстояния с помощью scikit learn KNeighborsClassifier

Можно ли использовать что-то вроде сходства с 1 косинусом с KNeighborsClassifier scikit learn?

Этот ответ говорит «нет», но в документации для KNeighborsClassifier говорится, что показатели, упомянутые в « DistanceMetrics» , доступны. Дистанционные метрики не включают явное расстояние косинуса, вероятно, потому, что это не действительно расстояние, но, возможно, можно ввести функцию в метрику. Я попытался ввести scikit, изучая линейное ядро ​​в KNeighborsClassifier, но это дает мне ошибку, что функции нужны два массива в качестве аргументов. Кто-нибудь еще пробовал это?

Сходство косинусов обычно определяется как x T y / (|| x || * || y ||) и выводит 1, если они одинаковы и равны -1, если они совершенно разные. Это определение технически не является метрикой, поэтому вы не можете использовать с ним ускоряющие структуры, такие как шары и деревья kd. Если вы заставляете scikit учиться использовать подход грубой силы, вы должны иметь возможность использовать его как расстояние, если вы передадите ему свой собственный объект метрики расстояния. Существуют методы преобразования подобия косинуса в допустимую метрику расстояния, если вы хотите использовать шары (вы можете найти их в библиотеке JSAT )

Заметим, однако, что x T y / (|| x || * || y ||) = (x / || x ||) T (y / || y ||). Евклидово расстояние можно условно записать как sqrt (x T x + y T y – 2 x T y). Если мы нормализуем каждое datapoint, прежде чем передать его KNeighborsClassifier, тогда x^T x = 1 для всех x . Таким образом, эвклидовое расстояние будет деградировать до sqrt(2 − 2x^T y) . Для всех одинаковых входных данных мы получим sqrt(2-2*1) = 0 и для полных противоположностей sqrt(2-2*-1)= 2 . И это, очевидно, простая форма, поэтому вы можете получить тот же порядок, что и косинус-расстояние, нормализуя свои данные, а затем используя эвклидовое расстояние. Пока вы используете вариант с uniform весами, результаты будут идентичны, если использовать правильное расстояние для косинуса.