我正在使用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订购。有可能吗?
答案 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的地图。新映射使用arrayfun
将M
应用于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