【问题标题】:Select numbers from array which are much greater than the rest从数组中选择比其他数字大得多的数字
【发布时间】:2012-05-08 07:00:48
【问题描述】:

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

所以,我可能有:

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

在这种情况下,我会对321654 感兴趣。

或者,我可能有:

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

在这种情况下,我会对10249069671055 感兴趣。

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

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

【问题讨论】:

  • 您似乎想要所有大于所有数字平均值的数字。

标签: matlab math numbers


【解决方案1】:

只取所有大于平均值的数字并不能一直减少它。例如,如果您只有一个更大的数字,但更多的数字彼此接近。一个大的数字不会使均值偏移太多,从而导致取的数字太多:

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)让您可以理解数字必须大于“多少”的含义。

【讨论】:

  • 这正是我所追求的。谢谢!
【解决方案2】:

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

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)) )

【讨论】:

    【解决方案3】:

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

    a = [16, 1, 1, 0, 5, 0, 32, 6, 54, 1, 2, 5, 3]
    find(a>mean(a))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 2023-03-29
      • 1970-01-01
      • 2020-01-13
      • 2020-06-20
      • 1970-01-01
      相关资源
      最近更新 更多