Сортировка вектора на основе уникальной частоты значений

Я группирую строки матрицы NxM, используя kmeans.

clustIdx = kmeans(data, N_CLUST, 'EmptyAction', 'drop');

Затем я перестраиваю строки моей матрицы так, чтобы соседние строки находились в одном кластере.

dataClustered = data(clustIdx,:);

Однако каждый раз, когда я запускаю кластерный анализ, я получаю более или менее одни и те же кластеры, но с разными идентификаторами. Таким образом, структура в dataClustered выглядит одинаково после каждой итерации, но группы находятся в разном порядке.

Я хотел бы переупорядочить идентификаторы кластеров таким образом, чтобы более низкие идентификаторы кластеров представляли плотные кластеры, а более высокие числа - разреженные кластеры.

Есть ли простой и/или интуитивно понятный способ сделать это?

т.е. Перерабатывать

clustIdx = [1 2 3 2 3 2 4 4 4 4];

to

clustIdx = [4 2 3 2 3 2 1 1 1 1]

Сами тождества произвольны, информация содержится в группировке.


person slayton    schedule 10.12.2012    source источник


Ответы (2)


Если я правильно понимаю, вы хотите присвоить метку кластера 1 кластеру с наибольшим количеством баллов, метку кластера 2 кластеру со вторым по количеству точек и т. д.

Предположим, у вас есть массив меток кластера с именем idx.

>> idx = [1 1 2 2 2 2 3 3 3]';

Теперь вы можете переименовать idx следующим образом:

%# count the number of occurrences
cts = hist(idx,1:max(idx));

%# sort the counts - now we know that 1 should be last
[~,sortIdx] = sort(cts,'descend')
sortIdx =
     2     3     1

%# create a mapping vector (thanks @angainor)
map(sortIdx) = 1:length(sortIdx);
map =
     3     1     2

%# and remap indices
map(idx)
ans =
     3     3     1     1     1     1     2     2     2
person Jonas    schedule 10.12.2012
comment
+1 Просто есть одно предложение. Вы можете заменить второй sort на map(sortIdx) = 1:numel(sortIdx); - может быть немного быстрее. По сути, это обратная перестановка. - person angainor; 10.12.2012

Это может быть неэффективно, но проще всего было бы сначала определить плотность каждого кластера.

Затем вы можете создать матрицу nx2, содержащую Density и ClusterIdx.

После этого простая сортировка даст вам ClusterIdx в правильном порядке.

person Dennis Jaheruddin    schedule 10.12.2012