我目前正在尝试解决形式为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])
任何帮助都会受到大力赞赏。谢谢!
答案 0 :(得分:3)
您的问题称为non-negative least-squares和scipy 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或更好的自定义公式:自定义(迭代)算法。