DBSCAN

Введение в DBSCAN

Основанная на плотности Пространственная Кластеризация Приложений с Шумом (DBSCAN) идентифицирует кластеры произвольной формы и шум (выбросы) в данных. Функция Statistics and Machine Learning Toolbox™ dbscan выполняет кластеризацию на матрице входных данных или на попарных расстояниях между наблюдениями. dbscan возвращает кластерные индексы и вектор, указывающий на наблюдения, которые являются базовыми точками (точки в кластерах). В отличие от k - означает кластеризироваться, алгоритм DBSCAN не требует предварительных знаний количества кластеров, и кластеры являются не обязательно сфероидальными. DBSCAN также полезен для основанного на плотности определения выбросов, потому что это идентифицирует точки, которые не принадлежат никакому кластеру.

Для точки, которая будет присвоена кластеру, условие должно удовлетворить, что его окружение эпсилона (epsilon) содержит, по крайней мере, минимальное количество соседей (minpts). Или, точка может лечь в окружении эпсилона другой точки, которая удовлетворяет условия minpts и epsilon. Алгоритм DBSCAN идентифицирует три вида точек:

  • Базовая точка — точка в кластере, который имеет, по крайней мере, соседей minpts в его окружении эпсилона

  • Пограничная точка — точка в кластере, который имеет меньше, чем соседи minpts в его окружении эпсилона

  • Шумовая точка — выброс, который не принадлежит никакому кластеру

DBSCAN работает с широким спектром метрик расстояния, и можно задать пользовательскую метрику расстояния для конкретного приложения. Выбор метрики расстояния определяет форму окружения.

Описание алгоритма

Для заданных значений окружения эпсилона epsilon и минимальное количество соседей minpts, требуемый для базовой точки, функция dbscan реализует DBSCAN можно следующим образом:

  1. От входных данных устанавливает X, выбирают первое немаркированное наблюдение x1 как текущая точка и инициализируют первую кластерную метку C к 1.

  2. Найдите набор точек в окружении эпсилона epsilon текущей точки. Эти точки являются соседями.

    1. Если количество соседей является меньше, чем minpts, то маркируйте текущую точку как шумовую точку (или выброс). Перейдите к шагу 4.

      Примечание

      dbscan может повторно присвоить шумовые точки кластерам, если шум указывает, позже удовлетворяют ограничения, установленные epsilon и minpts от некоторой другой точки в X. Этот процесс переприсвоения точек происходит для пограничных точек кластера.

    2. В противном случае маркируйте текущую точку как базовую точку, принадлежащую, чтобы кластеризировать C.

  3. Выполните итерации по каждому соседу (новая текущая точка) и повторный шаг 2, пока никакие новые соседи не найдены, что это может быть маркировано как принадлежащий текущему кластерному C.

  4. Выберите следующую немаркированную точку в X как текущая точка и увеличьте кластерное количество на 1.

  5. Повторите шаги 2-4, пока все точки в X не будут маркированы.

Определите значения для параметров DBSCAN

Этот пример показывает, как выбрать значения для epsilon и параметров minpts dbscan. Набор данных является последовательностью сканирований Лазерного дальномера, каждый сохраненный как 3-D облако точек.

Загрузите, предварительно обработайте и визуализируйте набор данных.

Загрузите последовательность облак точек. Выберите последнюю метку времени в последовательности и извлеките x, y, z координаты объектов, окружающих автомобиль.

d = load('01_city_c2s_fcw_10s_Lidar.mat'); 
pcloud = d.LidarPointCloud; 
X = pcloud(end).ptCloud.Location;

Чтобы подсветить среду вокруг автомобиля, установите видимую область охватывать 20 метров налево и право на автомобиль, 20 метров впереди и заднюю часть автомобиля и область выше поверхности дороги.

xBound  = 20; % in meters
yBound  = 20; % in meters
zLowerBound = 0; % in meters

Обрежьте облако точек, чтобы содержать только точки в заданной области.

indices = X(:,1) <= xBound & X(:,1) >= -xBound ...
    & X(:,2) <= yBound & X(:,2) >= -yBound ...
    & X(:,3) > zLowerBound;
X = X(indices,:); 

Визуализируйте данные как 2D график рассеивания. Аннотируйте график подсветить автомобиль.

scatter(X(:,1),X(:,2),'.');
annotation('ellipse',[0.48 0.48 .1 .1],'Color','red')

Центр облака точек (кружился в красном) содержит крышу и капот автомобиля. Все другие точки являются препятствиями.

Выберите значение для minpts.

Чтобы выбрать значение для minpts, считайте значение больше, чем или равный одному плюс количество размерностей входных данных [1]. Например, для n-by-p матричный X, устанавливает значение 'minpts', больше, чем или равный p+1.

