使用scipy最小二乘的方程式约束

bxfogqkk  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(136)

我试图用最小二乘法通过改变x,y,z来最小化损失函数。我的问题是非线性的,因此我选择了scipy least_squares。一般结构是:

from scipy.optimize import least_squares
def loss_func(x, *arguments):
 # plug x's and args into an arbitrary equation and return loss
 return loss # loss here is an array

# x_arr contains x,y,z

res = least_squares(loss_func, x_arr, args=arguments)

我尝试通过以下方式约束x、y、z:x-y =某个值,z-y =某个值。我该怎么做呢?scipy least_squares文档只提供了边界。我知道我可以创建像0〈x〈5这样的边界。但是,我的约束条件是一个方程,而不是一个常数边界。提前感谢!

e37o9pze

e37o9pze1#

如果有人碰到这个问题,我已经找到了解决这个问题的方法。由于least_squares没有约束,最好使用linear programming和scipy.optimize.minimize。由于loss_func返回一个残差数组,我们可以使用L1 norm(因为我们想最小化这个残差数组的绝对差)。

from scipy.optimize import minimize
import numpy as np

def loss_func(x, *arguments):
 # plug x's and args into an arbitrary equation and return loss (loss is an array)
 return np.linalg.norm(loss, 1)

可以相当容易地将边界添加到scipy.optimize.minimize中:)

相关问题