[英]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.