Выбираете eps и minpts для DBSCAN (R)?

Я долго искал ответ на этот вопрос, поэтому надеюсь, что кто-то может мне помочь. Я использую dbscan из библиотеки fpc в R. Например, я просматриваю набор данных USArrests и использую для него dbscan следующим образом:

library(fpc)
ds <- dbscan(USArrests,eps=20)

Выбор eps был в данном случае просто методом проб и ошибок. Однако мне интересно, есть ли функция или код для автоматизации выбора лучших eps / minpts. Я знаю, что в некоторых книгах рекомендуется строить график k-го отсортированного расстояния до ближайшего соседа. То есть ось x представляет «точки, отсортированные по расстоянию до k-го ближайшего соседа», а ось y представляет «расстояние до k-го ближайшего соседа».

Этот тип графика полезен для помощи в выборе подходящего значения для eps и minpts. Надеюсь, я предоставил достаточно информации, чтобы кто-то мог мне помочь. Я хотел опубликовать картинку того, что имел в виду, но я все еще новичок, поэтому пока не могу опубликовать изображение.


person Belinda Chiera    schedule 15.10.2012    source источник


Ответы (6)


Общего способа выбора minPts не существует. Это зависит от того, что вы хотите найти. Низкое значение minPts означает, что он будет создавать больше кластеров из шума, поэтому не выбирайте его слишком маленьким.

Для эпсилон есть разные аспекты. Это снова сводится к выбору того, что работает с этим набором данных и this minPts и this функцией расстояния и this нормализацией. . Вы можете попробовать построить гистограмму расстояния между узлами и выбрать там «колено», но может быть не видно ни одного или нескольких.

OPTICS является преемником DBSCAN, которому не нужен параметр epsilon (за исключением соображений производительности с поддержкой индекса, см. Википедию). Это намного лучше, но я считаю, что реализовать его в R сложно, потому что для этого нужны расширенные структуры данных (в идеале дерево индексов данных для ускорения и обновляемая куча для очереди приоритетов) и R все о матричных операциях.

Наивно, можно представить, что OPTICS выполняет все значения Epsilon одновременно и помещает результаты в кластерную иерархию.

Однако первое, что вам нужно проверить - в значительной степени независимо от того, какой алгоритм кластеризации вы собираетесь использовать - это убедиться, что у вас есть полезная функция расстояния и соответствующая нормализация данных. Если расстояние уменьшается, никакой алгоритм кластеризации работать не будет.

person Has QUIT--Anony-Mousse    schedule 15.10.2012
comment
Я был бы удивлен, если бы реализовать его в R было значительно сложнее, чем на других языках (R - это все о матричных операциях, на самом деле совершенно неверно - data.frame, вероятно, наиболее часто используемая структура данных в R, это не матрица, а список .). Однако по соображениям производительности, когда он будет реализован, скорее всего, он будет в Rcpp. - person Ari B. Friedman; 15.10.2012
comment
Ой, извини. Это был Matlab, где эти вещи, по-видимому, были действительно большой проблемой. Для R некоторая индексация, существующая в пакете rann. Но я считаю, что fpc не использует это, и поскольку R не имеет API запросов к базе данных, он не может автоматически подключать модули. - person Has QUIT--Anony-Mousse; 15.10.2012
comment
В моих экспериментах fpc DBSCAN был в 10 раз медленнее, чем другие реализации. Только Weka была еще хуже (еще в 8 раз медленнее). - person Has QUIT--Anony-Mousse; 15.10.2012
comment
Производительность в R зависит от реализации. Я не отрицаю, что алгоритм может быть сложнее, но на практике общие алгоритмы, подобные этому, как правило, записываются в виде библиотек, а затем доступны (LINPACK, GEOS и т. Д.), Что позволяет избежать дублирования усилий по оптимизации на многих языках. R разработан, чтобы быть разумным для практиков прикладной статистики и расширяемым для программистов. Часть этой расширяемости означает использование других библиотек и языков там, где это полезно. - person Ari B. Friedman; 15.10.2012
comment
Это в значительной степени справедливо для любого языка ... и все же пакеты R кажутся в основном автономными и довольно мало взаимодействуют. Что иногда также хорошо, если вы думаете о беспорядке .jar, который приносят с собой многие проекты Apache ... - person Has QUIT--Anony-Mousse; 15.10.2012
comment
Спасибо Anony-Mousse за понимание и предложения, а также спасибо всем остальным. Я посмотрю, что смогу собрать за то время, которое у меня есть, однако я ценю дополнительные идеи, которые вы предоставили. - person Belinda Chiera; 16.10.2012
comment
Я сам определил дистанцию. И для того типа проблемы, которую я решаю, она отлично работает и дает требуемые результаты. Однако я не знаю, следует ли использовать его для кластеризации, поскольку он обеспечивает асимметричную матрицу расстояний. (с точки зрения проблемы, которую я решаю, это нормально, это расстояние не является рефлексивным), как я могу узнать, ухудшается ли оно. Никакой информации об этом не нашел. - person user974514; 13.05.2013

