4

NxMを使用して行列の行をクラスタリングしていますkmeans

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

次に、隣接する行が同じクラスター内にあるように、行列の行を再配置します

dataClustered = data(clustIdx,:);

ただし、クラスター分析を実行するたびに、ほぼ同じクラスターが取得されますが、IDは異なります。したがって、の構造はdataClustered各反復後に同じように見えますが、グループの順序は異なります。

クラスターIDを再配置して、クラスターIDが低いほど密なクラスターを表し、数値が高いほどスパースクラスターになるようにします。

これを行うための簡単で直感的な方法はありますか?

すなわち。変換

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

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

ID自体は任意であり、情報はグループ化に含まれています。

4

2 に答える 2

3

私が正しく理解している場合は、クラスターラベル1をポイントが最も多いクラスターに割り当て、クラスターラベル2をポイントが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
于 2012-12-10T15:43:39.643 に答える
1

効率的ではないかもしれませんが、簡単な方法は、最初に各クラスターの密度を判断することです。

Density次に、とを含むnx2行列を作成できます。ClusterIdx

その後、簡単な並べ替えClusterIdxで正しい順序になります

于 2012-12-10T15:44:14.043 に答える