使用LinearConstraint调用minimize函数报错:约束需用字典定义
解决scipy.optimize.minimize中LinearConstraint约束报错问题
我尝试在相关矩阵上用LinearConstraint调用minimize函数,结果报错“Constraints must be defined using a dictionary”,不知道怎么用字典形式定义LinearConstraint的线性约束,求解决建议。
使用的数据
col1 col2 col3 1 0.59 0.68 0.59 1 0.92 0.68 0.92 1
计算代码
from scipy.optimize import minimize, LinearConstraint import numpy as np # 原代码遗漏numpy导入 A0 = [.3,.4,.3] bnds = [(1, 1) for i in range(len(A0))] def test(w): return (w@np.matrix(corr))@w temp=minimize(test,A0,constraints=(LinearConstraint(np.array([1,1,1]),lb=1.0,ub=1.0), ))
报错信息
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) C:\Program Files\Anaconda3\lib\site-packages\scipy\optimize\slsqp.py in _minimize_slsqp(func, x0, args, jac, bounds, constraints, maxiter, ftol, iprint, disp, eps, callback, **unknown_options) 253 try: --> 254 ctype = con['type'].lower() 255 except KeyError: TypeError: 'LinearConstraint' object is not subscriptable During handling of the above exception, another exception occurred: TypeError Traceback (most recent call last) <ipython-input-332-ce6c477d5282> in <module> 8 return (w@np.matrix(corr))@w 9 ---> 10 temp=minimize(test,A0,constraints=(LinearConstraint(np.array([1,1,1]),lb=1.0,ub=1.0), )) C:\Program Files\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options) 609 elif meth == 'slsqp': 610 return _minimize_slsqp(fun, x0, args, jac, bounds, --> 611 constraints, callback=callback, **options) 612 elif meth == 'trust-constr': 613 return _minimize_trustregion_constr(fun, x0, args, jac, hess, hessp, C:\Program Files\Anaconda3\lib\site-packages\scipy\optimize\slsqp.py in _minimize_slsqp(func, x0, args, jac, bounds, constraints, maxiter, ftol, iprint, disp, eps, callback, **unknown_options) 256 raise KeyError('Constraint %d has no type defined.' % ic) 257 except TypeError: --> 258 raise TypeError('Constraints must be defined using a ' 259 'dictionary.') 260 except AttributeError: TypeError: Constraints must be defined using a dictionary.
问题原因与解决方法
报错核心原因:LinearConstraint对象仅适配trust-constr优化方法,而你当前使用的是默认的SLSQP方法(minimize在有约束时默认调用SLSQP),SLSQP不支持LinearConstraint类型,只接受字典形式的约束定义。
有两种可行解决方式:
方式1:改用trust-constr方法
直接在minimize调用中指定方法参数,即可直接使用LinearConstraint对象:
temp = minimize(test, A0, constraints=(LinearConstraint(np.array([1,1,1]), lb=1.0, ub=1.0), ), method='trust-constr')
方式2:用字典形式定义约束(适配SLSQP方法)
如果不想更换优化方法,可将线性约束写成字典格式。SLSQP要求约束字典包含type('eq'表示等式约束,'ineq'表示不等式)、fun(约束函数)等键。针对你的等式约束w1 + w2 + w3 = 1,可这样定义:
constraints = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1}) temp = minimize(test, A0, constraints=constraints)
另外注意:原代码遗漏了numpy的导入语句,需要补充import numpy as np,同时要确保corr变量已正确定义为你的相关矩阵。
内容的提问来源于stack exchange,提问作者Sanchit Aluna
相关产品推荐
相关产品推荐

