什么软件算法将 select 来自大集合的项目的不同子集
What software algorithm will select a diverse subset of items from a large set
设置
假设我有很多物品。每件物品都有形状、大小和颜色。他们可能是
- 三角形、圆形或正方形
- 红色、绿色或蓝色
- 小或大
我无法对这些属性在项目中的分布做出任何假设。我合理地确定它不是一百万个大的红色三角形,但这总是有可能的。
问题
我想选择 36 个我的形状,在所有属性 classes 中尽可能“多样化”地表示。澄清一下,从非常大的集合中抽取 36 个项目,我理想情况下喜欢 12 个红色、12 个绿色、12 个蓝色、12 个三角形、18 个小等
现在有 18 种可能的不同项目类型(3 种颜色 * 3 种形状 * 2 种尺寸),所以一种方法是包括每种不同类型的两种(假设我有)。
如果我没有足够的每种不同类型,另一种(不切实际的,蛮力的)方法是迭代 36 个项目的每个可能子集并保留最佳子集。
我确信这是一个更广泛的 class 问题的特定实例,可以通过众所周知的算法解决,但我无法确定 Google 的魔法词。我标记为 knapsack-problem
因为感觉可能是这样,但我想知道是否有更好的方法来解决这个问题?
您能否提供解决方案或至少提供适当的搜索字词?
看看reservoir sampling。为每个 shape/color/size 组合制作一个水库(因此 36 个水库),每个水库的容量为 36。遍历所有元素,并为每个元素 select 其适当的水库并执行水库采样步骤。
这将您的问题减少到最多 36*36 = 1296 个元素,从所有元素中公平地采样,甚至涵盖只有一个组合的最坏情况。
然后你可以简单地洗牌水库,从每个水库中随机选择一个元素(跳过空水库),将它们从水库中移除。如果每个 shape/color/size 都有一个,那么您马上就完成了。如果没有,你再次洗牌水库并做另一遍,并继续这样做,直到你有 selected 36 个元素。这为您提供了一个统一的数据集样本,由 shape/color/size 偏差归一化。
设置
假设我有很多物品。每件物品都有形状、大小和颜色。他们可能是
- 三角形、圆形或正方形
- 红色、绿色或蓝色
- 小或大
我无法对这些属性在项目中的分布做出任何假设。我合理地确定它不是一百万个大的红色三角形,但这总是有可能的。
问题
我想选择 36 个我的形状,在所有属性 classes 中尽可能“多样化”地表示。澄清一下,从非常大的集合中抽取 36 个项目,我理想情况下喜欢 12 个红色、12 个绿色、12 个蓝色、12 个三角形、18 个小等
现在有 18 种可能的不同项目类型(3 种颜色 * 3 种形状 * 2 种尺寸),所以一种方法是包括每种不同类型的两种(假设我有)。
如果我没有足够的每种不同类型,另一种(不切实际的,蛮力的)方法是迭代 36 个项目的每个可能子集并保留最佳子集。
我确信这是一个更广泛的 class 问题的特定实例,可以通过众所周知的算法解决,但我无法确定 Google 的魔法词。我标记为 knapsack-problem
因为感觉可能是这样,但我想知道是否有更好的方法来解决这个问题?
您能否提供解决方案或至少提供适当的搜索字词?
看看reservoir sampling。为每个 shape/color/size 组合制作一个水库(因此 36 个水库),每个水库的容量为 36。遍历所有元素,并为每个元素 select 其适当的水库并执行水库采样步骤。
这将您的问题减少到最多 36*36 = 1296 个元素,从所有元素中公平地采样,甚至涵盖只有一个组合的最坏情况。
然后你可以简单地洗牌水库,从每个水库中随机选择一个元素(跳过空水库),将它们从水库中移除。如果每个 shape/color/size 都有一个,那么您马上就完成了。如果没有,你再次洗牌水库并做另一遍,并继续这样做,直到你有 selected 36 个元素。这为您提供了一个统一的数据集样本,由 shape/color/size 偏差归一化。