Один из распространенных и популярных способов управления параметром эпсилон в DBSCAN - это вычисление графика k-расстояния для вашего набора данных. По сути, вы вычисляете k-ближайших соседей (k-NN) для каждой точки данных, чтобы понять, каково распределение плотности ваших данных для разных k. KNN удобен тем, что это непараметрический метод. Выбрав minPTS (который сильно зависит от ваших данных), вы фиксируете k на этом значении. Затем вы используете в качестве эпсилона k-расстояние, соответствующее площади графика k-расстояния (для вашего фиксированного k) с низким наклоном.

person marcorossi    schedule 02.09.2013
comment
Фактически это как раз тот метод, который обсуждался в исходной статье DBCAN. И это то, о чем ОП сказал, что он уже слышал, но хотел бы получить альтернативные предложения. - person Lan; 25.06.2014
comment
Я не понимаю, где он говорит, что не хочет этого. на самом деле, похоже, он говорит обратное. - person marcorossi; 26.06.2014
comment
В пакете R dbscan есть функция kNNdistplot, которая создает этот тип графика. - person Michael Hahsler; 24.07.2015

MinPts

Как объяснил Anony-Mousse, «низкий minPts означает, что он будет создавать больше кластеров из шума, поэтому не выберите его слишком маленьким. '.

minPts лучше всего настраивает эксперт в предметной области, который хорошо разбирается в данных. К сожалению, во многих случаях мы не знаем знания предметной области, особенно после нормализации данных. Один из эвристических подходов - использовать ln (n), где n - это общее количество точек, подлежащих кластеризации.

эпсилон

Определить его можно несколькими способами:

1) график k-расстояний

В кластеризации с minPts = k мы ожидаем, что точки ядра и k-расстояние между граничными точками находятся в пределах определенного диапазона, в то время как точки шума могут иметь гораздо большее k-расстояние, поэтому мы можем наблюдать изгиб точка на графике расстояния k. Однако иногда может не быть очевидного колена или может быть несколько колен, что затрудняет принятие решения

2) расширения DBSCAN, такие как OPTICS.

OPTICS создает иерархические кластеры, мы можем извлекать значительные плоские кластеры из иерархических кластеров путем визуального осмотра, реализация OPTICS доступна в модуле Python pyclustering. Один из первоначальных авторов DBSCAN и OPTICS также предложил автоматический способ извлечения плоских кластеров, при котором не требуется вмешательства человека. Для получения дополнительной информации вы можете прочитать этот документ.

3) анализ чувствительности

В основном мы хотим выбрать радиус, который может кластеризовать более правильные точки (точки, похожие на другие точки), и в то же время обнаруживать больше шума (точки с выбросами). Мы можем нарисовать процент регулярных точек (точки принадлежат кластеру) VS. Анализ epsilon, где мы устанавливаем различные значения epsilon в качестве оси x и соответствующий процент регулярных точек в качестве оси y, и, надеюсь, мы сможем определить сегмент, в котором процентное значение обычных точек больше чувствительны к значению epsilon, и мы выбираем значение epsilon верхней границы в качестве оптимального параметра.

