查找数字组平均值的算法

时间:2011-04-03 15:42:57

标签: algorithm

我有一个非常小的数字列表(最多几百个),比如这个:

  

117 99 91 93 95 95 91 97 89 99 89 99   91 95 89 99 89 99 89 95 95 95 89 948   189 99 89 189 189 95 186 95 93 189 95   189 89 193 189 93 91 193 89 193 185 95   89 194 185 99 89 189 95 189 189 95 89   189 189 95 189 95 89 193 101 180 189   95 89 195 185 95 89 193 89 193 185 99   185 95 189 95 89 193 91 190 94 190 185   99 89 189 95 189 189 95 185 95 185 99   89 189 95 189 186 99 89 189 191 95 185   99 89 189 189 96 89 193 189 95 185 95   89 193 95 189 185 95 93 189 189 95 186   97 185 95 189 95 185 99 185 95 185 99   185 95 190 95 185 95 95 189 185 95 189   2451

如果你创建一个图表,其中X =数字,Y =我们看到数字的次数,我们会有这样的事情: Distribution

我想知道的是每组数字的平均数。在示例中,有4个组,结果数字是 92,187,948和2451

未知数量组数。

您是否知道如何创建(如果可能的话简单)算法确实提取这些结果数字(如果可能的话,用c或伪代码或英语:)

5 个答案:

答案 0 :(得分:4)

您要做的是称为群集。如果您显示的数据是典型的,那么gready方法(例如neighbor joining)就足够了。所以程序是:

1) Apply neighbor joining
2) Apply an (empirically identified) threshold to define the clusters
3) Calculate average of each cluster

使用已经具有聚类算法的软件包(例如R)可能是最简单的方法,尽管邻居加入不是特别难的算法。

答案 1 :(得分:0)

我认为std::map<int,int>可以轻松解决这个问题。地图的将是数字,将是数字出现的次数/频率。

所以平均值可以计算为,

int average = (m[key] * key) / count;

其中count是总数,因此它会计算所有数字中每个组的平均值,因为您没有清楚地提到平均值的含义。我还假设每个不同的数字形成自己的组!

答案 2 :(得分:0)

这是一种方式:

  1. 决定你的垃圾箱的宽度。假设10(即例如数字&gt; -5和&lt; = 5进入bin 0,数字&gt; 5和&lt; = 15进入bin 1,......)。
  2. 创建一个列表,其中包含每个bin中数字的列表。我会在C ++中使用类似map<unsigned int, vector<unsigned int> * >的内容。
  3. 现在迭代数字,确定它们属于哪个bin。检查地图中是否已存在此bin的向量,如果没有创建一个。将数字添加到矢量。
  4. 迭代完所有数字后,只需计算每个向量的平均值。

答案 3 :(得分:0)

所以你在图中寻找“尖峰”。我猜你对每个小组的人数和职位感兴趣吗?

您可以使用以下内容:

Sort the numbers
Loop:
  Take the highest number you have 
  Investigate more numbers until you find a number that is too small to belong to the group (maybe 5% smaller)
  Calculate the average of the selected numbers 
  Let the discarded number be the last number
End loop

答案 4 :(得分:0)

在PHP中你可以这样做:

$array = array(//an array of numbers);

$average = array_sum($array) / count($array);

使用多组数字,您可以执行以下操作:

$array = array(
               array(array of numbers, group1),
               array(array of numbers, group2),
               //etc.
              );

foreach($array as $numbers)
{
     $average[] = array_sum($numbers) / count($numbers);
}

除非您正在寻找中位数或模式。

啊,我看到你现在问的是什么,你不是在问如何找到平均值,而是询问如何将数字分组并找出每组的平均值。

让我们看看,你必须找到模式,$counts = array_count_values($array)); array_keys(max($counts));会这样做,$counts中的键将是原始数组的值,其值为$counts是每个数字出现的次数。然后你需要找出$counts中键中较大间隙的位置。您还可以array_unique()数组原始数组并找到值中的间隙。

希望我的统计老师比我们玩扑克更多,或者我可能想出确切的统计方法来确定检查范围的大小以确定群组应该是什么。