Объяснение алгоритмов частичной кластеризации и кластеризации на основе плотности

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

Возможно, если вы столкнетесь с набором данных без помеченной целевой переменной, есть способ получить некоторое представление о нем, не пытаясь пометить его. Может быть, нет четкой целевой переменной, которую можно было бы предсказать, есть ли еще способ использовать данные? Это мир «обучения без учителя».

Алгоритм пытается найти основную структуру данных с помощью различных подходов, которые можно разделить на три подкатегории:

  1. Кластеризация на основе разделов: K-среднее, K-медиана

2. Иерархическая кластеризация: агломеративная, разделяющая.

3. Кластеризация на основе плотности: DBSCAN

Кластеризация K-средних:

Алгоритмы кластеризации на основе разделов, такие как k-среднее, используются для классификации точек данных на основе аналогичных функций в K (положительное число) кластеров, так что точки данных с разными характеристиками принадлежат другим кластерам.

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

Методологический подход к кластеризации K-средних:

  1. Выполните MinMaxScaling, применяя алгоритм K-средних.
    Нанесите набор данных на график (EDA - Исследовательский анализ данных)
    Выберите K, т. Е. Оптимальное количество кластеров.
  2. Инициализируйте центроиды (среднее арифметическое всех точек данных, принадлежащих этому кластеру) и выберите случайные K точек данных.
    Примечание. K-means пробует начальные центроиды симметрично.
  3. Назначьте точки данных кластеру так, чтобы сумма квадратов расстояния между точками данных и центроидом кластера была минимальной.
  4. Вычислите и поместите новый центроид в каждый кластер.
  5. Сходимость: проверьте евклидово / манхэттенское расстояние, чтобы переназначить наименьшую сумму квадратов ошибок в кластере.

Метод локтя:

Метод локтя дает нам представление о том, какое оптимальное K, то есть количество кластеров, будет основано на сумме квадратов расстояния (SSE) между точками данных и их центроидами назначенных кластеров. Мы выбираем K в том месте, где SSE начинает выравниваться и образовывать изгиб, т.е. медленные изменения в сумме квадратов ошибок в кластере.

Минимизация суммы квадратов ошибок в кластере: прогноз точности

Реализация Scikit- learn:



Начнем с создания образца набора данных с помощью модуля наборов данных scikit-learn. Мы создадим набор данных с двумя функциями со стандартным отклонением 0,5 для каждого кластера. Количество выборок - 150, и мы также выбираем три точки в качестве центроидов.

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
X , y = make_blobs(n_samples=150,n_features=2,centers=3,cluster_std=.5,
                   shuffle=True,random_state=0)

Постройте набор данных.

plt.scatter(X[:,0],X[:,1],marker='o',s=50)
plt.grid()
plt.show()

Мы устанавливаем n_init = 10 для запуска алгоритма кластеризации k-средних 10 раз независимо с разными случайными центроидами, чтобы выбрать окончательную модель как модель с наименьшим SSE. Параметр max_iter указывает максимальное количество итераций для каждого отдельного прогона.

from sklearn.cluster import KMeans
km = KMeans(n_clusters=3,n_init=10,max_iter=300)
km.fit(X)
pred=km.predict(X)
pred

Сумма квадратов ошибок в кластере:

km.inertia_

Постройте кластер и центроиды.

km.cluster_centers_
plt.scatter(X[:,0],X[:,1],c=pred,cmap='winter')
centers = km.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200)
plt.show()

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

WSSE = []
for i in range(1,11):
    km = KMeans(n_clusters=i,random_state=0)
    km.fit(X)
    WSSE.append(km.inertia_)
