Вопрос или проблема
Что происходит с данными в нижнем цикле 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)
Объяснение работы цикла
-
Итерация по уникальным меткам и цветам:
- Цикл перебирает уникальные метки кластеров и соответствующие цвета для визуализации.
- Переменная
k
представляет текущую метку кластера, аcol
— цвет, который будет использоваться для визуализации данного кластера.
-
Определение меток шумовых точек:
- Если метка равна
-1
, это указывает на шумовые точки в наборе данных. Эти точки визуализируются черным цветом, что позволяет легко их идентифицировать среди кластеров.
- Если метка равна
-
Создание маски для членов класса:
class_member_mask = (labels == k)
создает маску, которая определяет, принадлежит ли точка текущему кластеруk
. Эта маска будет использоваться для выборки данных, относящихся к этому кластеру.
-
Визуализация "ядровых" и "периферийных" точек:
- Программа разделяет точки на "ядровые" (те, которые являются частью кластера и имеют достаточную плотность, чтобы быть установлены в
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. Это превращает цикл в ключевой элемент не только для анализа, но и для успешных приложений в реальном времени, таких как обработка изображений, анализ социальных сетей и в других областях, где управление большими объемами данных становится необходимостью.