2016-08-10 2 views
0

Я собираюсь попробовать классифицировать 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. Могут появиться и другие особые случаи.

ответ

0

Afaik knn работает немного иначе. Это метод, основанный на экземпляре, что означает, что фактическая модель состоит из экземпляров. Для каждого набора тестовых образцов матрица расстояний вычисляется заново в терминах вычисления матрицы расстояния nxn < - это вы где?

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

Однако, если у вас есть nxn матрица расстояний, то посмотрите на следующий подобный вопрос Find K nearest neighbors, starting from a distance matrix

Но документация явно говорит:

Использование

k.nearest.neighbors (я , distance_matrix, k = 5)

Аргументы

i является числовым классом и является строкой от distance_matrix.

distance_matrix - это матрица nxn.

k относится к числовому классу и представляет количество соседних элементов, возвращаемых функцией.

Это имхо похоже на:

apply(dm, 1, function(d) "majority vote for labels[order(d) < k]") 

Учитывая у вас есть nxn расстояния матрицу вы уже изобретать новое 80% knn

+0

Drey, вы получили это право, несмотря на мое письмо. Благодаря! Пакет FastKNN выглядит многообещающим, попробует. (Заметили, что 'FastKNN :: Distance_for_KNN_test()' вызывает 'pdist :: pdist()', который является евклидовым, но это не имеет значения, пока мне разрешено поставлять готовую матрицу расстояния до 'FastKNN :: k.nearest .neighbors() ') – Xpector

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