簡體   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