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

Прежде чем погрузиться в код, рассмотрим пошаговый подход: -

Шаг 1: - Сначала нам нужно определиться с количеством кластеров. В некоторых случаях, например, при сегментации рынка, значение «k» (количество кластеров) определяется в формулировке задачи. В других случаях мы должны определить оптимальное значение «k». Метод изгиба помогает выбрать оптимальное значение «k» путем подбора модели с диапазоном значений «k». Об этом мы поговорим в другой статье. Здесь мы предполагаем, что значение «k» равно 3.

Шаг 2: - Затем мы случайным образом инициализируем "k" центроидов из заданных точек данных.

Шаг 3: - Мы вычисляем квадрат евклидовых расстояний между центроидами и точками данных. Точка данных назначается k-му кластеру, если квадрат евклидова расстояния между точкой данных и центроидом k-го кластера минимален.

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

Шаг 5. Мы вычисляем "эпсилон", который определяется как сумма квадратов евклидовых расстояний между точками данных и их соответствующим центроидом.

Шаг 6. Мы повторяем весь процесс до тех пор, пока не будет значительного изменения значения «Эпсилон», что свидетельствует об отсутствии значительных изменений в формировании кластеров.

Теперь давайте разберемся с кодом Python K-means Clustering 2-мерных данных в 3 кластера.

Получаем следующие диаграммы разброса.

Мы наблюдаем, что после 3-й итерации нет значительных изменений в формировании кластеров, поскольку 3-я, 4-я и 5-я диаграммы разброса очень похожи друг на друга.

Теперь давайте построим график зависимости «количества итераций от квадратного корня из эпсилона».

a = list(range(1,21)) #Number of iterations = 20
plt.plot(a, [x**0.5 for x in epsilon], ‘go — ‘, linewidth=1.5, markersize=4)
plt.xlabel(‘Iteration number’) 
plt.ylabel(‘Square root of epsilon’)

Из приведенного выше графика мы снова видим, что значительного изменения значения квадратного корня из эпсилона после 3-й итерации не наблюдается. Следовательно, мы можем остановиться после 3–4 итераций.