【问题标题】:Find subset with similar mean as full set找到与完整集具有相似平均值的子集
【发布时间】:2017-06-12 06:44:28
【问题描述】:

我有 50 个列表,每个列表都用 0 和 1 填充。当您考虑所有 50 个列表汇总在一起时,我知道 1 的总体比例。我想找出汇集在一起​​最接近 1 的整体比例的 10 个列表。

我要最小化的函数是 abs(mean(pooled subset) - mean(pooled full set))

对于那些了解熊猫的人

在熊猫方面,我有一个如下的数据框

以此类推,总共有 50 个标签,每个标签的值都在 100 到 1000 之间。 我想找到最小化 d 的 10 个标签的子集,其中 d

d = abs(df.loc[df.label.isin(subset), 'Value'].mean() - df.Value.mean())

我尝试将动态编程解决方案应用于背包问题,但问题是 每个列表(标签)对最终样本均值的贡献会根据您之后包含的其他列表而变化 (因为它们会以不可预知的方式增加样本量)。这就像背包问题,你挑选的每一个新物品都会改变你之前挑选的物品的价值。棘手。

有没有更好的算法来解决这个问题?

【问题讨论】:

  • 有趣的问题。我不认为动态编程方法会起作用,因为似乎有时通过组合子问题的两个非最优解来获得最优解,所以(我不认为)你有最优的子结构属性动态规划的理论基础。如果它太大而无法暴力破解(并且如果没有巧妙的转换将其简化为标准背包或类似问题),那么遗传算法方法或类似的启发式方法可能会很好。
  • 我实际上相信这可以表述为(通过一些努力:需要一些线性化)作为混合整数规划 (MIP) 模型。
  • Here 是我的 MIP 公式。并非完全微不足道。
  • @ErwinKalvelagen 不错。也许您可以将其发布为答案。也许在这里给出一个概述并包含详细信息的链接。
  • @JohnColeman 完成。我省略了重要的东西,但我认为仍然很有趣。

标签: python pandas numpy optimization knapsack-problem


【解决方案1】:

有一种方法可以将这个问题表述为 MIP(混合整数规划)问题。

我们需要以下数据:

mu : mean of all data
mu(i) : mean of each subset i
n(i) : number of elements in each subset
N : number of subsets we need to select

我们需要一些二元决策变量

delta(i) = 1 if subset i is selected and 0 otherwise

优化问题的正式陈述可能如下所示:

min | mu - sum(i, mu(i)*n(i)*delta(i)) / sum(i, n(i)*delta(i)) |
subject to 
     sum(i, delta(i)) = N
     delta(i) in {0,1}

这里sum(i, mu(i)*n(i)*delta(i))是选中项的总值,sum(i, n(i)*delta(i))是选中项的总数。

目标显然是非线性的(我们有一个绝对值和一个除法)。这有时被称为 MINLP 问题(混合整数非线性规划的 MINLP)。尽管 MINLP 求解器很容易获得,但我们实际上可以做得更好。使用一些体操,我们可以将这个问题重新表述为一个线性问题(通过添加一些额外的变量和额外的不等式约束)。完整的详细信息是here。生成的 MIP 模型可以使用任何 MIP 求解器求解。

有趣的是,我们不需要模型中的数据值,每个子集只需要 n(i),mu(i)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2018-07-19
    • 2016-04-16
    • 2017-10-10
    • 2018-07-21
    • 2017-07-02
    相关资源
    最近更新 更多