Как определить количество кластеров в Python? 🧩
Чтобы определить количество кластеров в Python, можно использовать метод локтя (elbow method) на основе значения иерархической кластеризации. Этот метод позволяет оценить оптимальное количество кластеров, исходя из их характеристик.
import numpy as np
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import silhouette_score
# Загрузка данных
data = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
# Параметры для иерархической кластеризации
range_n_clusters = [2, 3, 4, 5, 6]
best_score = -1
best_clusters = 0
# Применяем метод локтя
for n_clusters in range_n_clusters:
clustering = AgglomerativeClustering(n_clusters=n_clusters)
clustering.fit(data)
labels = clustering.labels_
score = silhouette_score(data, labels)
if score > best_score:
best_score = score
best_clusters = n_clusters
# Вывод оптимального количества кластеров
print(f"Оптимальное количество кластеров: {best_clusters}")
В данном примере мы загружаем данные и задаем несколько вариантов числа кластеров для иерархической кластеризации. Затем мы вычисляем значение коэффициента силуэта для каждого варианта и выбираем тот, который дает наилучший результат.
Детальный ответ
Как определить количество кластеров в Python
Определение количества кластеров в наборе данных является важным шагом при решении задачи кластеризации. В Python существуют различные методы для определения оптимального количества кластеров. В этой статье мы рассмотрим несколько из них и предоставим примеры кода для их реализации.
1. Метод локтя (Elbow method)
Метод локтя является одним из наиболее распространенных методов определения количества кластеров. Он основан на графике значения функции потерь в зависимости от числа кластеров.
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
# Создание набора данных
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
# Создание списка для сохранения значения функции потерь
loss = []
# Попробуйте разное количество кластеров (от 1 до 10) и сохраните значения функции потерь
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
loss.append(kmeans.inertia_)
# Построение графика
plt.plot(range(1, 11), loss, marker='o')
plt.xlabel('Количество кластеров')
plt.ylabel('Сумма квадратов расстояний')
plt.title('Метод локтя: Количество кластеров vs. Функция потерь')
plt.show()
На графике можно наблюдать, что функция потерь убывает с увеличением числа кластеров. Однако, на каком-то моменте изменение функции потерь становится менее значительным, и график приобретает форму, напоминающую локоть. Это значение на графике является оптимальным количеством кластеров.
2. Метод силуэта (Silhouette method)
Метод силуэта также является распространенным способом определения количества кластеров. Этот метод основан на вычислении силуэтных коэффициентов для каждого объекта в данных.
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import numpy as np
# Создание набора данных
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
# Создание списка для сохранения значения силуэтного коэффициента
silhouette_scores = []
# Попробуйте разное количество кластеров (от 2 до 5) и сохраните значения силуэтных коэффициентов
for k in range(2, 6):
kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
silhouette_scores.append(silhouette_score(X, kmeans.labels_))
# Вывод результатов
for k, score in zip(range(2, 6), silhouette_scores):
print(f'Количество кластеров: {k}, Силуэтный коэффициент: {score:.2f}')
Значение силуэтного коэффициента находится в диапазоне от -1 до 1. Чем ближе значение к 1, тем лучше разделение данных на кластеры. Следовательно, оптимальное количество кластеров можно выбрать на основе наибольшего значения силуэтного коэффициента.
3. Метод Gap Statistics
Метод Gap Statistics является еще одним способом определения оптимального количества кластеров. Он основан на сравнении внутрикластерной дисперсии с ожидаемым значением.
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances
import numpy as np
# Создание набора данных
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
# Создание списка для сохранения значения gap statistic
gap_scores = []
# Попробуйте разное количество кластеров (от 1 до 10) и сохраните значения gap statistic
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
Wk = sum(pairwise_distances(X, kmeans.cluster_centers_, metric='euclidean').min(axis=1)) # Внутрикластерная дисперсия
Wkb = np.mean([sum(pairwise_distances(X, center, metric='euclidean').min(axis=1)) for center in kmeans.cluster_centers_]) # Ожидаемая внутрикластерная дисперсия
gap_scores.append(np.log(Wkb) - np.log(Wk))
# Построение графика
plt.plot(range(1, 11), gap_scores, marker='o')
plt.xlabel('Количество кластеров')
plt.ylabel('Gap statistic')
plt.title('Метод Gap Statistics: Количество кластеров vs. Gap statistic')
plt.show()
Значение gap statistic представляет собой разницу между ожидаемой внутрикластерной дисперсией и фактической внутрикластерной дисперсией. Оптимальное количество кластеров можно выбрать на основе наибольшего значения gap statistic, когда разница между соседними значениями становится наименьшей.
Заключение
В этой статье были рассмотрены три метода для определения количества кластеров в Python: метод локтя, метод силуэта и метод Gap Statistics. Каждый из них имеет свои преимущества и может быть применен в зависимости от особенностей данных и задачи. При выборе оптимального числа кластеров необходимо анализировать соответствующие графики и значения, полученные из этих методов.