如何仅使用
numpy
进行约束最小二乘法。有没有办法将约束合并到 numpy.linalg.lstsq()
中,或者是否有任何 numpy
+Python 解决方法来执行约束最小二乘法?我知道我可以使用 cvxpy
和 scipy.optimize
轻松完成此操作,但此优化将是 numba
JITed 函数的一部分,而 numba
不支持这两个。
是线性的吗?根据您的
numpy.linalg.lstsq
建议,我现在假设是这样。另外,我假设(首先解决简单的情况)您谈论了等式约束。然后你可以很容易地使用拉格朗日乘子自己求解,并且可以通过求解线性方程组来找到解。
如果问题是在约束
A * x - y
上最小化 B * x = b
,则解决
举个例子:
from numpy import array, zeros
from numpy.linalg import solve
A = array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = array([3.2, 6.8, 11.1, 15.2])
B = array([[1, -1]])
b = array([0.1])
S = zeros((3, 3))
r = zeros(3)
S[:2, :2] = A.T @ A
S[2:, :2] = B
S[:2, 2:] = B.T
r[:2] = A.T @ y
r[2] = b
x = solve(S, r)[:2]
print(x)
免责声明:可能包含错误,但简短的测试给了我
x
[1.06262376 0.96262376]
这看起来很合理,我的约束 x1 - x2 = 0.1 也满足了。