2014-02-10 5 views
5

Мне нужно применить Nearest Neighbors in Python, и я ищу объявления scikit-learn и библиотеки scipy, которые требуют данных в качестве входных данных, затем будут вычислять расстояния и применять алгоритм.Ближайшие соседи по Python с заданной матрицей расстояний

В моем случае мне пришлось вычислять нестандартное расстояние, поэтому я хотел бы знать, есть ли способ напрямую передать матрицу расстояний.

ответ

5

Вы хотите создать DistanceMetric объект, снабжая свою собственную функцию в качестве аргумента:

metric = sklearn.neighbors.DistanceMetric.get_metric('pyfunc', func=func) 

Из документов:

Здесь func это функция, которая принимает два одномерными numpy массивов, и возвращает расстояние. Обратите внимание, что для того, чтобы использовать в BallTree, расстояние должно быть истинная метрика: т.е. она должна удовлетворять следующие свойства

  • Неотрицательность: д (х, у)> = 0
  • идентичность: d (x, y) = 0 тогда и только тогда, когда x == y
  • Симметрия: d (x, y) = d (y, x)
  • Треугольник Неравенство: d (x, y) + d (y , г)> = d (х, г)

Вы можете создать классификатор с metric=metric как аргумент ключевого слова, и он будет использовать это при расчете расстояний.

6

Как указано фордом, и согласно документации http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier вы должны преобразовать свое пользовательское расстояние в объект DistanceMetric и передать его в качестве параметра метрики.

+0

Я не думаю, что это правда. Документ говорит: '[callable]: определяемая пользователем функция, которая принимает массив расстояний и возвращает массив той же формы, содержащий весовые коэффициенты.« – ford

+0

Да, вы правы. Я отредактировал ответ. –

0

Хочет добавить ответ Форда, что вы должны сделать, как этот

метрического = DistanceMetric.get_metric («pyfunc», Func =/ваше имя функции /)

Вы не можете просто поставить свою собственную функцию как второй аргумент, вы должны назвать аргумент как «func»

+0

Хорошая добыча! Я отредактировал свой ответ, чтобы включить ключевое слово перед аргументом. – ford

Смежные вопросы