我正在使用NxM
对kmeans
矩阵的行进行聚类。
clustIdx = kmeans(data, N_CLUST, 'EmptyAction', 'drop');
然后我重新排列矩阵的行,使相邻的行在同一个簇中
dataClustered = data(clustIdx,:);
然而,每次运行聚类分析时,我都会得到或多或少相同的聚类但具有不同的身份。因此,dataClustered
中的结构在每次迭代后看起来都是相同的,但这些组的顺序不同。
我想重新安排我的群集标识,以便较低的群集标识代表密集群集,较高的数字代表稀疏群集。
有一种简单和/或直观的方法吗?
即。转换
clustIdx = [1 2 3 2 3 2 4 4 4 4];
到
clustIdx = [4 2 3 2 3 2 1 1 1 1]
身份本身是任意的,信息包含在分组中。
答案 0 :(得分:3)
如果我理解正确,您希望将群集标签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
答案 1 :(得分:1)
它可能效率不高,但最简单的方法是首先确定每个群集的密集程度。
然后你可以创建一个包含Density
和ClusterIdx
之后,一个简单的排序将以正确的顺序为您提供ClusterIdx