【发布时间】:2023-04-09 16:07:01
【问题描述】:
我有这个目标函数(在 python 中):
actions= [...] # some array
Na= len(actions)
# maximize p0 * qr(s,a0,b0) + ... + pn * qr(s,an,bn)
def objective(x):
p = x[:Na] # p is a probability distribution
b = x[Na:2 * Na] # b is an array of positive unbounded scalars
q = np.array([qr(s, actions[a], b[a]) for a in range(0, Na)]) # s is an array
rez = - np.dot(p, q) # np stands for numpy library
return rez
qr 和 qc 是回归树,它们是将数组映射到标量的函数。
我有这些限制:
# p0 * qc(s,a0,b0) + ... + pn * qc(s,an,bn) < beta
def constraint(x):
p = x[:Na]
b = x[Na:2 * Na]
q = np.array([qc(s, actions[a], b[a]) for a in range(0, Na)])
rez = beta - np.dot(p, q) # beta is a scalar
return rez
# elements of p should sum to 1
def constraint_proba_sum_1(x):
p = x[:Na]
rez = 0
for i in range(0, Na):
rez += p[i]
rez = 1 - rez
return rez
我如何最小化:
constraints = ({'type': 'ineq', 'fun': constraint},
{'type': 'eq', 'fun': constraint_proba_sum_1})
res = opt.minimize(fun=objective, x0=np.array([0.5, 0.5, 10, 10]), constraints=constraints,
bounds=[(0, 1), (0, 1), (0, None), (0, None)])
问题是opt.minimize 有时在其最小化过程“slsqp”期间使用nan 数组作为输入。因此qr 树会引发错误。为什么它会在什么情况下评估这样的数组?
我确实意识到这个问题与Scipy optimizations methods select nan for input parameter 的帖子相同,但它没有解决,看起来与功能有关。
EDIT:看来,如果我删除约束 constraint_proba_sum_1(x),我不再有 NaN 值作为输入。
EDIT 2:我尝试了另一个 API,pyOPT 和 SLSQP 优化,我也遇到了同样的问题。
【问题讨论】:
-
你能创建一个minimal, complete and verifiable example 来演示这个问题吗?拥有一些我们可以自己复制和运行的东西会很有帮助。也许您可以创建
actions、qc、qr(以及此处未定义的任何其他内容)的简化版本来创建可运行的示例。 -
我试过了,pastebin.com/uEVamXXU,但它不会引发任何错误。我认为 qr 和 qc 函数的形状是主要问题,不幸的是,如果不给出整个代码,我就无法创建它们的示例。它使用重型框架,如监督学习和强化学习。也许这更像是一个与数学相关的问题。
-
看来,如果我删除约束 constraint_proba_sum_1(x),我就没有 NaN 值作为输入了。
标签: scipy nan nonlinear-optimization minimization