В этой теме приводится введение в кластеризацию k-means и пример, который использует функцию Statistics and Machine Learning Toolbox™kmeans
для поиска оптимального решения кластеризации для набора данных.
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-средних значений. Пример также показывает, как использовать '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')
График силуэта показывает, что большинство точек во втором кластере имеют большое значение силуэта (больше 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')
График силуэта указывает, что эти четыре кластера лучше разделены, чем три кластера в предыдущем решении. Можно использовать более количественный подход к сравнению двух решений путем вычисления средних значений силуэта для этих двух случаев.
Вычислите средние значения силуэта.
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')
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