【问题标题】:Scipy selects nan as inputs while minimizingScipy 选择 nan 作为输入,同时最小化
【发布时间】: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

qrqc 是回归树,它们是将数组映射到标量的函数。

我有这些限制:

# 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 来演示这个问题吗?拥有一些我们可以自己复制和运行的东西会很有帮助。也许您可以创建actionsqcqr(以及此处未定义的任何其他内容)的简化版本来创建可运行的示例。
  • 我试过了,pastebin.com/uEVamXXU,但它不会引发任何错误。我认为 qr 和 qc 函数的形状是主要问题,不幸的是,如果不给出整个代码,我就无法创建它们的示例。它使用重型框架,如监督学习和强化学习。也许这更像是一个与数学相关的问题。
  • 看来,如果我删除约束 constraint_proba_sum_1(x),我就没有 NaN 值作为输入了。

标签: scipy nan nonlinear-optimization minimization


【解决方案1】:

我观察到 scipy 的 differential_evolution 优化器的类似行为,我可以将此追溯到 polish 参数,该参数在全局优化后运行局部最小化。由于这仅在 DE 优化器的最大迭代之后出现(显然我的模型的参数无法从我手头的数据中识别出来),因此来自 DE opt 对象的局部最小化器的 init 引起了与其他帖子描述的类似的效果.

我的解决方法是在目标函数中捕获 NaN 值的出现并引发异常,因为只有当 DE 优化器找不到最优值时才会发生这种情况。

【讨论】:

    【解决方案2】:

    我对这个问题没有完整的答案,但我在自己的优化脚本中遇到了与您相同的行为,并想分享我的修复方法。

    首先,在我的情况下,它也有助于消除其中一个约束。这有帮助的原因是Scipy.minimize 无法处理从违反约束开始的优化。因此,如果c == 0.0c = 0.3 在起点,那么它会在某个时候为设计变量设置nan 值,因为它正在优化。当然,仅仅删除一个约束通常不是一种选择,所以在我的情况下,帮助设置更严格的设计变量界限,这样它不太可能从一个无效的点开始(因此,违反了约束)。请注意,这假设您在不同的起点多次运行优化(这对于我的设置是正确的)。在你的情况下,我认为这只是选择一个起点x0 的问题,它有一个未违反(有效)的constraint_proba_sum_1(x)

    因此,总而言之,避免此问题的一种方法是确保优化的起点是根据您提供的约束条件的有效点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-19
      • 2017-06-15
      • 1970-01-01
      • 2013-12-03
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多