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

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

K означает, что работает через следующий итеративный процесс:

  1. Выберите значение для k (количество создаваемых кластеров)
  2. Инициализируйте k «центроидов» (начальных точек) в ваших данных
  3. Создайте свои кластеры. Назначьте каждую точку ближайшему центроиду.
  4. Сделайте свои кластеры лучше. Переместите каждый центроид в центр своего кластера.
  5. Повторяйте шаги 3–4, пока ваши центроиды не сойдутся.

Как его применить?

В следующем примере я собираюсь использовать набор данных Iris scikit Learn. Эти данные состоят из 50 образцов каждого из трех видов ириса (Iris setosa, Iris virginica и Iris versicolor). Он имеет четыре признака из каждого образца: длину и ширину чашелистиков и лепестков.

  1. Для начала давайте импортируем следующие библиотеки.
from sklearn import datasets
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans

2. Загрузите данные.

iris = datasets.load_iris()

3. Определите свою цель и предикторы.

X = iris.data[:, :2]
y = iris.target

4. Давайте посмотрим на наши данные через точечную диаграмму.

plt.scatter(X[:,0], X[:,1], c=y, cmap='gist_rainbow')
plt.xlabel('Spea1 Length', fontsize=18)
plt.ylabel('Sepal Width', fontsize=18)

5. Теперь давайте создадим и подгоним нашу модель кластера K-средних. Мы собираемся использовать три кластера и случайное состояние 21.

km = KMeans(n_clusters = 3, n_jobs = 4, random_state=21)
km.fit(X)

6. С помощью следующего кода вы можете определить центральные точки данных.

centers = km.cluster_centers_
print(centers)
Output
[[5.77358491 2.69245283]
[5.006      3.418    ]
[6.81276596 3.07446809]]

7. Теперь давайте сравним наши исходные данные с нашими кластеризованными результатами, используя следующий код.

#this will tell us to which cluster does the data observations belong.
new_labels = km.labels_
# Plot the identified clusters and compare with the answers
fig, axes = plt.subplots(1, 2, figsize=(16,8))
axes[0].scatter(X[:, 0], X[:, 1], c=y, cmap='gist_rainbow',
edgecolor='k', s=150)
axes[1].scatter(X[:, 0], X[:, 1], c=new_labels, cmap='jet',
edgecolor='k', s=150)
axes[0].set_xlabel('Sepal length', fontsize=18)
axes[0].set_ylabel('Sepal width', fontsize=18)
axes[1].set_xlabel('Sepal length', fontsize=18)
axes[1].set_ylabel('Sepal width', fontsize=18)
axes[0].tick_params(direction='in', length=10, width=5, colors='k', labelsize=20)
axes[1].tick_params(direction='in', length=10, width=5, colors='k', labelsize=20)
axes[0].set_title('Actual', fontsize=18)
axes[1].set_title('Predicted', fontsize=18)

Вот список основных преимуществ и недостатков этого алгоритма.

Преимущества:

  • K-Means прост и эффективен в вычислительном отношении.
  • Это очень интуитивно понятно, и их результаты легко визуализировать.

Недостатки:

  • K-Means сильно зависит от масштаба и не подходит для данных различной формы и плотности.
  • Оценка результатов более субъективна. Это требует гораздо большей человеческой оценки, чем надежные показатели.