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

Кластерный анализ — важный метод в области неконтролируемого машинного обучения для извлечения информации из базовой структуры данных. Среди множества алгоритмов кластеризации К-средних занимает видное место. Тем не менее, часто возникает ключевой вопрос: Как мы определяем оптимальное количество кластеров, K? В этой статье мы углубимся в различные методы, чтобы ответить на этот вопрос, раскрывая идеи от интуитивных методов к более математическим подходам. В этом путешествии мы раскроем интуицию, математику и код Python, лежащие в основе каждого метода.

Метод локтя:

В методе локтя используется графический подход для определения «точки локтя», указывающей, где уменьшение внутрикластерной суммы квадратов расстояний (WCSS) начинает уменьшаться медленнее. Эта точка часто соответствует подходящему К.

Математическое объяснение:данные точки данных X = {x1, x2, …, xn}, WCSS для K кластеров рассчитывается как:

Где Ci​ – i-й кластер, а µi​ – среднее значение точек данных в Ci​.

Реализация Python:

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)

sns.set()
plt.plot(range(1, 11), wcss)
plt.title('Elbow Method')
plt.xlabel('Number of Clusters')
plt.ylabel('WCSS')
plt.show()

Оценка силуэта

Оценка силуэта оценивает сходство точки данных в своем кластере по сравнению с другими кластерами. Более высокий балл подразумевает четко определенные кластеры.

Математическое объяснение.Для каждой точки данных показатель силуэта s(i) рассчитывается следующим образом:

Здесь a(i) обозначает среднее расстояние в пределах одного кластера, а b(i) — наименьшее среднее расстояние до различных кластеров.

Реализация Python

sil_scores = []
for i in range(2, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
    kmeans.fit(X)
    labels = kmeans.labels_
    sil_scores.append(silhouette_score(X, labels))

plt.plot(range(2, 11), sil_scores)
plt.title('Silhouette Score')
plt.xlabel('Number of Clusters')
plt.ylabel('Silhouette Score')
plt.show()

Статистика пробелов

Gap Statistics сравнивает WCSS фактических данных со случайным распределением, помогая идентифицировать значимые кластеры по сравнению с шумом.

Математическое объяснение.Статистика пропусков сравнивает логарифм (WCSS) данных с ожидаемым логарифмом (WCSS) при нулевом распределении. Оптимальное значение K максимизирует разрыв между ними.

Реализация Python

def compute_gap(data, k):
    kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42)
    kmeans.fit(data)
    wcss = np.log(kmeans.inertia_)
    
    random_data = np.random.rand(*data.shape)
    random_wcss = np.log(KMeans(n_clusters=k, init='random', random_state=42).fit(random_data).inertia_)
    return random_wcss - wcss

gap_values = []
for i in range(1, 11):
    gap_values.append(compute_gap(X, i))
    
plt.plot(range(1, 11), gap_values)
plt.title('Gap Statistics')
plt.xlabel('Number of Clusters')
plt.ylabel('Gap Value')
plt.show()

Индекс Дэвиса-Булдина

Индекс Дэвиса-Булдина измеряет среднее сходство каждого кластера с его наиболее похожим кластером. Более низкие значения указывают на лучшее разделение кластеров.

Математическое объяснение. Для каждого кластера i индекс Дэвиса-Булдина DB(i) рассчитывается следующим образом:

Где s(i) представляет среднее расстояние в кластере i и d(i >,j) обозначает расстояние между центроидами кластеров i и j.

Реализация Python

from sklearn.metrics import davies_bouldin_score

db_scores = []
for i in range(2, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
    kmeans.fit(X)
    labels = kmeans.labels_
    db_scores.append(davies_bouldin_score(X, labels))

plt.plot(range(2, 11), db_scores)
plt.title('Davies-Bouldin Score')
plt.xlabel('Number of Clusters')
plt.ylabel('Davies-Bouldin Score')
plt.show()

Заключение

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

Рекомендации







Если вы дочитали до сих пор, большое спасибо за чтение! Надеюсь, эта статья окажется для вас полезной.Если хотите, добавьте меня в LinkedIn!

Удачи на этой неделе,
Пратюш