Кластеризация — это неконтролируемый метод, который группирует похожие точки данных в кластеры. При кластеризации K-средних точки данных группируются в k кластеров. Давайте объясним кластеризацию k-средних на примере двух кластеров, где это означает, что k = 2.

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

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

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

Псевдокод кластеризации k-средних

1. Randomly initialize the k cluster centroids
repeat{
  2. Assign the data points to cluster centroids 
  3. Move cluster centroids
}

Приложение

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

Мы взяли примеры, приведенные в [2], и обернули их в блокнот Jupyter и контейнер докеров, если вам нужно легко их запускать. Мы опубликовали это в репозитории GitHub.

Изображения с каналами RGB представлены в трехмерном массиве. Первый шаг — преобразовать 3D-массив в 2D-массив, используя приведенный ниже код.

rows = image.shape[0]
cols = image.shape[1]
image = image.reshape(rows*cols, 3)

Следующий шаг — запустить алгоритм K-средних с k=6.

kmeans = KMeans(n_clusters=6)
kmeans.fit(image)

Теперь замените каждое значение пикселя ближайшими центроидами.

compressed_image = kmeans.cluster_centers_[kmeans.labels_]
compressed_image = np.clip(compressed_image.astype('uint8'), 0, 255)

Вот сравнение исходного изображения и сжатого изображения.

Если вам понравилась моя статья, подпишитесь на меня в профилях Github, Linkedin и/или Medium.

Ссылка

  1. https://www.javatpoint.com/k-means-clustering-algorithm-in-machine-learning
  2. https://iq.opengenus.org/image-compression-using-k-means/