plt.plot(range(1,11),WSSE,marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('with-in cluster sum of square error')
plt.show()
import pandas as pd
pd.DataFrame(WSSE,index=range(1,11))

Кластеризация DBSCAN:

Кластеризация K-средних полезна для кластеров сферической формы. Однако когда дело доходит до кластеров произвольной формы или обнаружения выбросов и обнаружения аномалий, методы, основанные на плотности, более эффективны. В пространственной кластеризации приложений на основе плотности (DBSCAN) нет необходимости знать количество кластеров, в отличие от алгоритма K-средних. DBSCAN находит все плотные области нанесенных на график точек выборки и обрабатывает эти области как кластеры, устойчивые к шуму, точки, которые находятся далеко от ядра кластера.

DBSCAN имеет два ключевых параметра:

  1. eps: расстояние, определяющее окрестности. Две точки считаются соседними, если расстояние между ними меньше или равно eps. В общем, eps следует выбирать как можно меньше (eps ≤ 4).

2. min_points: минимальное количество точек данных для определения кластера.

Типы точек:

  1. Основная точка: точка данных, в которой количество точек выборки в пределах радиуса окрестности (eps) ≥ min_points.
  2. Граничная точка: точки данных, которые находятся в окрестности основных точек.
  3. Точки шума: точки данных далеко от кластеров и основных точек.

Методологический подход к кластеризации DBSCAN:

  1. Постройте точки данных. Выберите случайным образом неназначенную точку и вычислите ее окрестности, чтобы определить, является ли она базовой точкой или нет. В противном случае точка помечается как шум.
  2. Найдите базовую точку, чтобы сформировать временный кластер, если количество точек в радиусе точки выборки ≥ min_points.
    Проверьте точки данных в окрестности во временном кластере.
  3. Все точки в прямой плотности центральной точки образуют временный кластер. Все точки данных в прямой плотности соседей основной точки также будут добавлены во временный кластер.
  4. Объедините временные кластеры, чтобы получить окончательные кластеры.
    Для каждого временного кластера проверьте, является ли точка данных в нем центральной точкой. Если да, то объедините временные кластеры, чтобы сформировать новый кластер.
    Точка, помеченная как шум, может быть повторно посещена и станет частью кластера в качестве граничной точки.
  5. Повторяйте шаг 4 до тех пор, пока каждая точка в текущем кластере не окажется либо в списке основных точек, либо не будет соседствовать с базовой точкой, т. Е. Все точки будут посещены.

Метод с коленом:

Цель состоит в том, чтобы найти среднее расстояние для каждой точки до ее ближайших соседей и выбрать расстояние, на котором происходит резкое изменение. Значение K устанавливается равным min_points. По умолчанию K = 4 = min_points.

Реализация Scikit- learn:



Начнем с создания образца набора данных с помощью модуля наборов данных scikit-learn. После создания образцов данных мы нормализуем значения с помощью класса StandardScaler из модуля предварительной обработки scikit-learn. Мы создадим и построим набор данных с количеством выборок, равным 400, со стандартным отклонением 0,6 для каждого кластера.

import numpy as np
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
X, y = make_blobs(n_samples=400,cluster_std=0.6,random_state=0)
plt.scatter(X[:,0],X[:,1],c=y,cmap='cool')
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

Теперь мы можем создать объект DBSCAN, подогнать данные и визуализировать кластеры.

dbscan = DBSCAN(eps = 0.3,metric="euclidean",min_samples = 10)
clusters = dbscan.fit_predict(X_scaled)
plt.scatter(X[:, 0], X[:, 1], c=dbscan.labels_, cmap="plasma")
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.title('eps={},min samples={}'.format(dbscan.eps,dbscan.min_samples))
print("Adjusted Rand Index: %0.3f"% metrics.adjusted_rand_score(y, dbscan.labels_))

Параметр eps (применение коленного метода):

plt.figure(figsize=(12,8))
for i,k in enumerate([.15,.3,.5,1.5],start=1):
    plt.subplot(2,2,i)
    db = DBSCAN(eps = k,metric="euclidean",min_samples = 10)
    db.fit(X_scaled)
    
    plt.scatter(X[:, 0], X[:, 1], c=db.labels_, cmap="plasma")
   # plt.xlabel("Feature 0")
   # plt.ylabel("Feature 1")
    plt.title('eps={},min samples={}'.format(db.eps,dbscan.min_samples))

Параметр min_samples:

plt.figure(figsize=(12,8))
for i,k in enumerate([5,10,15,20],start=1):
    plt.subplot(2,2,i)
    db = DBSCAN(eps = .3,metric="euclidean",min_samples = k)
    db.fit(X_scaled)
    
    plt.scatter(X[:, 0], X[:, 1], c=db.labels_, cmap="plasma")
   # plt.xlabel("Feature 0")
   # plt.ylabel("Feature 1")
    plt.title('eps={},min samples={}'.format(db.eps,db.min_samples))

Когда использовать какие методы кластеризации, зависит от набора данных. Несмотря на то, что метод K-средних является широко используемым подходом к кластеризации, существуют проблемы с наборами данных, когда использование DBSCAN приводит к лучшим кластерам.

И, наконец, понравилась ли вам эта статья или она вам чем-то помогла. Пожалуйста, похлопайте. И я бы не возражал против 50 из них;)