创建一个数据结构,可以有效地找到高分缺失的组合

阿列克谢·安德烈耶夫

我有 N 个实体,我想为这些实体找到大小为 3 的所有组合。组合的数量如此之多,以至于无法实际计算所有这些组合。因此,我将使用启发式方法:每个实体的分数等于 ,(number of times this entity was used in a combination with the combination score >= threshold) / (number of times this entity was used in a combination)并且我想找到一个组合,其具有combination score >= threshold. (如果您能找到得分最高的组合或能证明得分在某个最高百分位,则加分。)

请注意,如果不提供此问题背后的大量上下文,很难描述如何计算组合分数,但可以说很难预测且计算速度不快。

由于这是一个持续的过程,我想要一个数据结构,我可以在其中存储我尝试的每个组合,以便下次我可以跳过它们。这个数据结构也应该有助于找到我还没有尝试过的潜在高分组合。

一个直接的方法是:

sorted_entities = sorted(entities, key=lambda entity: entity.score, reverse=True)
for e1 in sorted_entities:
  for e2 in sorted_entities:
    for e3 in sorted_entities:
      if not data_structure.already_have(e1, e2, e3):
        data_structure.add(e1, e2, e3)
        return (e1, e2, e3)

几个明显的问题:

  • 在寻找新的组合之前,我们正在查看我们已经看过的所有高分组合。
  • 根据我们的评分函数,不能保证具有最高分数的实体将产生最高评分组合。

我能想到的另一种方法是概率性的:选择一个随机实体,更有可能选择一个得分较高的实体。然后根据这两个实体的总分按比例选择下一个实体。然后可以在 O(N) 中强制执行最优的第三个选择。(我认为这听起来很像贝叶斯优化,所以这可能是这种方法的最佳版本。)

阿列克谢·安德烈耶夫

这是我目前确定的答案:

步骤1)找到e1使用它的组合最少的。
步骤 2) 找到combos1包含的组合列表e1
步骤3)找到使用它的e2组合最少的combos1
步骤 4) 找到combos2包含e1的组合列表e2(注意:它将是 的严格子集combos1。)
步骤 5) 遍历combos2并创建一组使用的所有实体:existing_e3_set
步骤 6) set_of_all_entities-existing_e3_set为您提供所有e3s您可以结合e1e2创建尚不存在的组合。

运行时间在实体和组合的数量上是线性的。
我认为您可以修改第 1 步和第 3 步以使用某种实体分数,但我还没有想过这可能会失去在第 6 步中最终得到非空集合的保证。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有一个数据结构可以有效地找到彼此靠近的点?

有效地找到最相似集(Python中,数据结构)

如何有效地找到一个数组的所有可能的子数组?

从2个数据帧中有效地找到日期时间范围的重叠

有效地计算一个数据帧与另一个数据帧的比例

数据结构可以有效地添加新数字并计算多少存储的数字小于某个查询数字

如何有效地找到与第二个数组值匹配的第一个数组值的索引?

如何有效地在一系列数据帧上创建一个表格。

在OrderedDictionary中有效地找到上一个键

有效地找到一个值属于哪个范围

有效地找到另一个点的最近点

如何有效地创建一个带有define()列表的数组?

有效地将结果聚合到Python数据结构中

如何有效地返回大型数据结构。

简单地创建一个数据结构,如何隔离?

有效地合并匹配一个变量或另一个变量的两个数据集

如何从另一个 json 对象有效地创建嵌套的 json

比这更有效地创建一个很长的字符串

在Java中,如何根据子数组元素的值最有效地在JSON数组中找到一个数组?

如何有效地拆分1个数据框列以创建一个新的数据框,该数据框将相同的值分配给类别列的每个部分

如何有效地检查一个数据框中的列值并找到该值出现在其他数据框中的行?

如何有效地将具有MultiIndex的数据帧合并到另一个数据帧中?

如何可读且有效地创建一个可迭代组合字典,并以其索引的元组为键?

如何根据来自其他数据集的值有效地映射来自一个数据集的键

根据作为另一个数据帧的行给出的条件有效地过滤数据帧

需要具有标签集的元素的数据结构,并且可以有效地查找标签是输入集的子集的所有元素

有效地将日期的小时列更改为另一个数据框列R的值

有效地检查与 Pandas DataFrame 中某些值匹配的行并将其添加到另一个数据框中

如何有效地组合调用两种方法的一个链接?