k - означает кластеризироваться, метод разделения. Функциональные данные о разделах kmeans
в k, взаимоисключающие кластеры, и возвращают индекс кластера, которому это присвоило каждое наблюдение. В отличие от иерархической кластеризации, k - означает кластеризироваться, работает с фактическими наблюдениями (а не больший набор мер по несходству) и создает один уровень кластеров. Различия означают, что k - означает кластеризироваться, часто более подходит, чем иерархическая кластеризация для больших объемов данных.
kmeans
обрабатывает каждое наблюдение в ваших данных как объект, имеющий расположение на пробеле. Это находит раздел, в котором объекты в каждом кластере максимально друг близко к другу, и максимально далеки от объектов в других кластерах. Можно выбрать из пяти различных метрик расстояния, в зависимости от вида данных, которые вы кластеризируете.
Каждый кластер в разделе задан его членскими объектами и его центроидом или центром. Центроид для каждого кластера является точкой, к которой минимизирована сумма расстояний от всех объектов в том кластере. kmeans
вычисляет кластерные центроиды по-другому для каждой метрики расстояния, чтобы минимизировать сумму относительно меры, которую вы задаете.
Можно управлять деталями минимизации с помощью нескольких дополнительных входных параметров для kmeans
, включая единицы для начальных значений кластерных центроидов, и для максимального количества итераций. По умолчанию kmeans
использует k - средние значения ++ алгоритм для кластерной центральной инициализации и Евклидовой метрики в квадрате, чтобы определить расстояния.
Следующий пример исследует возможную кластеризацию в четырехмерных данных путем анализа результатов разделения точек в три, четыре, и пять кластеров.
Поскольку каждая часть этого примера генерирует случайные числа последовательно, т.е. не устанавливая новое состояние, необходимо выполнить все шаги в последовательности, чтобы копировать показанные результаты. Если вы выполните шаги из последовательности, ответы будут по существу тем же самым, но промежуточные результаты, количество итераций или упорядоченное расположение графиков контура могут отличаться.
Во-первых, загрузите некоторые данные.
rng default % For reproducibility load kmeansdata size(X)
ans = 1×2
560 4
Даже при том, что эти данные являются четырехмерными, и не могут легко визуализироваться, kmeans
позволяет вам заняться расследованиями, существует ли структура группы в них. Вызовите kmeans
с k
, желаемым количеством кластеров, равных 3
. В данном примере задайте метрику расстояния городского квартала и используйте k по умолчанию - средние значения ++ алгоритм для кластерной центральной инициализации.
idx3 = kmeans(X,3,'Distance','cityblock');
Чтобы понять то, насколько хорошо разделенный получившиеся кластеры, можно сделать график контура с помощью кластерных индексов вывод от kmeans
. График контура отображает меру того, как близко каждая точка в одном кластере к точкам в соседних кластерах. Эта мера колеблется от +1, указывая на точки, которые очень удалены от соседних кластеров, до 0, указывая на точки, которые не находятся отчетливо в одном кластере или другом, к-1, указывая на точки, которые, вероятно, присвоены неправильному кластеру. silhouette
возвращает эти значения в своем первом выводе.
figure [silh3,h] = silhouette(X,idx3,'cityblock'); h = gca; h.Children.EdgeColor = [.8 .8 1]; 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
График контура для этого решения показывает, что эти четыре кластера лучше разделяются, чем три в предыдущем решении.
figure [silh4,h] = silhouette(X,idx4,'cityblock'); h = gca; h.Children.EdgeColor = [.8 .8 1]; xlabel 'Silhouette Value' ylabel 'Cluster'
Более количественный способ сравнить эти два решения состоит в том, чтобы посмотреть на средние значения контура для этих двух случаев.
cluster3 = mean(silh3)
cluster3 = 0.5352
cluster4 = mean(silh4)
cluster4 = 0.6400
Наконец, попытайтесь кластеризировать данные с помощью пяти кластеров.
idx5 = kmeans(X,5,'Distance','cityblock','Replicates',5); figure [silh5,h] = silhouette(X,idx5,'city'); h = gca; h.Children.EdgeColor = [.8 .8 1]; xlabel 'Silhouette Value' ylabel 'Cluster'
mean(silh5)
ans = 0.5266
Этот график контура показывает, что это - вероятно, не правильное количество кластеров, поскольку два из кластеров содержат точки с в основном низкими значениями контура. Без некоторого ведома того, сколько кластеров находится действительно в данных, это - хорошая идея экспериментировать с областью значений значений для k
.
Как много других типов числовых минимизаций, решение, которого kmeans
достигает часто, зависит от отправных точек. Для kmeans
возможно достигнуть локального минимума, где переприсвоение любой точки к новому кластеру увеличило бы полную сумму расстояний точки к центроиду, но где лучшее решение действительно существует. Однако можно использовать аргумент пары "имя-значение" 'Replicates'
, чтобы преодолеть ту проблему.
Для четырех кластеров задайте пять, реплицирует, и используйте аргумент пары "имя-значение" 'Display'
, чтобы распечатать итоговую сумму расстояний для каждого из решений.
[idx4,cent4,sumdist] = kmeans(X,4,'Distance','cityblock',... 'Display','final','Replicates',5);
Replicate 1, 4 iterations, total sum of distances = 1771.1. Replicate 2, 2 iterations, total sum of distances = 1771.1. Replicate 3, 5 iterations, total sum of distances = 2303.45. Replicate 4, 4 iterations, total sum of distances = 2303.45. Replicate 5, 6 iterations, total sum of distances = 1771.1. Best total sum of distances = 1771.1
В двух из этих пяти репликаций kmeans
нашел локальный (неглобальный) минимум. Поскольку каждый из этих пяти реплицирует, начинаются с различного случайным образом выбранного набора начальных центроидов, иногда kmeans
находит больше чем один локальный минимум. Однако конечное решение, что возвраты kmeans
являются тем с самой низкой полной суммой расстояний, по всем реплицирует.
sum(sumdist)
ans = 1.7711e+03