k -Means кластеризация

В этой теме приводится введение в кластеризацию k-means и пример, который использует функцию Statistics and Machine Learning Toolbox™kmeans для поиска оптимального решения кластеризации для набора данных.

Введение в кластеризацию k-Means

k -means clustering является методом разбиения. Функцияkmeans разделяет данные на k взаимоисключающие кластеры и возвращает индекс кластера, которому оно присваивает каждое наблюдение. kmeans рассматривает каждое наблюдение в данных как объект, который имеет место в пространстве. Функция находит раздел, в котором объекты внутри каждого кластера максимально близки друг к другу и максимально далеки от объектов в других кластерах. Можно выбрать метрику расстояния для использования с kmeans на основе атрибутов ваших данных. Как и многие методы кластеризации, k-means кластеризация требует, чтобы вы задали количество кластеров, k перед кластеризацией.

В отличие от иерархической кластеризации, кластеризация k-means работает на фактических наблюдениях, а не на неоднородности между каждой парой наблюдений в данных. Кроме того, кластеризация k-means создает один уровень кластеров, а не многоуровневую иерархию кластеров. Поэтому кластеризация k-means часто более подходит, чем иерархическая кластеризация для больших объемов данных.

Каждый кластер в разделе k-means состоит из объектов-членов и центроида (или центра). В каждом кластере ,kmeans минимизирует сумму расстояний между центроидом и всеми представителями объектов кластера. kmeans вычисляет центроидные кластеры по-разному для поддерживаемых метрик расстояния. Для получения дополнительной информации смотрите 'Distance'.

Вы можете управлять деталями минимизации, используя аргументы пары "имя-значение", доступные kmeans; для примера можно задать начальные значения центроидов кластера и максимальное количество итераций для алгоритма. По умолчанию, kmeans использует k -means + + алгоритм, чтобы инициализировать центроиды кластера, и квадратную метрику Евклидова расстояния, чтобы определить расстояния.

При выполнении кластеризации k-means следуйте следующим лучшим практикам:

  • Сравните решения k кластеризации для различных значений k, чтобы определить оптимальное количество кластеров для ваших данных.

  • Оцените решения кластеризации путем исследования силуэтных графиков и значений силуэтов. Вы также можете использовать evalclusters функция для оценки решений кластеризации на основе таких критериев, как значения погрешностей, значения силуэта, значения индекса Дэвиса-Буддина и значения индекса Калински-Харабаша.

  • Реплицируйте кластеризацию из различных случайным образом выбранных центроидов и возвращайте решение с самой низкой общей суммой расстояний среди всех репликатов.

Сравнение решений для кластеризации k-средних значений

Этот пример исследует k-средних значений кластеризацию на четырехмерном наборе данных. Пример показов, как определить правильное количество кластеров для набора данных с помощью силуэтных графиков и значений для анализа результатов различных решений кластеризации k-средних значений. Пример также показывает, как использовать 'Replicates' аргумент пары "имя-значение" для тестирования заданного количества возможных решений и возврата аргумента с наименьшей общей суммой расстояний.

Загрузка набора данных

Загрузите kmeansdata набор данных.

rng('default')  % For reproducibility
load('kmeansdata.mat')
size(X)
ans = 1×2

   560     4

Набор данных является четырехмерным и не может быть визуализирован легко. Однако kmeans позволяет выяснить, существует ли в данных структура группы.

Создайте кластеры и исследуйте разделение

Разделите набор данных на три кластера с помощью k-средних значений. Задайте метрику расстояния блока города и используйте алгоритм k-means + + по умолчанию для инициализации центра кластера. Используйте 'Display' аргумент пары "имя-значение" для печати окончательной суммы расстояний для решения.

[idx3,C,sumdist3] = kmeans(X,3,'Distance','cityblock','Display','final');
Replicate 1, 7 iterations, total sum of distances = 2459.98.
Best total sum of distances = 2459.98

idx3 содержит индексы кластеров, которые указывают назначение кластеров для каждой строки в X. Чтобы увидеть, хорошо ли разделены получившиеся кластеры, можно создать силуэтный график.

График силуэта отображает меру того, насколько близко каждая точка в одном кластере к точкам в соседних кластерах. Эта мера варьируется от 1 (что указывает на точки, которые очень удалены от соседних кластеров) до 0 (точки, которые не отличаются в том или ином кластере) до -1 (точки, которые, вероятно, назначены неправильному кластеру). silhouette возвращает эти значения в своем первом выходе.

