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