![](/img/trans.png)
[英]How to make contingency table from another contingency table using count values of the first contingency table?
[英]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
如果我想最小化近似等式的偏差,这是一个混合整数二次规划问题吗?
优化问题可以表示为
我尝试使用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.