【问题标题】:How to solve AX = B equation with Python (NumPy, SciPy etc.), where A, X, B are matrices and all elements of X must be non-negative如何使用 Python(NumPy、SciPy 等)求解 AX = B 方程,其中 A、X、B 是矩阵且 X 的所有元素必须为非负数
【发布时间】:2019-05-20 20:26:05
【问题描述】:

我需要使用 Python 求解方程 AX = B,其中 A、X、B 是矩阵,并且 X 的所有值都必须为非负数。

我找到的最佳解决方案是

X = np.linalg.lstsq(A, B, rcond=None)

但结果 X 包含负值。是否有可能获得没有负值的解决方案?提前致谢!

【问题讨论】:

标签: python numpy scipy linear-equation


【解决方案1】:

一般来说,这在数学上是不可能的。鉴于AB可逆的基本要求,X是唯一矩阵。如果您不喜欢X 拥有的元素,您不能简单地要求另一种解决方案:没有。您必须更改 AB 才能获得不同的结果。

【讨论】:

  • A 和 B 不一定是可逆的 - 这不是问题中给出的约束,甚至不是暗示的约束。问题中给出的最小二乘求解器会找到给出最小均方误差的解 - 但还有其他误差定义(或 B 上的约束)导致不可逆 A 的唯一解。
【解决方案2】:

你可以用cvxpy解决它:

import cvxpy

def solve(A, B):
    """
    Minimizes |AX - B|**2, assuming A and B are 
    square matrices for simplicity. If this optimized 
    error is zero, this corresponds to solving AX = B.
    """
    n = A.shape[0]
    X = cvxpy.Variable((n,n))
    # Set objective
    obj_fun = cvxpy.sum_squares(A*X - B)
    objective = cvxpy.Minimize(obj_fun)
    # Set constraints
    constraints = [X >= 0]
    prob = cvxpy.Problem(objective, constraints)
    result = prob.solve(solver = "ECOS")
    return X.value

编辑:我相信Prune 的答案是正确的。您可以通过检查results 来检查数值求解器中的错误是否非零。

【讨论】:

  • 感谢您的回答,但 A.shape=(128,1025) 和 B.shape=(128,146) 出现“'shape' 元素不能为负数”错误。当我在具有较少维度的数组上尝试该解决方案时,它工作正常。
猜你喜欢
  • 1970-01-01
  • 2019-05-30
  • 2014-04-05
  • 1970-01-01
  • 2021-07-25
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
相关资源
最近更新 更多