K-means++ is an improvement on the standard K-means clustering algorithm. Like K-means, it is an unsupervised learning algorithm used to group similar data points together based on their similarity. The goal of K-means++ is to initialize the cluster centers in a more intelligent way than the random initialization used by K-means, which can lead to suboptimal results.

Как работает K-Means++

Вот основные шаги алгоритма K-средних++:

Шаг 1. Инициализируйте первый центр кластера, случайным образом выбрав одну точку данных из набора данных.

Шаг 2. Для каждой точки данных, еще не выбранной в качестве центра кластера, вычислите расстояние между точкой и ближайшим центром кластера.

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

Шаг 4. Повторяйте шаги 2 и 3, пока не будут инициализированы все K кластерных центров.

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

Инициализируя кластерные центры более интеллектуальным способом, K-means++ с меньшей вероятностью застрянет в неоптимальном решении и может привести к лучшим результатам кластеризации.

Как работает код

Давайте создадим несколько случайных точек и нанесем их на график

import numpy as np
import matplotlib.pyplot as plt
X = np.random.rand(100, 2) * 2
plt.scatter(X[:, 0], X[:, 1])
plt.show()

Шаг 1: Инициализируйте первый центр кластера, случайным образом выбрав одну точку данных из набора данных.

# Generate some random data
import numpy as np
X = np.random.randn(100, 2)

# Initialize the first cluster center by randomly selecting one data point from the dataset
center_indices = np.random.choice(len(X), size=1)
centers = X[center_indices]
# Lets plot the inital Cluster
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.scatter(X[:, 0], X[:, 1])
plt.show()

Шаг 2: Для каждой точки данных, еще не выбранной в качестве центра кластера, вычислите расстояние между точкой и ближайшим центром кластера.

# Compute the distances between each data point and the nearest cluster center
distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
min_distances = distances.min(axis=0)

Шаг 3: Выберите следующий центр кластера из оставшихся точек данных с вероятностью, пропорциональной квадрату расстояния до ближайшего центра кластера.

# Select the next cluster center with probability proportional to the distance squared to the nearest cluster center
probs = min_distances**2 / np.sum(min_distances**2)
center_index = np.random.choice(np.arange(len(X)), p=probs)
centers = np.vstack([centers, X[center_index]])
#Lets plot again and check the clusters
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.scatter(X[:, 0], X[:, 1])
plt.show()

Шаг 4: Повторяйте шаги 2 и 3, пока не будут инициализированы все K кластерных центров.

# Initialize K-means++ clustering algorithm with 3 clusters
k = 3
centers = X[np.random.choice(len(X), size=1)]
#Lets plot again and check the clusters
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.scatter(X[:, 0], X[:, 1])
plt.show()
while len(centers) < k:
    distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
    min_distances = distances.min(axis=0)
    probs = min_distances**2 / np.sum(min_distances**2)
    center_index = np.random.choice(np.arange(len(X)), p=probs)
    centers = np.vstack([centers, X[center_index]])
    
    #Lets plot again and check the clusters
    plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
    plt.scatter(X[:, 0], X[:, 1])
    plt.show()

На этом шаге мы повторяем шаги 2 и 3 до тех пор, пока не будут инициализированы все центры K кластеров. Сначала мы устанавливаем количество кластеров равным k. Затем мы инициализируем первый центр кластера, как описано в шаге 1. Мы используем цикл while для повторения шагов 2 и 3, пока len(centers) не станет равным k.

Шаг 5: Продолжите стандартный алгоритм K-средних для присвоения данных

cnt = 0
centroids = None
while True and cnt < 10:
    cnt = cnt +1
    # Initialize the first cluster center by randomly selecting one data point from the dataset
    center_indices = np.random.choice(len(X), size=1)
    centers = X[center_indices]
    
    # Calculate new centroids   
    while len(centers) < k:
        distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
        min_distances = distances.min(axis=0)
        probs = min_distances**2 / np.sum(min_distances**2)
        center_index = np.random.choice(np.arange(len(X)), p=probs)
        centers = np.vstack([centers, X[center_index]])        
    
    
        
    # Check for convergence
    if centroids is not None and np.all(centroids == centers):
        break

    # Update centroids
    centroids = centers
#Plot the new clusters
plt.scatter(X[:, 0], X[:, 1])
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()

Минусы Kmeans

Хотя K-means++ является популярным и эффективным алгоритмом кластеризации, он не лишен своих ограничений и недостатков. Вот некоторые из основных недостатков K-means++:

  1. Чувствительность к начальному семени: хотя K-средние++ помогает обеспечить хороший начальный набор центров кластеров, алгоритм по-прежнему чувствителен к начальному семени или начальной точке. Разные исходные значения могут привести к разным центрам кластеров и, в конечном счете, к разным результатам кластеризации.
  2. Сложность определения оптимального количества кластеров: K-means++ требует, чтобы количество кластеров было указано заранее. Однако определение оптимального количества кластеров не всегда просто и может потребовать проб и ошибок или других методов, таких как метод локтя или оценка силуэта.
  3. Склонность к локальным оптимумам: как и традиционные K-средние, K-средние++ склонны застревать в локальных оптимумах, что может привести к субоптимальным результатам кластеризации. Этого можно избежать, запустив алгоритм несколько раз с разными исходными значениями и выбрав наилучший результат.
  4. Предполагается, что кластеры сферические: K-means++ предполагает, что кластеры имеют сферическую форму и имеют одинаковый размер и плотность. Это может не подходить для наборов данных с кластерами несферической или неправильной формы.
  5. Может быть дорогостоящим в вычислительном отношении: K-means++ может быть дорогостоящим в вычислительном отношении для больших наборов данных или многомерных данных. Алгоритм требует многократных итераций вычисления расстояний и вероятностей, что может занять много времени для больших наборов данных или многомерных данных.
  6. Проблемы с многомерными данными

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

Когда использовать Kmeans++

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

Вот несколько сценариев, в которых K-means++ может быть хорошим выбором:

  1. Сегментация изображения: K-means++ можно использовать для сегментации изображения, цель которого состоит в том, чтобы разделить изображение на разные области на основе цвета или текстуры. В этом случае количество кластеров можно оценить на основе количества отдельных областей на изображении.
  2. Сегментация рынка: K-means++ можно использовать для сегментации рынка, где цель состоит в том, чтобы определить группы клиентов со схожим покупательским поведением или предпочтениями. В этом случае количество кластеров можно оценить на основе количества отдельных потребительских сегментов.
  3. Категоризация инвентаря

Это интуиция к K Means++. Оригинальный инструмент может отличаться от этого.

Оставайтесь с нами для большего количества таких объяснений.