Агломеративная кластеризация в Matlab

у меня есть простой 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 ответов


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

agglomerativedendogram

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

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

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


чтобы выбрать оптимальное количество кластеров, один общий подход-сделать участок похожим на участок осыпи. Затем вы ищете "локоть" в сюжете, и это количество кластеров, которые вы выбираете. Для критерия здесь мы будем использовать сумму квадратов внутри кластера:

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