Кластеризация по дате (по расстоянию) в Ruby



У меня есть огромный журнал с действиями, выполняемыми пользователями (например, модерирование контента).
Я хотел бы найти "массовые" действия, то есть действия, которые слишком плотны (пользователь, вероятно, сделал эти действия, не думая об этом слишком много :) ).



Это привело бы к кластеризации действий по дате (в линейном пространстве) и к маркировке слишком плотных кластеров.



Я не эксперт в алгоритмах и методах кластеризации, но я думаю, что K-означает кластеризацию это не поможет, так как я не знаю количества кластеров.
Кроме того, в идеале, я также хотел бы "тонко настроить" алгоритм.

Что бы вы посоветовали?



P.S. Вот некоторые ресурсы, которые я нашел (в Ruby):





  • hierclust - простая иерархическая библиотека кластеризации пространственных данных


  • AI4R - библиотека, реализующая некоторые алгоритмы кластеризации

781   2  

2 ответов:

Взгляните на кластеризацию на основе плотности. Например, DBSCAN и оптика.

Это звучит именно так, как вы хотите.

K-means, вероятно, будет хорошо работать, если вы заинтересованы ваприорном известном количестве кластеров. Поскольку вы этого не делаете, вы можете прочитать об алгоритме LBG, который основан на k-средних и используется при сжатии данных для векторной квантовки. Это в основном итерационный k-means, который расщепляет центроиды после того, как они сходятся, и продолжает расщеплять, пока вы не достигнете приемлемого количества кластеров.

С другой стороны, поскольку ваши данные одномерны, вы могли бы сделать что-то совершенно другое.

Предположим, что у вас есть действия, которые произошли в 5 точках времени: (8, 11, 15, 16, 17). Построим гауссово для каждого из этих действий с μ, равным времени и σ = 3.

Введите описание изображения здесь

Теперь давайте посмотрим, как выглядит сумма значений этих гауссиан.

Введите описание изображения здесь

Он показывает плотность действий с пиком около 16.

Основываясь на этом наблюдении, я предлагаю следующее простое алгоритм.

  1. создайте вектор нулей для интересующего временного диапазона.
  2. для каждого действия вычислите Гаусса и добавьте его к вектору.
  3. сканируйте вектор, ища значения, которые больше максимального значения в векторе, умноженного на α.
Заметим, что для каждого действия требуется обновить только небольшой участок вектора, так как значения Гаусса очень быстро сходятся к нулю.

Вы можете настроить алгоритм, настроив значения из

  1. α ∈ [0,1], что указывает на то, насколько существенным должен быть отмечен пик активности,
  2. σ, что влияет на расстояние действий, которые считаются близкими друг к другу, и
  3. периоды времени на элемент вектора (минуты, секунды и т. д.).

Обратите внимание, что алгоритм является линейным с точки зрения количества действий. Кроме того, это не должно быть трудно распараллелить: разделить ваши данные по нескольким процессам суммирования Гауссианов, а затем суммировать сгенерированные векторы.

Comments

    Ничего не найдено.