"Машинное обучение"
К-средние и кластеризация распространения сродства
Выполнение численной кластеризации с использованием двух подходов. Полный код доступен в моем репо.
Кластеризация - один из самых простых алгоритмов для реализации с помощью любых инструментов машинного обучения. Существует два разных набора алгоритмов, предназначенных для кластеризации, в зависимости от того, используем ли мы числовые данные (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 - идеальный алгоритм для вас.