Я собираюсь попробовать классифицировать kNN в наборе данных, содержащем среди других функций тот, который называется «время суток». В контексте приложения, понедельник 23:58 так же близко к вторнику 00:02, как и пятница 00:04. Это важный момент часовой стрелки на часах. Если бы не одна круговая функция, это означало бы евклидову дистанцию., поставляющий настраиваемую метрику расстояния в kNN (из-за круговой функции)
До сих пор я знаю class::knn()
и caret::knn3()
. Тем не менее, я не вижу способа предоставить свою собственную метрику расстояния для них или даже предварительно рассчитанную матрицу расстояний. Вы знаете способ сделать это?
Возможной альтернативой может стать дополнительный шаг в подготовке данных, а именно: заменить круговую функцию двумя линейными (угол θ становится точкой (cosθ, sinθ)) или реплицировать точки данных в обучающем наборе по сравнению с 00: 00, в результате чего граница исчезает: https://stats.stackexchange.com/questions/51908/nearest-neighbor-algorithm-for-circular-dimensions Однако я бы предпочел избегать как замены одного измерения на два, так и создания копий точек данных, если это вообще возможно.
Другой способ - вычислить матрицу расстояний, а затем реализовать kNN. Это звучит так же, как изобретать колесо.
Еще одна причина, по которой я ищу способ подключить собственную индивидуальную метрику расстояния, - это следующее. В то время как расстояние между вторником 15:01 часов до среды 15:02 часов составляет 1 минута, воскресенье 23:00 UTC (открытие валютного рынка) считается «далеко» от любого другого дня 23:00. Могут появиться и другие особые случаи.
Drey, вы получили это право, несмотря на мое письмо. Благодаря! Пакет FastKNN выглядит многообещающим, попробует. (Заметили, что 'FastKNN :: Distance_for_KNN_test()' вызывает 'pdist :: pdist()', который является евклидовым, но это не имеет значения, пока мне разрешено поставлять готовую матрицу расстояния до 'FastKNN :: k.nearest .neighbors() ') – Xpector