根据唯一值频率对矢量进行排序

时间:2012-12-10 15:32:48

标签: matlab sorting cluster-analysis

我正在使用NxMkmeans矩阵的行进行聚类。

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]

身份本身是任意的,信息包含在分组中。

2 个答案:

答案 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)

它可能效率不高,但最简单的方法是首先确定每个群集的密集程度。

然后你可以创建一个包含DensityClusterIdx

的nx2矩阵

之后,一个简单的排序将以正确的顺序为您提供ClusterIdx