В этом разделе приводится введение в кластеризацию k-means и пример использования функции Toolbox™ статистики и машинного обучения kmeans для поиска наилучшего решения кластеризации для набора данных.
Кластеризация k-means является методом разбиения. Функция kmeans разбивает данные на k взаимоисключающих кластеров и возвращает индекс кластера, которому он назначает каждое наблюдение. kmeans рассматривает каждое наблюдение в данных как объект, имеющий местоположение в пространстве. Функция находит раздел, в котором объекты в каждом кластере находятся как можно ближе друг к другу и как можно дальше от объектов в других кластерах. Можно выбрать метрику расстояния для использования с kmeans на основе атрибутов данных. Подобно многим методам кластеризации, кластеризация k означает, что необходимо указать количество кластеров k перед кластеризацией.
В отличие от иерархической кластеризации, k-медианная кластеризация работает на фактических наблюдениях, а не на разнородности между каждой парой наблюдений в данных. Кроме того, кластеризация k-means создает один уровень кластеров, а не многоуровневую иерархию кластеров. Поэтому кластеризация k-средств часто более подходит, чем иерархическая кластеризация для больших объемов данных.
Каждый кластер в разделе k-means состоит из объектов-членов и центроида (или центра). В каждом кластере, kmeans минимизирует сумму расстояний между центроидом и всеми объектами-членами кластера. kmeans вычисляет центроидные кластеры по-разному для поддерживаемых метрик расстояния. Для получения более подробной информации см. 'Distance'.
Можно управлять подробностями минимизации с помощью аргументов пары имя-значение, доступных для kmeans; например, можно указать начальные значения центроидов кластера и максимальное количество итераций для алгоритма. По умолчанию kmeans использует алгоритм k-means + + для инициализации центроидов кластера, а квадратную метрику евклидова расстояния для определения расстояний.
При выполнении кластеризации k-means следуйте следующим передовым практикам:
Сравните k-решения кластеризации для различных значений k, чтобы определить оптимальное количество кластеров для данных.
Оцените решения кластеризации, изучив силуэтные графики и силуэтные значения. Вы также можете использовать evalclusters функция для оценки решений кластеризации на основе таких критериев, как значения разрыва, значения силуэта, значения индекса Дейвиса-Бульдина и значения индекса Калински-Харабаша.
Реплицировать кластеризацию из различных случайно выбранных центроидов и возвращать решение с наименьшей общей суммой расстояний между всеми репликациями.
В этом примере исследуется кластеризация k-means на четырехмерном наборе данных. В примере показано, как определить правильное количество кластеров для набора данных, используя силуэтные графики и значения для анализа результатов различных решений кластеризации k-means. В примере также показано, как использовать 'Replicates' аргумент пары имя-значение для проверки указанного числа возможных решений и возврата значения с наименьшей общей суммой расстояний.
Загрузить набор данных
Загрузить kmeansdata набор данных.
rng('default') % For reproducibility load('kmeansdata.mat') size(X)
ans = 1×2
560 4
Набор данных является четырехмерным и не может быть легко визуализирован. Однако kmeans позволяет исследовать наличие структуры группы в данных.
Создание кластеров и проверка разделения
Разбейте набор данных на три кластера с помощью k-means кластеризации. Укажите метрику расстояния городского блока и используйте алгоритм 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 начинает процесс кластеризации с использованием случайно выбранного набора начальных местоположений центроидов. 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