1

假设我在 C++ 中有以下数字的示例分布(向量):

vector 1    vector 2   vector 3
11          4          65
128         6          66
12          4          64
13          4          62
12          5          65
14          5          63
16          7          190
60          3          210
120         4          220
126         5          242
77          6          231
14          4          210
12          7          222
13          6          260
11          8          300
14          6          233
99                     80
15                     66
13

我需要为每个向量找到一个阈值。如果它们高于该向量的阈值,我将消除每个中较大的(“坏”)数字。我想在将来重新使用这种方法来找到其他类似向量的阈值。这些数字不一定是较小的“好”数字。

理想情况下,阈值只是比大多数较小的“好”数字大一点。例如,第一个投票者的理想阈值将在 17 或 18 左右,第二个将在 8 左右,第三个将在 68-70 左右。

我意识到这可能是简单的数学,但由于我一般数学很糟糕,我真的很感激一个关于如何找到这个神奇阈值的代码示例,特别是在 C++ 或 Objective-C 中,这就是我发布这个的原因在 SO 而不是在数学网站上。

我尝试过的一些事情

float threshold = mean_of_vector;
float threshold = mean_of_vector / 1.5f;
float threshold = ((max_of_vector - min_of_vector) / 2.0f) + mean_of_vector;

这些似乎都有自己的问题,例如:有些包含太多的“好”平均数字(因此阈值太低),有些没有足够的好数字(阈值太高),或者没有足够的“坏” “数字。有时他们会使用特定的数字向量,例如,如果标准偏差很高,但在标准偏差较低的情况下则不然。

我认为该方法将涉及标准偏差和/或某种高斯分布,但我不知道如何将它们拼凑在一起以获得所需的结果。

编辑:我能够重新排序向量。

4

2 回答 2

0

您可以消除 90% 或 95% 以上的值。从技术上讲,您计算数组分布的 p = 0.9(或 0.95)百分位数。

只需对数组升序排序:

int[] data;

Arrays.sort(data); // or use ArrayList<Integer> which has Collections.sort(dataArrayList),

然后计算百分位数 p 的位置:

float p = data.length * p; // e.g p = 0.9 for 90% percentile.
// cut of fractional part.
int posInt = (int) p;

// this is the threshold value 
int threshold = data[posInt]

现在通过保持所有值 < 或 <= 阈值来过滤数组。这会保留 90% 的最小值。

int i = 0;
while (i < data.length && data[i] <= threshold) {
  // output data[i];
}

对于数学上“完美”的结果,您可以搜索“计算离散数组/值的百分位数)。我记得有两种有效的算法,描述是否必须向下舍入或向上舍入posInt。我上面的示例我只是截断了。

于 2013-01-24T18:12:04.990 回答
0

一个想法是计算平均值mu和标准偏差sigma(例如,使用“准确计算运行方差”中描述的算法)并将它们用于定义阈值。

如果您的数据被假定为高斯,您知道 97.5% 的数据应该低于mu + 2*sigma,因此这可能是一个很好的阈值。

备注:一旦拒绝了极值,您可能需要重新计算阈值,因为这些值会对均值和标准差产生重大影响。

编辑:

我刚刚使用我提出的方法计算了阈值,但您看起来并不满意:对于第一种情况,阈值约为 130(因此可能取 1.5 sigma 可能有助于消除最大的条目),对于第二种情况,阈值大约是 8,对于第三种情况,阈值大约是 262。

实际上,我对这些结果并不感到惊讶:对于您的最后一个示例,您想要删除一半以上的数据!假设数据是只有几个极值的高斯数据,这与您手头的数据相去甚远……

于 2013-01-25T07:14:06.997 回答