求解一个对python中答案有约束的矩阵方程

时间:2017-06-05 12:18:19

标签: python python-2.7 numpy matrix

我目前正在尝试解决形式为Ax = b的矩阵方程,其中A是NxN方阵,x,b是1xN向量。但是,我要求所有元素x [i]都是非负的。

强加这种约束意味着一个解决方案可能无法实现(如果您在分析上做到这一点,那么只有一个独特的解决方案,如果它有负面条目会让我失去运气)但必须有办法找到一个尽可能接近的x?我不确定这是什么正式名称,所以我没有找到运气。

到目前为止我所拥有的:

N=10

A = np.random.rand(N,N)
B = np.random.rand(N)

A_inv = np.linalg.inv(A)
x = np.dot( A_inv, B )

x=
array([ 0.42216451,  1.70270083, -1.54040488,  2.18724233,  2.04278932, -1.76074253])

任何帮助都会受到大力赞赏。谢谢!

1 个答案:

答案 0 :(得分:3)

您的问题称为non-negative least-squaresscipy supports it

未经测试,使用情况如下:

import numpy as np
from scipy.optimize import nnls

N=10

A = np.random.rand(N,N)
B = np.random.rand(N)
x, rnorm = nnls(A, B)

该算法非常古老且值得信赖,但仅适用于中小规模的问题(因为它在内部计算A.T * A)。如果你遇到了大问题(数百万变量的稀疏问题),你应该尝试一些基于L-BFGS-B或更好的自定义公式:自定义(迭代)算法。