Агломерационная кластеризация в Matlab - PullRequest
7 голосов
/ 05 ноября 2011

У меня есть простой 2-мерный набор данных, который я хочу агломерировать (не зная оптимального количества кластеров для использования). Единственный способ, которым я смог успешно кластеризовать свои данные, это присвоить функции значение 'maxclust'.

Для простоты, скажем, это мой набор данных:

X=[ 1,1;
    1,2;
    2,2;
    2,1;
    5,4;
    5,5;
    6,5;
    6,4 ];

Естественно, я бы хотел, чтобы эти данные образовали 2 кластера. Я понимаю, что если бы я знал это, я мог бы просто сказать:

T = clusterdata(X,'maxclust',2);

и найти точки, попадающие в каждую группу, я могу сказать:

cluster_1 = X(T==1, :);

и

cluster_2 = X(T==2, :);

но не зная, что 2 кластера будут оптимальными для этого набора данных, как мне кластеризовать эти данные?

Спасибо

Ответы [ 2 ]

7 голосов
/ 05 ноября 2011

Весь смысл этого метода в том, что он представляет кластеры, найденные в иерархии, и вам решать, сколько деталей вы хотите получить ..

agglomerative dendogram

Думайте об этом как о наличии горизонтальной линии, пересекающей дендрограмму, которая перемещается, начиная с 0 (каждая точка является собственным кластером) вплоть до максимального значения (все точки в одном кластере).Вы можете:

  • останавливаться при достижении заранее определенного количества кластеров ( пример )
  • вручную расположить его, задав определенное значение высоты ( пример *)1015 *)
  • выберите место, где кластеры находятся слишком далеко друг от друга в соответствии с критерием расстояния (т. Е. Есть большой переход на следующий уровень) ( пример )

Это можно сделать с помощью аргументов 'maxclust' или 'cutoff' функций CLUSTER / CLUSTERDATA

6 голосов
/ 05 ноября 2011

Чтобы выбрать оптимальное количество кластеров, одним из распространенных подходов является создание графика, похожего на график Scree.Затем вы ищите «колено» на графике, и это количество кластеров, которые вы выбираете.Для критерия здесь мы будем использовать сумму квадратов внутри кластера:

function wss = plotScree(X, n)

wss = zeros(1, n);
wss(1) = (size(X, 1)-1) * sum(var(X, [], 1));
for i=2:n
    T = clusterdata(X,'maxclust',i);
    wss(i) = sum((grpstats(T, T, 'numel')-1) .* sum(grpstats(X, T, 'var'), 2));
end
hold on
plot(wss)
plot(wss, '.')
xlabel('Number of clusters')
ylabel('Within-cluster sum-of-squares')
>> plotScree(X, 5)

ans =

   54.0000    4.0000    3.3333    2.5000    2.0000

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...