2012-12-10 61 views
4

我使用kmeansNxM矩陣的行進行聚類。根據唯一值頻率對矢量排序

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] 

的身份本身是任意的信息包含在分組。

回答

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 
+0

+1只是有一個建議一個NX2矩陣。你可以用'map(sortIdx)= 1:numel(sortIdx)替換第二個'sort';' - 可以更快一點。這實質上是一個逆置換。 – angainor

+0

@angainor:謝謝!這更優雅。 – Jonas

1

它可能不是有效的,但簡單的方法將是FIR st爲每個羣集確定它是多麼密集。

然後你就可以包含DensityClusterIdx

隨後一個簡單的排序會給你ClusterIdx按照正確的順序