-1

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

这是一个简单的示例,其中我生成了一个大小为 100 的样本,并使用setKnownParameter.

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 的值相对于它们的默认值没有变化。

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

4

1 回答 1

0

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

"MaximumLikelihoodFactory-DefaultOptimizationAlgorithm": "TNC"

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

于 2021-01-10T21:32:15.957 回答