algorithm - 创建尽可能接近均匀分布的样本的算法?
问题描述
我有一个带有日期的大型数据数据库。有很大的差距和没有差距的大块数据。我想获取这些数据的样本,以使日期尽可能均匀分布(即尽可能分散)。
例如,如果日期是[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))
解决方案
您应该能够将此建模为分配问题。用顶点集 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) 运行时间来实现。实际上我隐约记得在这篇文章中有一个运行时间为 O(n^2 log n) 的版本。我现在无法访问它,所以无法检查。)我在 90 年代使用的一个实现在标准台式机上运行了几秒钟,因为 n = ~10k 的问题。现在应该可以做得更好。
你没有给出“大”的定义。如果数据库太大而无法作为单个分配问题处理,您可能可以通过分块工作来获得合理的结果。
推荐阅读
- html - CSS - Overflow-x:滚动切断 div 的开头
- encryption - 为什么使用 JSON Web Tokens (JWT) 而不是普通加密
- firebase - FirebaseError:消息:此浏览器不支持使用 firebase SDK 所需的 API。(消息/不支持的浏览器)
- ios - 图形请求 Facebook iOS swift 不起作用我试图获取用户数据并将其上传到应用程序 Cloud Firestore
- python-3.x - 自定义的 tf.keras.keras.callbacks.TensorBoard 在 tensorflow 版本 >= 1.15.0 中效果不佳
- node.js - npm start 抛出 ELIFECYCLE 错误,使用 MongoDB 和 mongoose
- android - 使用 MutableLiveData,将数据从 Activity 更新到 Fragment
- c - 在返回函数的堆栈后取消引用局部变量正在工作
- c# - log4net 到类库
- r - R中的非嵌套列表和连接