我有一个包含日期的大型数据库。有很大的空白,没有空白的大量数据。我想获取这些数据的样本,以使日期尽可能均匀地分布(即,尽可能分散)。
例如如果日期为[1, 2, 3, 4, 100]
,并且我想对3个元素进行抽样,则理想的抽样应为[1, 50.5, 100]
,而我选择[1, 4, 100]
。
这是现有算法的已知问题吗?
我要使这个问题形式化的尝试是:给定数组A,选择一个子数组B,以使以下内容最小化:
Σabs(B i -(min(A)+ i *(max(A)-min(A))/(len(B)-1))
答案 0 :(得分:1)
您应该可以将此模型建模为assignment problem。构造一个包含顶点集A和B的二部图。从A_i到B_j的边的权重类似
abs(j / (|B| - 1) - (A_i - min(A) / (max(A) - min(A)))
其中A_0 <= A_1 <= ... <= A_{|A|-1}
。
请注意,在您的问题中,图是密集的,因此很容易表示为权重W [i,j]的矩形矩阵。不需要显式的顶点或边数据结构。
最小权重匹配将识别样品中A的元素。
有几种解决分配问题的有效算法。也许最著名的是匈牙利方法。这可以用O(n ^ 3)运行时间来实现。实际上,我隐约记得在this text中有一个运行时间为O(n ^ 2 log n)的版本。我现在无法访问它,因此无法检查。)我在90年代使用的一种实现在标准台式机上运行了几秒钟,出现了n =〜10k的问题。现在应该可以做得更好。
您没有给出“大”的定义。如果数据库太大而无法作为单个分配问题处理,则可以通过分块工作来获得合理的结果。