person Shawn TIAN    schedule 01.02.2018
comment
Один из эвристических подходов - использовать ln (n), где n - общее количество точек для кластеризации. У вас есть ссылка на это? - person Mark White; 18.02.2018
comment
@MarkWhite Он используется в разделе 4.1 ST-DBSCAN: An алгоритм кластеризации пространственно-временных данных - person Shawn TIAN; 28.02.2018
comment
В исходной статье DBSCAN предлагается основывать minpts на размерности данных 2 * dim, а не на размере набора данных n. - person Has QUIT--Anony-Mousse; 22.03.2018
comment
Существует также автоматическое извлечение кластеров уже в первой статье по ОПТИКЕ. - person Has QUIT--Anony-Mousse; 26.03.2018
comment
@ Anony-Mousse В исходной статье MinPts устраняется путем установки значения 4 для двумерных данных, но никогда не говорится, что во всех случаях следует использовать 2 * dim. - person Shawn TIAN; 02.04.2018
comment
@ Anony-Mousse Да, есть, но OPTICS создает только иерархические кластеры, по-прежнему сложно автоматически извлекать значимые кластеры из иерархических кластеров. Существует документ на основе OPTICS Автоматическое извлечение кластеров из иерархических представлений кластеризации, в котором обеспечивает автоматическое извлечение кластеров из иерархических кластеров, но производительность вызывает подозрения. - person Shawn TIAN; 02.04.2018
comment
Может быть, 2 * тусклое руководство тогда было в более длинной журнальной версии статьи. - person Has QUIT--Anony-Mousse; 02.04.2018
comment
авторы DBSCAN в своей исходной статье четко отметили, что преимущество алгоритма DBSCAN состоит в том, что он позволяет избежать требований к знанию предметной области. Поэтому я не думаю, что minPts, устанавливаемые экспертами в предметной области, - это хороший способ выразить это - person NAGA; 29.05.2019
comment
@NAGA Я не думаю, что есть что-то неправильное, скажем так, даже знание предметной области не является обязательным для использования DBSCAN, почти всегда полезно устанавливать minPts на основе знания предметной области. В сценарии, когда знания предметной области отсутствуют, мы можем полагаться на некоторые другие эвристические подходы, как описано в исходной статье. - person Shawn TIAN; 11.06.2019

Подробнее о выборе параметров см. Статью ниже на стр. 11:

Шуберт, Э., Сандер, Дж., Эстер, М., Кригель, Х. П., и Сюй, X. (2017). Еще раз о DBSCAN: почему и как вы должны (все еще) использовать DBSCAN. Транзакции ACM в системах баз данных (TODS), 42 (3), 19.

  • Для двумерных данных: используйте значение по умолчанию minPts = 4 (Ester et al., 1996)
  • Для более чем двух измерений: minPts = 2 * dim (Sander et al., 1998)

Как только вы узнаете, какие MinPts выбрать, вы можете определить Epsilon:

  • Постройте k-расстояния с k = minPts (Эстер и др., 1996)
  • Найдите «локоть» на графике -> Значение k-расстояния - это ваше значение Эпсилона.
person Anne-Katrin Link    schedule 09.01.2019

См. Эту веб-страницу, раздел 5: http://www.sthda.com/english/wiki/dbscan-dedensity-based-clustering-for-discovering-clusters-in-large-datasets-with-noise-unsupervised-machine-learning

Он дает подробные инструкции о том, как найти эпсилон. МинПц ... не очень.

person zthomas.nc    schedule 29.11.2016
comment
Я пробовал этот метод, чтобы найти колено, но когда я рисую свои данные при k = 5, это не выглядит так, как будто у него есть колено. Я попытался увеличить значение k (с 5 до даже 1000), но график выглядит точно так же. Кроме того, в документе не говорится, почему колено соответствует оптимальному эпсилону. - person Duy Bui; 21.03.2017
comment
Извините, я хотел прикрепить ссылку на снимок экрана в предыдущем комментарии. Встроенная ссылка - person Duy Bui; 21.03.2017

Если у вас есть ресурсы, вы также можете протестировать несколько значений epsilon и minPts и посмотреть, что работает. Я делаю это с помощью expand.grid и mapply.

# Establish search parameters.
k <- c(25, 50, 100, 200, 500, 1000)
eps <- c(0.001, 0.01, 0.02, 0.05, 0.1, 0.2)

# Perform grid search.
grid <- expand.grid(k = k, eps = eps)

results <- mapply(grid$k, grid$eps, FUN = function(k, eps) {
  cluster <- dbscan(data, minPts = k, eps = eps)$cluster
  sum <- table(cluster)
  cat(c("k =", k, "; eps =", eps, ";", sum, "\n"))
})
person Daniel Freeman    schedule 16.06.2020