繁体   English   中英

给定一些优化约束,如何从边际分布中填充列联表?

[英]How to fill a contingency table from the marginal distributions given some optimization constraints?

我需要在给定边际分布的情况下找到列联表的单元格。

2574 2572 3393 3768 3822 b 电子
x₁₁ x₁₂ x₁₃ x₁₄ x₁₅ 187 23846753.74
x₂₁ x22 x23 x24 x₅ 3个 324024.64
x₃₁ x₃₂ x₃₃ x₃₄ x₃₅ 13755 1489591510.50
x₄₁ x₄₂ x₄₃ x₄₄ x₄₅ 543 76173239.22
x₅₁ x₅₂ x₅₃ x₅₄ x₅₅ 68 8188751.57
x₆₁ x₆₂ x₆₃ x₆₄ x₆₅ 1332 172945247.86
x₇₁ x₇₂ x₇₃ x₇₄ x₇₅ 361 41675606.70

xᵢⱼ 是我想要找到的非负整数。 列总和是准确的。 行总和 ( b ) 是近似值。

还有其他约束来指导 xᵢⱼ 的分布:

给定常数因子F = (13336.41847153, 102412.73466321, 41811.01724119, 78689.83110577, 282353.66682778) T和预期结果e那么X·F ≈ e

如果我想最小化近似等式的偏差,这是一个混合整数二次规划问题吗?

  • b是列总和
  • A是 1 的向量,因此每一列都会相加
  • d是行总和
  • C是 1 的向量,这样每一行都会被加起来
  • e是预期加权和的向量
  • F是权重的常数向量

优化问题可以表示为

  • 分钟 (‖ X C – d ‖² + ‖ XF – e ‖²)
  • 使得A X = b
  • x≥0
  • x ∈ ℕ

我尝试使用cvxpy解决此问题:

import cvxpy as cp
import numpy as np

F = np.array([13336.41847153, 102412.73466321, 41811.01724119, 78689.83110577, 282353.66682778])
e = [23846753.74, 324024.64, 1489591510.50, 76173239.22, 8188751.57, 172945247.86, 41675606.70]
d = [187., 3., 13755., 543., 68., 1332., 361.]
C = np.ones(len(F))
b = np.array([2574, 2572, 3393, 3768, 3822])
A = np.ones(len(d))

x = cp.Variable((len(e), len(b)), integer=True)
cost = cp.sum_squares(x @ C - d) + cp.sum_squares(x @ F - e)
objective = cp.Minimize(cost)
constraint_gt0 = x >= 0
constraint_eq = A @ x == b
    
problem = cp.Problem(objective, [constraint_gt0, constraint_eq])
solution = problem.solve()

但这会导致错误消息:

候选圆锥求解器 (['GLPK_MI', 'SCIPY']) 不支持问题 (SOC, NonNeg, Zero) 的圆锥 output,或者问题中没有足够的约束。

如果我删除integer=True约束,该方法将无错误地完成,但没有找到解决方案。

有很多这样的表要解决,它们都是相互独立的。 所以我需要一个代码解决方案,而不是特定给定示例的x集。

我的问题:

这是一个结构良好且可解决的问题吗?

它是否像错误消息所暗示的那样约束不足?

为什么它会导致错误消息中提到的二阶锥 (SOC)? 这听起来不必要地复杂。 我认为这是一个“带有一些额外约束的最小二乘问题”。

我如何解决 cvxpy 或其他一些 Python package 的问题?

如果近似的非整数解决方案更可行,我将如何实现?

感谢@ErwinKalvelagen 和@MichalAdamaszek 的提示:答案是 CPLEX。 您需要一个能够解决这 class 个问题的求解器。 请参阅 cvxpy 文档中的选择求解器

作为替代方案,如果您不想使用 CPLEX,通过将成本cp.norm中的cp.sum_squares替换为 cp.norm 并移除integer=True约束,集成求解器也能够找到浮点解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM