【问题标题】:Get Gradient and Hessian of objective in Pyomo在 Pyomo 中获取目标的梯度和 Hessian
【发布时间】:2018-02-27 19:13:39
【问题描述】:

我有一个 Pyomo 模型,我想获得目标的梯度和 Hessian。相关的SO question 提出了同样的问题。当我尝试那里提出的解决方案时

from pyomo.core.base.symbolic import differentiate
from pyomo.core.base.expr import identify_variables

varList = list(identify_variables(zipfe.loglikelihood.expr))
firstDerivs = differentiate(zipfe.loglikelihood.expr, wrt_list=varList)

我收到以下错误:

Traceback (most recent call last):
  File "/home/pauperei/.conda/envs/py36/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2862, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-9-6f2637b1fe13>", line 1, in <module>
    firstDerivs = differentiate(zipfe.loglikelihood.expr, wrt_list=varList)
  File "/home/pauperei/.conda/envs/py36/lib/python3.6/site-packages/pyomo/core/base/symbolic.py", line 122, in differentiate
    tmp_expr, locals=dict((str(x), x) for x in sympy_vars) )
  File "/home/pauperei/.conda/envs/py36/lib/python3.6/site-packages/sympy/core/sympify.py", line 354, in sympify
    expr = parse_expr(a, local_dict=locals, transformations=transformations, evaluate=evaluate)
  File "/home/pauperei/.conda/envs/py36/lib/python3.6/site-packages/sympy/parsing/sympy_parser.py", line 894, in parse_expr
    return eval_expr(code, local_dict, global_dict)
  File "/home/pauperei/.conda/envs/py36/lib/python3.6/site-packages/sympy/parsing/sympy_parser.py", line 807, in eval_expr
    code, global_dict, local_dict)  # take local objects in preference
  File "<string>", line 1, in <module>
TypeError: 'Symbol' object does not support indexing

这是我的目标的样子(前几行):

zipfe.loglikelihood.pprint()
loglikelihood : Size=1, Index=None, Active=True
Key  : Active : Sense    : Expression
None :   True : minimize : log( 1 + exp( alpha1[0] + 2.0*alpha1[1] + alpha1[4] + 2.8986705607108596*( delta[0] + 2.0*delta[1] ) ) ) - ( 2.0*beta1[0] + beta1[3] + 2.8986705607108596*( gamma[0] + 2.0*gamma[1] ) ) + log( exp(  - log( 1 + exp( alpha1[0] + 2.0*alpha1[1] + alpha1[4] + 2.8986705607108596*( delta[0] + 2.0*delta[1] ) ) ) + 2.0*beta1[0] + beta1[3] + 2.8986705607108596*( gamma[0] + 2.0*gamma[1] ) ) + exp(  - log( 1 + exp( alpha1[0] + 5.0*alpha1[1] + 2.8986705607108596*( delta[0] + 2.0*delta[1] ) ) ) + 5.0*beta1[0] + 2.8986705607108596*( gamma[0] + 2.0*gamma[1] ) ) + exp(  - log( 1 + exp( alpha1[0] + 2.0*alpha1[1] + alpha1[7] + 2.8986705607108596*( delta[0] + 2.0*delta[1] ) ) ) + 2.0*beta1[0] + beta1[6] + 2.8986705607108596*( gamma[0] + 2.0*gamma[1] ) ) + exp(  - log( 1 + exp( alpha1[0] + alpha1[1] + alpha1[6] 

问题似乎在于 Sympy 不喜欢像 alpha1[0] 这样的索引变量。这个问题有解决办法吗?

编辑:

我正在使用 Pyomo 5.2 和 Python 3.6。我会尽快添加一个最小的工作示例。

在过去的几天里,这已作为待办事项添加到 Pyomo GitHub 存储库中,因此希望很快会有解决方案。

【问题讨论】:

  • differentiate 应该可以很好地处理索引变量。您能否使用 pyomo 版本、python 版本和说明行为的最小示例更新您的问题?

标签: python sympy pyomo


【解决方案1】:

要使用索引变量,请使用Indexed

>>> alpha1 = IndexedBase('alpha1')
>>> alpha1[0]
alpha1[0]

【讨论】:

  • 将所有变量定义为 IndexedBase 后,我仍然遇到同样的问题。我认为这是正确的解决方案,但 IndexBase 应该在 Pyomo 的 distinct 函数中调用。正如我在对我的问题的编辑中评论的那样,这似乎被列为未来 Pyomo 版本的待办事项。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 2015-07-12
  • 1970-01-01
  • 2015-06-17
  • 2023-02-10
相关资源
最近更新 更多