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

В этом уроке вы узнаете,

Введение в алгоритм кластеризации K-средних

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

Например, если мы заменим K на 3, этот алгоритм разделит весь наш набор данных на 3 кластера в соответствии с сходством данных.

Как работает алгоритм кластеризации K-средних

Мы можем легко понять, как изучить алгоритм K-средних на основе данных, на простом примере.

Предположим, что есть такие данные.

Шаг 1

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

Шаг 2

Затем отметьте 2 точки данных случайным образом для 2 кластеров. Это начальные положения кластеров.

Шаг 3

Назначьте каждую точку данных ближайшему центроиду. Здесь используются такие методы, как Евклидово расстояние, Манхэттенское расстояние, чтобы измерить расстояние от точки данных до центроида.

Например, давайте рассмотрим одну точку данных. Его позиция (5,3).

Кроме того, есть два центроида кластера: C1 = (2,4) и C2 = (6,1).

Расстояние между C1 и точкой данных.

Расстояние между C2 и точкой данных.

Согласно приведенным выше результатам, точка данных принадлежит кластеру C2.

Шаг 4

Вычислите среднее значение точек данных, принадлежащих каждому кластеру, и переместите его центроид кластера в среднее положение.

Например, ниже приведены 5 точек данных, принадлежащих центроиду кластера.

D1= (3,4), D1= (4,1), D3= (2,3), D4= (2,6), D5= (3,3)

Вычислить среднее (среднее) = 1/5 * (3+4+2+2+3, 4+1+3+6+3)

= 1/5 * (14, 17)

= (2.8, 3.4)

Соответственно, введенный выше центр тяжести кластера перемещается в положение (2.8, 3.4).

Шаг 5

Повторяйте Шаг 3 и Шаг 4, пока центроиды кластера не изменятся. Это означает, что точки данных в каждой итерации принадлежат одному и тому же кластеру. Таким образом, мы можем предположить, что точки данных правильно сгруппированы.

Как выбрать правильное количество кластеров

Иногда нам сложно определить количество кластеров на основе способа распределения данных.

В приведенном выше случае трудно назначить наиболее подходящее значение К. Итак, есть несколько методов, которые мы можем использовать в такой ситуации. Метод локтя — самый популярный способ найти оптимальное количество кластеров.

Локтевой метод

Здесь вычислите ошибку суммы квадратов (WCSS) для каждого количества кластеров и постройте график с разными значениями K. И самая высокая последовательная разница по обе стороны от этого графика считается оптимальным значением K.

Вычислить ошибку WCSS (сумма квадратов внутри кластера),

  • Вычислите квадрат ошибки для каждой точки данных. Для этого необходимо рассчитать расстояние между каждой точкой данных и центроидом ее кластера.
  • Оценка WCSS — это сумма всех этих квадратов ошибок.

Метод локтя

Приложения кластеризации K-средних

Сегменты рынка

Используя алгоритм обучения без учителя, мы можем сгруппировать всех клиентов по разным группам, используя разные сегменты рынка.

Поисковые системы

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

Рекомендательные системы

В зависимости от того, что мы ищем в системе рекомендаций, она будет неоднократно рекомендовать другие вещи в той же группе. Для этого используется алгоритм кластеризации.

Практическая реализация кластеризации K-средних

Давайте реализуем алгоритм Кластеризация K-средних, используя Python. Я делаю это, используя набор данных Mall Customers. Нажмите здесь, чтобы загрузить набор данных.

Согласно набору данных, есть некоторая информация о клиентах (идентификатор клиента, пол, возраст, годовой доход, оценка расходов). Здесь мы будем использовать только два столбца из набора данных для простоты. Наша цель — сгруппировать клиентов в соответствии с их годовым доходом и показателем расходов. Оценка расходов — это оценка, которую вы присваиваете клиентам в соответствии с их поведением и данными о покупках.

