Объяснение цикла for в демонстрации алгоритма DBSCAN

Вопрос или проблема

Что происходит с данными в нижнем цикле for в следующем коде алгоритма DBSCAN и почему?

# Генерация выборочных данных 
import numpy as np
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4,
                            random_state=0)
X = StandardScaler().fit_transform(X)

# Вычисление DBSCAN
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_

# Количество кластеров в метках, игнорируя шум, если он присутствует.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)

# Построение результата
import matplotlib.pyplot as plt

# Черный цвет удален и используется для шума вместо этого.
unique_labels = set(labels)
colors = [plt.cm.Spectral(each)
          for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
    if k == -1:
        # Черный используется для шума.
        col = [0, 0, 0, 1]

    class_member_mask = (labels == k)

    xy = X[class_member_mask & core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor="k", markersize=14)

    xy = X[class_member_mask & ~core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor="k", markersize=6)

plt.title('Оценочное количество кластеров: %d' % n_clusters_)
plt.show()

Сначала я собираюсь использовать более простой способ (дает тот же график, просто без изменения размера точек в зависимости от их расстояния до основных образцов) визуализации результатов кластеризации:

plt.scatter(X[:,0], X[:,1], c = db.labels_, cmap = "RdGy", alpha = .5)
plt.title(f"DBSCAN для {len(np.unique(db.labels_)) - 1} кластеров")
plt.colorbar();

Отображает:

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

В этом случае на моем рисунке красные точки помечены как аномалии, поскольку они не находятся в плотных областях.

Эти точки помечены как аномалии, поскольку в радиусе .3 (eps / евклидово расстояние) от них нет 10 точек (min_samples)

Эти параметры безусловно являются самыми важными для этого алгоритма и должны быть выбраны осторожно.

Из документации Scikit-learn:

Хотя параметр min_samples в первую очередь контролирует, насколько толерантен алгоритм к шуму (в условиях шумных и больших наборов данных может быть целесообразно увеличить этот параметр), параметр eps имеет решающее значение для правильного выбора для набора данных и функции расстояния и обычно не может быть оставлен на значении по умолчанию. Он контролирует локальное окружение точек. При слишком малом выборе большинство данных не будет кластеризовано вообще (и помечено как -1 для “шума”). При слишком большом выборе это приводит к слиянию близких кластеров в один кластер и, в конечном итоге, к тому, что весь набор данных возвращается как один кластер. Некоторые эвристики для выбора этого параметра обсуждались в литературе, например, на основе “колена” на графике расстояний до ближайших соседей (как обсуждается в приведенных ниже ссылках).

Ответ или решение

Функция DBSCAN (Density-Based Spatial Clustering of Applications with Noise) — это алгоритм кластеризации, который ищет плотные группы данных и помечает менее плотные области как шум. Ниже мы подробнее рассмотрим цикл for, используемый в предложенном коде, а также его роль в процессе визуализации результатов кластеризации.

Структура цикла for в коде

Цикл for в выделенной части кода выполняет итерации по уникальным меткам кластеров, полученным в результате работы алгоритма DBSCAN. Он имеет следующий вид:

for k, col in zip(unique_labels, colors):
    if k == -1:
        # Черный используется для шумовых точек.
        col = [0, 0, 0, 1]

    class_member_mask = (labels == k)

    xy = X[class_member_mask & core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor="k", markersize=14)

    xy = X[class_member_mask & ~core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor="k", markersize=6)

Объяснение работы цикла

  1. Итерация по уникальным меткам и цветам:

    • Цикл перебирает уникальные метки кластеров и соответствующие цвета для визуализации.
    • Переменная k представляет текущую метку кластера, а col — цвет, который будет использоваться для визуализации данного кластера.
  2. Определение меток шумовых точек:

    • Если метка равна -1, это указывает на шумовые точки в наборе данных. Эти точки визуализируются черным цветом, что позволяет легко их идентифицировать среди кластеров.
  3. Создание маски для членов класса:

    • class_member_mask = (labels == k) создает маску, которая определяет, принадлежит ли точка текущему кластеру k. Эта маска будет использоваться для выборки данных, относящихся к этому кластеру.
  4. Визуализация "ядровых" и "периферийных" точек:

    • Программа разделяет точки на "ядровые" (те, которые являются частью кластера и имеют достаточную плотность, чтобы быть установлены в core_samples_mask) и "периферийные" (те, которые находятся рядом с ядровыми, но не имеют достаточной плотности).
    • Ядровые точки (xy = X[class_member_mask & core_samples_mask]) отображаются с большим размером (14), чтобы подчеркнуть их значимость в кластере.
    • Периферийные точки (xy = X[class_member_mask & ~core_samples_mask]) отображаются меньшим размером (6), что указывает на их второстепенное значение в k-кластере.

Заключение

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

Процесс кластеризации и его визуализация являются важными аспектами анализа данных. При должном выборе параметров, таких как eps и min_samples, можно значительно улучшить результаты DBSCAN. Это превращает цикл в ключевой элемент не только для анализа, но и для успешных приложений в реальном времени, таких как обработка изображений, анализ социальных сетей и в других областях, где управление большими объемами данных становится необходимостью.

Оцените материал
Добавить комментарий

Капча загружается...