3

假设有一个由 n 个元素组成的数组,并且在 n 个元素中,有一些数字比其他的大得多。

所以,我可能有:

16, 1, 1, 0, 5, 0, 32, 6, 54, 1, 2, 5, 3

32在这种情况下,我会对 和16感兴趣54

或者,我可能有:

32, 105, 26, 5, 1, 82, 906, 58, 22, 88, 967, 1024, 1055 

在这种情况下,我会对1024、和感兴趣。9069671055

我正在尝试编写一个函数来提取感兴趣的数字。问题是我无法定义一个阈值来确定什么是“更大”,而且我不能只告诉它获得x最大的数字,因为这两者都会根据调用函数的对象而有所不同。

我有点卡住了。有谁知道如何攻击这个?

4

3 回答 3

3

仅仅取所有大于平均值的数字并不能一直减少它。例如,如果您只有一个更大的数字,但更多的数字彼此接近。一个大的数字不会使均值发生很大的变化,这会导致取太多的数字:

data = [ones(1,10) 2*ones(1,10) 10];
data(data>mean(data))

ans =

      2     2     2     2     2     2     2     2     2     2    10

如果你看看数字之间的差异,这个问题就解决了:

>> data = [16, 1, 1, 0, 5, 0, 32, 6, 54, 1, 2, 5, 3];
sorted_data = sort(data);
dd = diff(sorted_data);
mean_dd = mean(dd);
ii = find(dd> 2*mean_dd,1,'first');
large_numbers = sorted_data(ii:end);

large_numbers =

   6    16    32    54

阈值(在本例中为 2)让您可以理解数字必须大于“多少”的含义。

于 2012-05-08T07:06:34.143 回答
3

如果是我,我会使用更多的统计洞察力,这将为将来的代码提供最大的灵活性。

x           = [1 2 3 2 2 1 4 6 15 83 2 4 22  81 0  8 7 7 7 3 1 2 3]
EpicNumbers = x( x>(mean(x) + std(x)) )

然后,您可以增加或减少标准偏差的数量以扩大或收紧您的阈值。

LessEpicNumbers = x( x>(mean(x) + 2*std(x)) )
MoreEpicNumbers = x( x>(mean(x) + 0.5*std(x)) )
于 2012-05-08T18:52:52.243 回答
0

一个简单的解决方案是使用 find 和基于平均值(或其倍数)的阈值:

a = [16, 1, 1, 0, 5, 0, 32, 6, 54, 1, 2, 5, 3]
find(a>mean(a))
于 2012-05-08T07:07:03.053 回答