"Машинное обучение"

К-средние и кластеризация распространения сродства

Выполнение численной кластеризации с использованием двух подходов. Полный код доступен в моем репо.

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

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

Когда мне следует использовать Affinity Propagation?

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

Поиск кластеров

Например, у меня есть наборы данных о клиентах. Я решил сгруппировать их только с учетом их возраста (я буду использовать только одну переменную, чтобы упростить задачу). Вот как вы создаете алгоритм машинного обучения Affinity Propagation:

from sklearn.cluster import AffinityPropagation
import numpy as np
X = np.array([[10], [60], [80]])
clustering = AffinityPropagation().fit(X)
clustering
AffinityPropagation(affinity='euclidean', convergence_iter=15, copy=True, damping=0.5, max_iter=200, preference=None, verbose=False)
#labels
print(clustering.labels_)
#cluster centers
print(clustering.cluster_centers_)

Выход:

[0 1 1]
array([[10], [80]])

Программа изолировала два кластера в позициях 10 и 80. Возможно, игра с гиперпараметрами алгоритма значительно изменила бы его результат.

Когда мне следует использовать кластеризацию K-среднего?

С K-Mean это становится более проблематичным. Это более полная модель, поэтому вам нужно будет указать количество кластеров.

Нахождение 1 кластера

Я применяю алгоритм K-Mode к тому же набору данных:

from sklearn.cluster import KMeans
import numpy as np
#dots
X = np.array([[10], [80]])
kmeans = KMeans(n_clusters=1, random_state=0).fit(X)
#epicenters
print('cluster epicenters', kmeans.cluster_centers_)

Выход:

cluster epicenters [[45.]]

Алгоритм нашел единственный кластер, помещенный в центр данных: 45 (или 10+ (80–10) / 2 = 45).

Нахождение 2 кластеров

У меня может быть более сложный набор данных, и вместо двух точек у меня может быть три точки (10, 60, 80). Я уже знаю (у меня будут свои причины), что я хочу разделить свои данные на 2 кластера, а не на 1.

from sklearn.cluster import KMeans
import numpy as np
#4 punti in un piano bidimensionale
X = np.array([[10], [80], [60]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
#dove sono gli epicentri dei 2 clusters?
print('cluster epicenters', kmeans.cluster_centers_)

Выход:

cluster epicenters [[10.] [70.]

Как видите, я произвольно выбрал количество кластеров, а K-Means разместил эпицентры в наиболее удобных положениях.

Сравнение

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

Это сравнение обоих подходов на более сложном наборе данных. Как обычно, вы выберете лучшую модель в соответствии с вашими потребностями. Если вы не знаете, как выглядят ваши данные, вы можете просто использовать Affinity Propagation. Но если вы уже знаете, сколько кластеров вам нужно, K-Means - идеальный алгоритм для вас.