Кластеризация данных трехмерного разброса с использованием кластеризации k-средних в Matlab

У меня есть трехмерный график рассеяния, организованный в виде массива. Когда я рисую свои данные в виде трехмерной диаграммы рассеяния, я получаю 2 четких кластера - один меньшего размера слева и один большой справа. введите описание изображения здесь

Я пробовал кластеризацию k-средних, но я получил эти 2 кластера вместо двух, которые хотел: введите описание изображения здесь

Вот мой код:

opts = statset('Display','final');
[idx,C] = kmeans(data,2,'Distance','cityblock',...'Replicates',5,'Options',opts);
figure;
plot3(data(idx==1,1),data(idx==1,2),data(idx==1,3),'r.','MarkerSize',12)
plot3(data(idx==2,1),data(idx==2,2),data(idx==2,3),'b.','MarkerSize',12)
plot3(C(:,1),C(:,2),C(:,3),'cx',...'MarkerSize',15,'LineWidth',3)
legend('Cluster 1','Cluster 2','Centroids',...'Location','NW')
title 'Cluster Assignments and Centroids'
hold off

Как изменить свой код так, чтобы я получил 2 кластера (один маленький слева, один большой справа) вместо кластера вверх-вниз, который у меня есть прямо сейчас? Огромное спасибо!


person Anonymous    schedule 17.07.2017    source источник
comment
Есть ли опечатка при построении центроидов plot против plot3?   -  person mpaskov    schedule 17.07.2017
comment
Нет, я так не думаю .. потому что plot3 используется для 3 аргументов, но есть только 2 аргумента центроида.   -  person Anonymous    schedule 17.07.2017
comment
У вас должно получиться 2 центроида, каждый из которых является трехмерным, иначе что-то очень не так.   -  person mpaskov    schedule 17.07.2017
comment
Да, как показано на графике выше, я получил 2 центроида. Однако он не сгруппировался так, как я надеялся, разделившись слева направо. Вместо этого он разделился вверх и вниз. Мне интересно, как я могу исправить свой код, чтобы я мог кластеризовать его так, как я хочу?   -  person Anonymous    schedule 18.07.2017
comment
Я понимаю вопрос. Не могли бы вы указать значения ваших центроидов? Причина, по которой я спрашиваю, состоит в том, что они могли быть просто неправильно построены.   -  person mpaskov    schedule 18.07.2017
comment
Просто добавил координаты центроидов в свой вопрос! Спасибо!   -  person Anonymous    schedule 18.07.2017
comment
Это должно сказать вам, что что-то не так, 3 трехмерных вектора, как бы вы на них ни смотрели. Трудно сказать, какое измерение есть какое, но строки 1 и 3 мне кажутся интересными, строка 2 кажется третьим центроидом где-то посередине.   -  person mpaskov    schedule 18.07.2017
comment
Привет, спасибо за это наблюдение. Как бы вы посоветовали исправить мой код? Я новичок в кластеризации k-средних. Большое спасибо!   -  person Anonymous    schedule 18.07.2017
comment
Проблема в том, что k-means ожидает, что кластеры будут примерно одинакового размера. Здесь дело обстоит не так. Существуют и другие методы кластеризации, которые не делают таких предположений.   -  person Cris Luengo    schedule 02.11.2018


Ответы (2)


Измените на plot3 и добавьте C (:, 3), это сработало для меня:

data=rand(100,3);
data=[data;2+rand(50,3)];

opts = statset('Display','final');
[idx,C] = kmeans(data,2,'Distance','cityblock','Replicates',5,'Options',opts);
figure(1);cla;gca;hold on;
plot3(data(idx==1,1),data(idx==1,2),data(idx==1,3),'r.','MarkerSize',12)
plot3(data(idx==2,1),data(idx==2,2),data(idx==2,3),'b.','MarkerSize',12)
plot3(C(:,1),C(:,2),C(:,3),'cx','MarkerSize',15,'LineWidth',3)
legend('Cluster 1','Cluster 2','Centroids','Location','NW')
title('Cluster Assignments and Centroids');
hold off
person Mendi Barel    schedule 18.07.2017
comment
Привет, большое спасибо за помощь в построении центроидов - это делает график центроидов лучше. Однако он по-прежнему группируется вверх и вниз (он разбивает диаграмму рассеяния вверх и вниз) вместо того, чтобы кластеризовать левый кластер как один цвет, а правый кластер как другой. Мне интересно, могу ли я изменить кластеры вверх / вниз влево / вправо, если это имеет смысл. Спасибо! - person Anonymous; 18.07.2017
comment
Алгоритм не знает «вверх» «вниз», он знает только расстояния между точками в N-измерениях (3 в вашем случае). Как упоминалось ранее, вы можете попробовать другую метрику расстояния или, если вы можете попробовать разные начальные точки 'Start','sample'. Если вы знаете грубые места, вы даже можете их указать. Подробнее об этом можно прочитать в документации k-means. - person mpaskov; 18.07.2017
comment
Я понимаю, что вы имеете в виду ... есть ли у вас какие-либо предложения, как мне изменить мои k-средства, чтобы получить нужные мне левые / правые кластеры? Еще раз спасибо. - person Anonymous; 18.07.2017
comment
Попробуйте другую функцию расстояния в: ('Distance', 'cityblock') - person Mendi Barel; 19.07.2017

Преобразуйте данные слева-направо * 10, чтобы добавить вес переменной, это должно привести к разделению кластера, которое вы планировали.

person user10592680    schedule 01.11.2018