Scikit Learn - K-Means - Elbow - критерий

Сегодня я пытаюсь узнать что-то о К-средствах. Я понял алгоритм и знаю, как он работает. Теперь я ищу правильный k... Я нашел критерий локтя как метод для определения правильного k, но я не понимаю, как его использовать с помощью scikit learn?! В scikit узнайте, что я группирую вещи таким образом.

kmeans = KMeans(init='k-means++', n_clusters=n_clusters, n_init=10) 
kmeans.fit(data)

Так что я должен делать это несколько раз для n_clusters = 1... n и смотреть с частотой ошибок, чтобы получить нужный k? думаю, это было бы глупо и займет много времени?!

Ответ 1

Критерий локтя - визуальный метод. Я еще не видел надежного математического определения. Но k-mean тоже довольно грубая эвристика.

Итак, да, вам нужно будет запустить k-средство с помощью k=1...kmax, а затем построить результирующий SSQ и выбрать "оптимальный" k.

Существуют расширенные версии k-средних, такие как X-средства, которые начинаются с k=2, а затем увеличивают его до тех пор, пока вторичный критерий (AIC/BIC) больше не улучшится. Bisecting k-mean - это подход, который также начинается с k = 2, а затем многократно разбивает кластеры до k = kmax. Вы могли бы извлечь из него промежуточные SSQ.

В любом случае у меня создается впечатление, что в любом фактическом случае, когда k-mean действительно хорош, вы действительно знаете, что вам нужно заранее. В этих случаях k-означает фактически не столько алгоритм "кластеризации", сколько алгоритм векторного квантования. Например. уменьшая количество цветов изображения до k. (где часто вы выбираете k, например, 32, потому что тогда это глубина цвета 5 бит и может быть сохранена бит сжатым способом). Или, например, в подходах с мешков-визуальных слов, где вы будете выбирать размер словаря вручную. Популярное значение, как представляется, k = 1000. Вы тогда не очень заботитесь о качестве "кластеров", но главное - иметь возможность уменьшить изображение до 1000-мерного разреженного вектора. Производительность 900-мерного или 1100-мерного представления не будет существенно отличаться.

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

Ответ 2

Если истинная метка неизвестна заранее (как в вашем случае), тогда модель (например, clustering) может быть оценена с использованием коэффициента Силуэт.

От документация sklearn,

Высший балл по коэффициенту Силуэт относится к модели с определенными кластерами. Коэффициент силуэта определяется для каждого образца и состоит из двух партитур: `

a: среднее расстояние между образцом и всеми другими точками в одном классе.

b: среднее расстояние между образцом и всеми другими точками в следующем ближайший кластер.

Коэффициент Силуэта для одного образца затем задается как:

s=b-a/max(a,b)

Теперь, чтобы найти оптимальное значение k для KMeans, выполните цикл 1..n для n_clusters в KMeans и рассчитайте коэффициент силы для каждого образца.

Более высокий коэффициент силуэтов указывает, что объект хорошо сопоставляется с собственным кластером и плохо сопоставляется с соседними кластерами.

from sklearn.metrics import silhouette_score
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans

X = load_iris().data
y = load_iris().target

for n_cluster in range(2, 11):
    kmeans = KMeans(n_clusters=n_cluster).fit(X)
    label = kmeans.labels_
    sil_coeff = silhouette_score(X, label, metric='euclidean')
    print("For n_clusters={}, The Silhouette Coefficient is {}".format(n_cluster, sil_coeff))

Вывод -

Для n_clusters = 2 коэффициент Силуэта равен 0.680813620271
Для n_clusters = 3 коэффициент Силуэта равен 0,552591944521
Для n_clusters = 4 коэффициент Силуэта 0.496992849949
Для n_clusters = 5 коэффициент Силуэта равен 0.488517550854
Для n_clusters = 6 коэффициент Силуэта равен 0.370380309351
Для n_clusters = 7 коэффициент Силуэты равен 0.356303270516
Для n_clusters = 8 коэффициент Силуэта равен 0.365164535737
Для n_clusters = 9 коэффициент Силуэта равен 0.346583642095
Для n_clusters = 10 коэффициент силуэта равен 0.328266088778

Как мы видим, n_clusters = 2 имеет самый высокий коэффициент Силуэта. Это означает, что 2 должно быть оптимальным числом кластеров, правильно?

Но вот улов.

Набор данных Iris имеет 3 вида цветка, что противоречит 2 как оптимальное количество кластера. Таким образом, несмотря на то, что n_clusters = 2 с самым высоким коэффициентом Силуэт, мы рассмотрим n_clusters = 3 как оптимальное количество кластеров из-за -

  • Набор данных Iris имеет 3 вида. (наиболее важно)
  • n_clusters = 2 имеет 2-е наивысшее значение коэффициента Силуэт.

Таким образом, выбор n_clusters = 3 является оптимальным. кластера для набора диафрагмы.

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

Надеюсь, что это поможет!