предоставление пользовательской метрики расстояния для kNN (из-за круговой функции)

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


person Xpector    schedule 10.08.2016    source источник


Ответы (1)


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

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

Однако, если у вас есть матрица расстояний nxn, возьмите посмотрите на следующий аналогичный вопрос Найдите K ближайших соседей, начиная с матрица расстояний

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

Применение

k.ближайших.соседей(i, 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

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