Создайте силуэтный график из idx3. Задайте 'cityblock' для метрики расстояния, чтобы указать, что k-средних значений кластеризация основана на сумме абсолютных различий.

[silh3,h] = silhouette(X,idx3,'cityblock');
xlabel('Silhouette Value')
ylabel('Cluster')

Figure contains an axes. The axes contains an object of type bar.

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

Чтобы увидеть, kmeans может найти лучшую группировку данных, увеличить количество кластеров до четырех. Печать информации о каждой итерации при помощи 'Display' аргумент пары "имя-значение".

idx4 = kmeans(X,4,'Distance','cityblock','Display','iter');
  iter	 phase	     num	         sum
     1	     1	     560	     1792.72
     2	     1	       6	      1771.1
Best total sum of distances = 1771.1

Создать график силуэта для четырех кластеров.

[silh4,h] = silhouette(X,idx4,'cityblock');
xlabel('Silhouette Value')
ylabel('Cluster')

Figure contains an axes. The axes contains an object of type bar.

График силуэта указывает, что эти четыре кластера лучше разделены, чем три кластера в предыдущем решении. Можно использовать более количественный подход к сравнению двух решений путем вычисления средних значений силуэта для этих двух случаев.

Вычислите средние значения силуэта.

cluster3 = mean(silh3)
cluster3 = 0.5352
cluster4 = mean(silh4)
cluster4 = 0.6400

Среднее значение силуэта четырех кластеров выше среднего значения трех кластеров. Эти значения подтверждают вывод, представленный на силуэтных графиках.

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

idx5 = kmeans(X,5,'Distance','cityblock','Display','final');
Replicate 1, 7 iterations, total sum of distances = 1647.26.
Best total sum of distances = 1647.26
[silh5,h] = silhouette(X,idx5,'cityblock');
xlabel('Silhouette Value')
ylabel('Cluster')

Figure contains an axes. The axes contains an object of type bar.

mean(silh5)
ans = 0.5721

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

Обратите внимание, что сумма расстояний уменьшается, когда количество кластеров увеличивается. Для примера сумма расстояний уменьшается от 2459.98 на 1771.1 на 1647.26 когда количество кластеров увеличивается с 3 до 4 до 5. Поэтому сумма расстояний не полезна для определения оптимального количества кластеров.

Избегайте локальных минимумов

По умолчанию kmeans запускает процесс кластеризации с помощью случайным образом выбранного набора начальных местоположений центроида. The kmeans алгоритм может сходиться к решению, которое является локальным (ненглобальным) минимумом; то есть kmeans может разбить данные так, что перемещение любой одной точки в другой кластер увеличивает общую сумму расстояний. Однако, как и во многих других типах числовых минимизаций, решение, которое kmeans достигает иногда зависит от начальных точек. Поэтому для данных могут существовать другие решения (локальные минимумы), которые имеют меньшие общие суммы расстояний. Можно использовать 'Replicates' аргумент пары "имя-значение" для тестирования различных решений. Когда вы задаете несколько репликаций, kmeans повторяет процесс кластеризации, начиная с различных случайным образом выбранных центроидов для каждого повторения, и возвращает решение с самой низкой общей суммой расстояний среди всех повторений.

Найдите четыре кластера в данных и повторите кластеризацию пять раз. Кроме того, задайте метрику расстояния блока города и используйте 'Display' аргумент пары "имя-значение" для печати окончательной суммы расстояний для каждого решения.

[idx4,cent4,sumdist] = kmeans(X,4,'Distance','cityblock', ...
                       'Display','final','Replicates',5);               
Replicate 1, 2 iterations, total sum of distances = 1771.1.
Replicate 2, 3 iterations, total sum of distances = 1771.1.
Replicate 3, 3 iterations, total sum of distances = 1771.1.
Replicate 4, 6 iterations, total sum of distances = 2300.23.
Replicate 5, 2 iterations, total sum of distances = 1771.1.
Best total sum of distances = 1771.1

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

Найдите общую сумму в кластере расстояний от точки до центроида для окончательного решения, возвращенного kmeans.

sum(sumdist)
ans = 1.7711e+03

См. также

|

Похожие темы