【问题标题】:How to configure the optimization algorithm during maximum likelihood estimation in OpenTURNS?如何在 OpenTURNS 中最大似然估计期间配置优化算法?
【发布时间】:2021-04-15 21:57:24
【问题描述】:

我有一个Sample,我想用最大似然估计拟合Beta 分布的参数。此外,我想将其参数截断为 [0,100] 区间。 MaximumLikelihoodFactory 应该很容易做到这一点,但问题是优化算法失败了。如何更改算法以使其成功?

这是一个简单的例子,我生成一个大小为 100 的样本,并使用 setKnownParameter 配置参数 a 和 b。

import openturns as ot

# Get sample
beta_true = ot.Beta(3.0, 1.0, 0.0, 100.0)
sample = beta_true.getSample(100)

# Fit
factory = ot.MaximumLikelihoodFactory(ot.Beta())
factory.setKnownParameter([0.0, 100.0], [2, 3])
beta = factory.build(sample)
print(beta)

前面的脚本产生:

Beta(alpha = 2, beta = 2, a = 0, b = 100)
WRN - Switch to finite difference to compute the gradient at point=[0.130921,-2.18413]
WRN - TNC went to an abnormal point=[nan,nan]

算法肯定会失败,因为 alpha 和 beta 的值相对于它们的默认值没有变化。

我不知道为什么会失败,可能是因为它使用了有限差分导数。无论如何,我想自定义优化算法,看看它是否可以改变结果,但我不知道如何做到这一点。

【问题讨论】:

    标签: python openturns


    【解决方案1】:

    ResourceMap 有一个允许配置优化算法的密钥。该值是一个字符串,它是默认算法的名称:

    "MaximumLikelihoodFactory-DefaultOptimizationAlgorithm": "TNC"
    

    代码使用此算法执行最大似然估计 (MLE)。但它没有说明可以设置什么值。实际上,MLE 的代码使用OptimizationAlgorithm.Build 静态方法来创建优化算法。根据文档,这是“要解决的算法或问题的名称。例如 TNC、Cobyla 或 NLopt 求解器名称之一。”。所以我可以配置,比如 M. J. D. Powell 的“Cobyla”算法:

    ot.ResourceMap.SetAsString("MaximumLikelihoodFactory-DefaultOptimizationAlgorithm", "Cobyla")
    factory = ot.MaximumLikelihoodFactory(ot.Beta())
    factory.setKnownParameter([0.0, 100.0], [2, 3])
    beta = factory.build(sample)
    print(beta)
    

    前面的脚本产生:

    Beta(alpha = 2.495, beta = 0.842196, a = 0, b = 100)
    

    这表明算法现在可以正确执行。 我也可以使用 NLOPT 的一种算法,例如“LN_AUGLAG”(这是一个“本地”算法,具有“N”个导数)。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2016-10-13
      • 1970-01-01
      • 2022-09-26
      • 2014-02-22
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多