我在使用K-means聚类算法。有时会生成空的组,但我希望这些组的编号是连续的。
idx=kmeans(atranspose,m,'EmptyAction','drop'); ids=unique(idx)>> idsids = 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连续排列。这是可能的吗?
回答:
一旦你获得了唯一的ID,你可以将它们重新映射到新的类别中。
更好的新方法
使用unique
来获取新的索引。
% 虚拟的idx数据idx = [1 1 2 2 4 4 5];% 重新索引[~,~,newidx] = unique( idx );
结果
>> idxidx = 1 1 2 2 4 4 5>> newidx'ans = 1 1 2 2 3 3 4
对于非升序的idx
% 虚拟的idx数据idx = [1 1 2 2 4 4 5];% 重新索引[~,~,newidx] = unique( idx );
结果
>> idxidx = 2 2 1 1 4 4 5>> newidx'ans = 2 2 1 1 3 3 4
稍微长一些的旧方法
本质上,M
是将旧ID映射到新ID的映射。新的映射使用arrayfun
将M
应用到idx
上,并将结果存储回idx
中。
% 虚拟的idx数据idx = [1 1 2 2 4 4 5];% 获取唯一的idsids = unique( idx );% 创建映射M = containers.Map( ids, 1:length(ids) );% 应用映射newidx = arrayfun( @(x) M(x), idx );
结果:
>> idxnewidxunique( newidx )idx = 1 1 2 2 4 4 5newidx = 1 1 2 2 3 3 4ans = 1 2 3 4
如果idx
是非升序的,你可以在使用unique
操作符后使用sort
。假设你有以下idx
。
idx = [2 2 1 1 4 4 5];
你可以使用以下方式进行sort
:
ids = sort( unique( idx ) );
运行替换后的代码后,你会得到以下结果:
>>idxnewidxunique( newidx )idx = 2 2 1 1 4 4 5newidx = 2 2 1 1 3 3 4ans = 1 2 3 4