Введение в алгоритм кластеризации Kmeans
Что такое кластеризация K-средних?
Кластеризация K-средних — это неконтролируемый алгоритм машинного обучения, используемый для кластеризации или группировки похожих точек данных вместе в наборе данных. Это алгоритм разделения, который делит данные на непересекающиеся кластеры, где каждая точка данных принадлежит одному кластеру. Кластеризация K-средних направлена на минимизацию суммы квадратов расстояний между каждой точкой данных и назначенным ей центроидом.
Теория — как это работает?
Шаг 1. Во-первых, нам нужно определить значение K, то есть количество кластеров, которые мы хотим создать. Значение K можно определить либо случайным образом, либо с помощью какого-либо метода, такого как локоть, силуэт.
Шаг 2. Затем мы случайным образом выбираем K точек из набора данных, которые будут действовать как начальные центроиды для каждого кластера.
Шаг 3. Затем мы вычисляем евклидово расстояние между каждой точкой данных и центроидами и назначаем точку данных ближайшему центроиду, создавая K кластеров.
Шаг 4. После присвоения всех точек данных их ближайшему центроиду мы обновляем местоположение каждого центроида, вычисляя среднее значение всех точек данных, назначенных этому центроиду.
Шаг 5. Мы повторяем шаги 3 и 4 до тех пор, пока алгоритм не сойдется, что означает, что центроиды больше не перемещаются или улучшение суммы квадратов расстояний между точками данных и назначенным им центроидом не станет незначительным.
Как работает код?
Импортируйте необходимые библиотеки:
import numpy as np
import matplotlib.pyplot as plt
X = np.random.rand(100, 2) * 2
plt.scatter(X[:, 0], X[:, 1])
plt.show()
K = 7
centroids = X[np.random.choice(len(X), K, replace=False)]
plt.scatter(X[:, 0], X[:, 1])
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()
while True:
# Assign data points to the nearest centroid
distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
labels = np.argmin(distances, axis=0)
# Calculate new centroids
new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(K)])
# Check for convergence
if np.all(centroids == new_centroids):
break
# Update centroids
centroids = new_centroids
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()
Ограничения алгоритма K-средних
- K означает, что кластеризация чувствительна к начальному выбору центроида. Алгоритм может сходиться к субоптимальному решению, если начальные центроиды выбраны неправильно.
- K означает, что кластеризация чувствительна к выбросам
- K означает, что кластеризация чувствительна к значению K. Если K выбран неправильно, это может привести к субоптимальным кластерам.