如何有效地识别两组数字之间的自然分界点


How can I efficiently identify the a natural division point between two sets of numbers?

我有两个数据集(A&B)。它们每个都有1000个数字。

99%的时间:A<5<=B

然而,1%的时间B<5<A.

如果分割点是未知的——x——如何用任何给定的数据集来确定x

显然,Max(A)Min(B)具有误导性。我不想在整个范围内循环(甚至只是在Min(B)和Max(A)之间)猜测和识别最大可能的分界点。

Sample Dataset
A 1
A 1
A 1
A 2
B 2 <--anomoly
A 3
A 3
A 3
A 4
A 5 <--anomoly
B 5 <--division, or `x`
B 5
B 5
B 5
A 6 <--anomoly
B 7
B 8
B 8
B 8
B 9
B 9
B 10
B 10

假设存在另一对数据集(C&D)。在允许一定的异常阈值后,我如何找到C变为D的点。

你推荐什么?

这是一个粗略的"猜测"策略。我想在没有"猜测"循环的情况下得到同样的结果。

$maxProbable = 0;
$pointOfDivision = 0;
for ($i = Min($b); $i <= Max($a); $i++) {
    // get probability $i is in_array($a)
    $countBelow = below($i,$a); // assume function returns count of $a items below $i
    $countAbove = above($i,$b); // assume function returns count of $b items above $i
    $probBelow = $countBelow/count($a);
    $probAbove = $countAbove/count($b);
    if (($probBelow+$probAbove) > $maxProbable) {
        $maxProbable = $probBelow+$probAbove;
        $pointOfDivision = $i;
    }
}
echo $pointOfDivision;

这是统计学和机器学习中的一个众所周知的问题:给定多个标记的数据点,确定新数据点最有可能的标签。在1D的情况下,它通常归结为确定阈值x,并说"任何低于x的东西都有标签a"answers"任何高于x的东西有标签B"。

有很多算法:例如,可以使用逻辑回归、神经网络或支持向量机。算法的选择取决于数据的假设以及可用的工具和库;例如SVM很难自己实现。

如果你告诉我们数据是如何生成的,或者它来自一个众所周知的统计分布,那么可能有一条捷径可以找到一个不那么复杂但仍然足够的解决方案。