Давайте выполним следующие действия.

  1. Загрузить набор данных
  2. Предварительная обработка и визуализация данных
  3. Выберите подходящее количество кластеров (K)
  4. Обучите модель с помощью кластеризации K-средних

Загрузить набор данных

# load dataset
import pandas as pd
data = pd.read_csv('Mall_Customers.csv')
data.sample(5)

Здесь в наборе данных 5 столбцов. Но для простоты мы будем использовать только 2 столбца (годовой доход (тыс. долл.), показатель расходов (1–100)).

Предварительная обработка и визуализация данных

data = data[['Annual Income (k$)','Spending Score (1-100)']]
# rename names of columns for simplicity
data = data.rename(columns={'Annual Income (k$)': 'income', 'Spending Score (1-100)': 'score'})
data.sample(5)
# visualize the data distribution
import matplotlib.pyplot as plt
plt.scatter(data['income'],data['score'])

Согласно набору данных, мы можем обучить эту модель, задав определенное значение K. Но здесь я найду значение K, используя метод локтя.

Выберите подходящее количество кластеров (K)

# calculate sum of squares errors for different K values
from sklearn.cluster import KMeans
k_values = [1,2,3,4,5,6,7,8,9,10]
wcss_error = []
for k in k_values:
   model = KMeans(n_clusters=k)
   model.fit(data[['income','score']])
   wcss_error.append(model.inertia_)

Примечание.Inertia_ — это атрибут в библиотеке sklearn, который измеряет, насколько хорошо кластеризован набор данных. Это хорошо для низкого значения инерции.

# sum of squares error for K=1 to k=10
print(wcss_error)
OUTPUT:
[269981.28000000014,
 181363.59595959607,
 106348.37306211119,
 73679.78903948837,
 44448.45544793369,
 37239.83554245604,
 30552.714025467285,
 25056.895153616188,
 21850.16528258562,
 19636.75396489815]
# plot WCSS error corresponding to different K values
plt.xlabel('Number of Clusters (K)')
plt.ylabel('WCSS Error')
plt.plot(k_values, wcss_error)

Метод локтя используется для наблюдения оптимального количества кластеров в соответствии с набором данных. Здесь мы видим, что локоть можно найти в точке K=5 по сравнению с другими точками. Поэтому мы будем использовать 5 как количество кластеров.

Обучите модель с помощью кластеризации K-средних

# train model using k=5
model = KMeans(n_clusters=5)
pred = model.fit_predict(data[['income','score']])
print(pred)
OUTPUT:
array([3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1,
       3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 0,
       3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 2, 0, 2, 4, 2, 4, 2,
       0, 2, 4, 2, 4, 2, 4, 2, 4, 2, 0, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2,
       4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2,
       4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2, 4, 2,
       4, 2])
# add cluster column to dataset
data['cluster'] = pred
data.sample(5)
# centers of clusters
model.cluster_centers_
OUTPUT:
array([[55.2962963 , 49.51851852],
       [25.72727273, 79.36363636],
       [86.53846154, 82.12820513],
       [26.30434783, 20.91304348],
       [88.2       , 17.11428571]])
# visualize clusted data
cluster1 = data[data['cluster']==0]
plt.scatter(cluster1['income'], cluster1['score'])
cluster2 = data[data['cluster']==1]
plt.scatter(cluster2['income'], cluster2['score'])
cluster3 = data[data['cluster']==2]
plt.scatter(cluster3['income'], cluster3['score'])
cluster2 = data[data['cluster']==3]
plt.scatter(cluster2['income'], cluster2['score'])
cluster3 = data[data['cluster']==4]
plt.scatter(cluster3['income'], cluster3['score'])
plt.scatter(model.cluster_centers_[:,0],model.cluster_centers_[:,1],color='black')

Теперь вы можете видеть, что модель правильно кластеризовала набор данных.

Выучить больше:

Учебники:

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

Глубокое обучение

"Обработка естественного языка"