Я собираюсь попробовать классификацию kNN на наборе данных, содержащем, среди прочего, функцию, называемую «время суток». В контексте приложения понедельник 23:58 так же близок к вторнику 00:02, как и пятница 00:04. Важен угол наклона часовой стрелки к циферблату. Если бы не эта одна круглая функция, евклидово расстояние было бы достаточно.
Пока мне известны 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 любого другого дня. Могут появиться и другие частные случаи.