想象一下,你有两个具有相同数量的箱子的直方图。 N个观测值分布在箱子中。每个箱现在有0到N个观测值。
哪种算法适合确定要从两个直方图中删除的最小观察数以使它们成比例?它们的绝对数量不必相等,只相互成比例。也就是说,必须存在一个共同因子,通过该因子可以将一个直方图中的所有二进制数相乘,以使其等于另一个直方图。
例如,设想以下两个直方图,其中每个直方图中的项目i指的是相应直方图的bin i中的观察数量。
直方图1:4,7,4,9 直方图2:2,0,2,1
对于这些直方图,解决方案是从直方图1中删除bin 2中的所有7个观察值,并从bin 4中删除另外7个观察值,这样(直方图1)* 2 =直方图2.
但是,可以使用哪种通用算法来查找两个直方图的子集,这些子集最大化了它们之间的总观察次数,同时使它们成比例?您可以从直方图中删除观察值,也可以只删除一个。
谢谢!
答案 0 :(得分:0)
对我来说,问题是等价的(如果你把每个直方图看作一个N维向量),最小化曼哈顿长度| R |,其中R = xA-B,A和B是你的'向量'和x是你的比例尺。
| R |有一个最小值(不一定是整数),因此您可以使用简单的二分算法(或类似于牛顿方法)快速找到它。
然后,假设您需要一个比例为整数的解决方案,请测试两个案例ceil(x)和floor(x),以找出曼哈顿长度最小的那个(这是您需要的观察数量)删除)。
证明问题不是NP难的:
考虑一个效率低下的“解决方案”,即从所有箱中删除所有N个观测值。现在 A 和 B 都等于'零'直方图 0 =(0,0,0,...)。两个直方图相等,因此对于所有比例值 s , 0 = s * 0 成比例,因此a要删除的观察数量的最大值是N.
现在假设存在更有效的解决方案,其中包括分配/删除< N和比例尺度s> 2 * N(即删除一些观察后的 A = N * B 或 B = N * A )。如果 A = 0 且 B = 0 ,我们的上一个解决方案是N次删除(这与假设少于N个删除)。如果 A = 0 且 B ≠ 0 ,则没有s<> 0使得 0 = s * B 并且没有s使得s * 0 = B (具有类似功能) B = 0 和 S ≠ 0 的参数。因此,必须是 A ≠ 0 且 B ≠ 0 的情况。假设 A 是要缩放的直方图(所以 A * s = B ), A 必须至少有一个非零项 A [i],最小值为1(删除额外的观察后),因此在缩放时,其最小值≥。因此,等效条目 B [i]也必须具有至少2 * N个观测值。但是观测总数最初是N,所以我们需要在 B [i]中添加至少N个观测值,这与改进的解决方案少于N个添加/删除的假设相矛盾。因此,没有“有效”的解决方案需要比例大于N.
因此,要找到一个有效的解决方案,最坏的情况是,需要测试0-N范围内缩放因子的“最佳拟合”解决方案。
A = s * B 中缩放因子 s 的“最佳拟合”解决方案,其中< strong> A 和 B 有M个箱子,每个都需要
总和(i = 1到M) {Abs( A [i] - s * B [i]) mod s + Abs( A [i] - s * B < / strong> [i]) div s}添加/删除。
这是一个M阶运算,因此测试0-N范围内的每个比例因子将是 O (M * N)
的算法我相当肯定(但没有得到正式证明),比例因子不能超过最多填充箱中的观察数量。在实践中,它通常非常小。对于具有200个箱的两个直方图和每个箱随机选择的30-300个观察值:如果存在Na> 1。在 A 和 B 的所有区间中的Nb总观察值分别几乎总是在Na / Nb-4