KNeighborsClassifier изменение расстояния

Я хотел бы изменить расстояние, используемое KNeighborsClassifier, от sklearn. Под расстоянием я подразумеваю тот, который находится в пространстве признаков, чтобы увидеть, кто является соседями точки. В частности, я хочу использовать следующее расстояние:

d(X1,X2) = 0.1 * |X1[0] - X2[0]| + 0.9*|X1[1] - X2[1]|

Спасибо.


person JNYC    schedule 27.06.2018    source источник


Ответы (1)


Просто определите свою пользовательскую метрику следующим образом:

def mydist(X1, X2):
    return 0.1 * abs(X1[0] - X2[0]) + 0.9*abs(X1[1] - X2[1])

Затем инициализируйте свой KNeighboursClassifier, используя параметр metric следующим образом.

clf = KNeighborsClassifier(n_neighbors=3,metric=mydist,)

Вы можете узнать больше о расстояниях, доступных в sklearn, и пользовательских мерах расстояния здесь

Просто убедитесь, что, согласно официальной документации, ваша пользовательская метрика должна соответствовать следующим свойствам.

  1. Неотрицательность: d(x, y) >= 0
  2. Тождество: d(x, y) = 0 тогда и только тогда, когда x == y
  3. Симметрия: d(x, y) = d(y, x)
  4. Неравенство треугольника: d(x, y) + d(y, z) >= d(x, z)

Вот также пример пользовательской метрики.

person Gambit1614    schedule 27.06.2018
comment
Обратите внимание, что это будет работать, но будет значительно медленнее. См. мой ответ здесь, который также относится к вашей проблеме. Возможно, вам придется подумать о разветвлении KNN и построении вашей метрики в Cython, если скорость важна для вас (или реализовать ее полностью самостоятельно, например, используя BallTree от sklearn). - person Marcus V.; 28.06.2018