2

对不起,标题很长,但总结一下。

我正在寻找以计算效率最高的方式在数组中找到最大相似值簇的中值。

例如:

H = [99,100,101,102,103,180,181,182,5,250,17]

我会找101的。

数组没有排序,我只是按照上面的顺序打出来的,方便理解。该数组的长度是恒定的,您始终可以假设至少会有一组相似的值。

到目前为止,我一直在做的基本上是计算标准偏差,其中一个值被删除,并找到与 STD 最大减少相对应的值,并对数组中的元素数量重复该值,这是非常低效的。

for j = 1:7
    G = double(H);

    for i = 1:7   
        G(i) = NaN;
        T(i) = nanstd(G);
    end

    best = find(T==min(T));
    H(best) = NaN;

end

x = find(H==max(H));

有什么想法吗?

4

1 回答 1

1

这种可能性将您的数据分箱并查找包含大多数元素的箱。如果您的发行版由分离良好的集群组成,那么这应该可以很好地工作。

H = [99,100,101,102,103,180,181,182,5,250,17];

nbins = length(H);        % <-- set # of bins here
[v bins]=hist(H,nbins);
[vm im]=max(v);           % find max in histogram
bl = bins(2)-bins(1);     % bin size
bm = bins(im);            % position of bin with max #
ifb =find(abs(H-bm)<bl/2)   % elements within bin 
median(H(ifb))              % average over those elements in bin

输出:

ifb =     1     2     3     4     5
H(ifb) =    99   100   101   102   103
median =   101

要设置的更具挑战性的参数是箱的数量和查看人口最多的箱的区域大小。在您提供的示例中,这些都不是那么重要,您可以将箱数设置为3(而不是length(H)),它仍然可以工作。使用length(H)垃圾箱的数量实际上有点极端,可能不是一个好的一般选择。更好的选择是介于该数量和预期的集群数量之间。

bl将表达式中的某些分布更改find为您提前判断更好的值可能会有所帮助。

我还应该注意,有些聚类方法 ( kmeans) 可能效果更好,但效率可能较低。例如,这是的输出[H' kmeans(H',4) ]

    99     2
   100     2
   101     2
   102     2
   103     2
   180     3
   181     3
   182     3
     5     4
   250     3
    17     1

在这种情况下,我提前决定尝试分组为 4 个集群。使用kmeans可以得到如下答案:

nbin = 4;
km = kmeans(H',nbin);
[mv iv]=max(histc(km,[1:nbin]));
H(km==km(iv))
median(H(km==km(iv)))

但是请注意,kmeans它不一定在每次运行时都返回相同的值,因此您可能需要对几次迭代进行平均。

我对这两种方法进行了计时,发现kmeans需要大约 10 倍的时间。但是,它更健壮,因为 bin 大小可以适应您的问题,并且不需要预先设置(只有 bin 的数量)。

于 2013-08-09T20:52:53.007 回答