使用Scipy在Python中进行约束优化



我有一个函数f:(a.y1+b.y2+c.y3+d.y4+e.y5+f.y6(,我需要最小化root_mean_squared_error(f(。线性约束为:a+b+c+d+e+f=1。边界是a,b,c。。。应介于[0,1]之间。我正在尝试找出a、b、c、d、e和f的优化值。我正在使用Scipy,但我觉得我无法在"最小化"代码中正确地设置边界和约束,如下所示:(y0是给定的原始测试值(。

import numpy as np
from scipy.optimize import minimize
from scipy.optimize import LinearConstraint
def root_mean_squared_error(y1, y2):
squared_difference = (y1 - y2)**2
mean_squared = np.mean(squared_difference)
return np.sqrt(mean_squared)
def rms(params):
a, b, c , d , e, f = params
yF = sum(a*y1 + b*y2 + c*y3 + d*y_4 + e*y5 + f*y6)
return root_mean_squared_error(y0, yF)
initial_guess = [0.2, 0.1, 0.2, 0.05, 0.3, 0.15]
constraint = LinearConstraint([1,1,1,1,1,1],1,1)
bound = ([0, 1],[0, 1],[0, 1],[0, 1],[0, 1],[0, 1])
res = minimize(rms, initial_guess, method='nelder-mead', bounds = bound,constraints = constraint)
print(res.x)

我得到的值很小,加起来不等于一,比如下面的:

[1.28941447e-04 1.90583408e-04 8.50096927e-05 2.08311702e-04 1.17829816e-04 0.00000000e+00]

这是使用scipy线性约束和绑定的正确方法吗

约束(仅适用于COBYLA、SLSQP和信任约束(。

因此,您可能需要将method=nelder-mead更改为其中一个,否则约束将被忽略。

由于这是一个相等约束,您必须使用method='SLSQP'method='trust-constr'

最新更新