我有一个非常小的数字列表(最多几百个),比如这个:
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 =我们看到数字的次数,我们会有这样的事情:
我想知道的是每组数字的平均数。在示例中,有4个组,结果数字是 92,187,948和2451
未知数量组数。
您是否知道如何创建(如果可能的话简单)算法确实提取这些结果数字(如果可能的话,用c或伪代码或英语:)
答案 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)
这是一种方式:
map<unsigned int, vector<unsigned int> * >
的内容。答案 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()
数组原始数组并找到值中的间隙。
希望我的统计老师比我们玩扑克更多,或者我可能想出确切的统计方法来确定检查范围的大小以确定群组应该是什么。