Для набора определенных данных задайте значение minpts, больше, чем или равный 4, в частности значение 50.

minpts = 50; % Minimum number of neighbors for a core point

Выберите значение для epsilon.

Одна стратегия оценки значения для epsilon состоит в том, чтобы сгенерировать график k-расстояния для входных данных X. Для каждой точки в X найдите расстояние до kth самой близкой точки и постройте отсортированные точки против этого расстояния. График содержит колено. Расстояние, которое соответствует колену, обычно является хорошим выбором для epsilon, потому что это - область, где точки начинают затихать в выброс (шум) территория [1].

Прежде, чем построить график k-расстояния, сначала найдите minpts наименьшими попарными расстояниями для наблюдений в X в порядке возрастания.

kD = pdist2(X,X,'euc','Smallest',minpts); % The minpts smallest pairwise distances

Постройте график k-расстояния.

plot(sort(kD(end,:)));
title('k-distance graph')
xlabel('Points sorted with 50th nearest distances')
ylabel('50th nearest distances')
grid

Колено, кажется, приблизительно 2; поэтому, установите значение epsilon к 2.

epsilon = 2;

Кластер с помощью dbscan.

Используйте dbscan со значениями minpts и epsilon, которые были определены на предыдущих шагах.

labels = dbscan(X,epsilon,minpts);

Визуализируйте кластеризацию и аннотируйте фигуру, чтобы подсветить определенные кластеры.

gscatter(X(:,1),X(:,2),labels);
title('epsilon = 2 and minpts = 50')
grid
annotation('ellipse',[0.54 0.41 .07 .07],'Color','red')
annotation('ellipse',[0.53 0.85 .07 .07],'Color','blue')
annotation('ellipse',[0.39 0.85 .07 .07],'Color','black')

dbscan идентифицирует 11 кластеров и набор шумовых точек. Алгоритм также идентифицирует автомобиль в центре облака точек как отличный кластер.

dbscan идентифицирует некоторые отличные кластеры, такие как кластер, окруженный в черном цвете (и сосредоточенный (приблизительно-6,18)) и кластер, окруженный в синем (и сосредоточенный (приблизительно 2.5,18)). Функция также присваивает группу точек, окруженных в красном (и сосредоточенный вокруг (3,–4)) к тому же кластеру (группа 7) как группа точек в юго-восточном квадранте графика. Ожидание состоит в том, что эти группы должны быть в отдельных кластерах.

Используйте меньшее значение для epsilon, чтобы разделить большие кластеры и дальнейший раздел облако точек.

epsilon2 = 1;
labels2 = dbscan(X,epsilon2,minpts);

Визуализируйте кластеризацию и аннотируйте фигуру, чтобы подсветить определенные кластеры.

gscatter(X(:,1),X(:,2),labels2);
title('epsilon = 1 and minpts = 50')
grid
annotation('ellipse',[0.54 0.41 .07 .07],'Color','red')
annotation('ellipse',[0.53 0.85 .07 .07],'Color','blue')
annotation('ellipse',[0.39 0.85 .07 .07],'Color','black')

При помощи меньшего значения эпсилона dbscan может присвоить группу точек, окруженных в красном к отличному кластеру (группа 13). Однако некоторые кластеры, что dbscan, правильно идентифицированный прежде, теперь разделен между точками накопления и выбросами. Например, смотрите, кластерная группа 2 (кружился в черном цвете), и кластерная группа 3 (кружился в синем). Правильное значение epsilon где-нибудь между 1 и 2.

Используйте значение epsilon 1.55, чтобы кластеризировать данные.

epsilon3 = 1.55;
labels3 = dbscan(X,epsilon3,minpts);

Визуализируйте кластеризацию и аннотируйте фигуру, чтобы подсветить определенные кластеры.

gscatter(X(:,1),X(:,2),labels3);
title('epsilon = 1.55 and minpts = 50')
grid
annotation('ellipse',[0.54 0.41 .07 .07],'Color','red')
annotation('ellipse',[0.53 0.85 .07 .07],'Color','blue')
annotation('ellipse',[0.39 0.85 .07 .07],'Color','black')

dbscan делает лучшее задание идентификации кластеров, когда epsilon установлен в 1.55. Например, функция идентифицирует отличные кластеры, окруженные в красном, черном цвете цвете, и синий (с центрами вокруг (3,–4), (–6,18), и (2.5,18), соответственно).

Ссылки

[1] Сложный эфир, M., H.-P. Kriegel, Дж. Сандер и Кс. Ксиэауэи. “Основанный на плотности алгоритм для обнаружения кластеров в больших пространственных базах данных с шумом”. В Продолжениях Второй Международной конференции по вопросам Открытия Знаний в Базах данных и Анализа данных, 226-231. Портленд, OR: Нажатие AAAI, 1996.

Похожие темы