我有50个列表,每个列表都填充0s ans 1s。当你考虑所有50个列表汇集在一起时,我知道1的整体比例。我想找到10个列表,汇集在一起最符合1的整体比例。
我想要最小化的函数是abs(mean( pooled 子集) - mean( pooled full set))
对于那些了解熊猫的人:
在pandas术语中,我有一个数据框如下
等等,共有50个标签,每个标签的数值范围在100到1000之间。 我想找到最小化d的10个标签的子集,其中d
d = abs(df.loc[df.label.isin(subset), 'Value'].mean() - df.Value.mean())
我尝试将动态编程解决方案应用于背包问题,但问题是每个列表(标签)对最终样本的贡献意味着更改,具体取决于您之后将包含的其他列表 (因为它们会以不可预测的方式增加样本量)。这就像背包问题,你选择的每一个新项目都会改变你之前选择的项目的价值。棘手。
有没有更好的算法来解决这个问题?
答案 0 :(得分: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)
每个子集。