Matlab中K-Means聚类的聚类指数重新排序

时间:2015-04-21 17:44:45

标签: matlab machine-learning

我正在使用K-means聚类。 它有时会创建空组,但我仍然希望该组有序。

 idx=kmeans(atranspose,m,'EmptyAction','drop');
 ids=unique(idx)
>> ids

ids =

     1
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50

我不想丢失2和20,而是从1到48订购。有可能吗?

1 个答案:

答案 0 :(得分:1)

获得唯一ID后,您可以将它们重新映射到新类。

更好的新方法

使用unique获取新的指标。

% Dummy idx data
idx = [1 1 2 2 4 4 5];

% Reindexing
[~,~,newidx] = unique( idx );

结果

>> idx
idx =
     1     1     2     2     4     4     5
>> newidx'
ans =
     1     1     2     2     3     3     4

使用非升序idx

% Dummy idx data
idx = [1 1 2 2 4 4 5];

% Reindexing
[~,~,newidx] = unique( idx );

结果

>> idx
idx =
     2     2     1     1     4     4     5
>> newidx'
ans =
     2     2     1     1     3     3     4

略长的旧方法

基本上M是将其映射到新ID的地图。新映射使用arrayfunM应用于idx并将其存储回idx

% Dummy idx data
idx = [1 1 2 2 4 4 5];

% Get unique ids
ids = unique( idx );

% Create mapping
M = containers.Map( ids, 1:length(ids) );

% Apply mapping
newidx = arrayfun( @(x) M(x), idx );

结果:

>> idx
newidx
unique( newidx )

idx =
     1     1     2     2     4     4     5
newidx =
     1     1     2     2     3     3     4
ans =
     1     2     3     4

如果idx不提升,您可以在使用sort运算符后unique。假设您有以下idx

idx = [2 2 1 1 4 4 5];

你可以sort使用:

ids = sort( unique( idx ) );

运行替换代码后,您将得到以下结果:

>>idx
newidx
unique( newidx )

idx =
     2     2     1     1     4     4     5
newidx =
     2     2     1     1     3     3     4
ans =
     1     2     3     4