我是scipy.optimize模块的新手。我正在使用它的最小化函数试图找到一个x来最小化多变量函数,它采用矩阵输入但返回标量值。我有一个等式约束和一个不等式约束,它们都采用向量输入和返回向量值。特别是,这里是约束列表:
sum(x) = 1 ;
AST + np.log2(x) >= 0
其中AST
只是一个参数。我将约束函数定义如下:
对于平等约束:lambda x: sum(x) - 1
对于不平等约束:
def asset_cons(x):
#global AST
if np.logical_and.reduce( (AST + np.log2(x)) >= 0):
return 0.01
else:
return -1
然后我打电话给
cons = ({'type':'eq', 'fun': lambda x: sum(x) - 1},
{'type':'ineq', 'fun': asset_cons})
res = optimize.minize(test_obj, [0.2, 0.8], constraints = cons)
但我仍抱怨我的约束功能错误。是否允许为约束函数返回向量值,或者我必须返回标量才能使用此最小化函数?
有人能帮助我看看我指定约束的方式是否有问题?
答案 0 :(得分:0)
原则上这看起来根本不错。但是,如果没有看到有关test_obj
和实际错误的内容,就有点难以说。它是否会抛出异常(暗示编程错误)或抱怨收敛(暗示数学挑战)?
你有正确的基本想法;你需要有一个函数接受带有N个元素的输入向量,并返回要最小化的值。您的边界条件也应该接受相同的输入向量并返回单个标量作为其输出。
在我看来,你的边界条件有问题。第一个(sum(x) - 1
)很好,但第二个在数学上具有挑战性,因为您已将其定义为逐步函数。许多优化算法希望具有连续的功能,并且具有优选的非常平滑(我不知道这个函数使用的算法是否能很好地处理逐步函数,所以这只是猜测。
如果上述情况属实,您可以通过以下方式使事情变得更容易:
np.amin(AST + np.log2(x))
如果所有AST + log2(x[n]) >= 0
,该函数将为非负数。 (它仍然不是非常流畅,但如果这是一个问题,很容易改进。)现在它也适合一个lambda
。
如果您在融合方面遇到困难,您应该尝试使用COBYLA和SLSQP,除非您已经知道其中一个更适合您的问题。