【问题标题】:Sort a vector based upon the unique value frequency根据唯一值频率对向量进行排序
【发布时间】:2012-11-28 01:07:34
【问题描述】:

我正在使用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]

身份本身是任意的,信息包含在分组中。

【问题讨论】:

    标签: matlab sorting cluster-analysis


    【解决方案1】:

    如果我理解正确,您想将聚类标签 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
    

    【讨论】:

    • +1 只要有一个建议。您可以用map(sortIdx) = 1:numel(sortIdx); 替换第二个sort - 可能会快一点。这本质上是一个逆排列。
    【解决方案2】:

    这可能效率不高,但简单的方法是首先确定每个集群的密集程度。

    然后你可以制作一个包含DensityClusterIdx的nx2矩阵

    然后简单的排序会以正确的顺序为您提供ClusterIdx

    【讨论】:

      猜你喜欢
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2012-07-05
      • 2011-10-09
      • 2011-01-23
      • 2010-12-06
      相关资源
      最近更新 更多