【问题标题】:Reparametrize to remove constraints for optimization (R)重新参数化以消除优化约束 (R)
【发布时间】:2015-02-27 00:59:46
【问题描述】:

我正在自学如何在 R 中运行一些马尔可夫模型,方法是阅读教科书“时间序列的隐马尔可夫模型:使用 R 的介绍”。我对如何实施文中提到的东西有点困惑。

所以,我有以下功能:

f <- function(samples,lambda,delta) -sum(log(outer(samples,lambda,dpois)%*%delta))

我可以使用以下方法对 lambda 进行优化:

optim(par, fn=f, samples=x, delta=d)
where "par" is the initial guess for lambda, for some x and d. 

效果很好。但是,在与我试图重现的示例相对应的文本部分中,他们指出:“参数 delta 和 lambda 受 sum(delta_i)=1 for i=1,...m, delta_i>0 的约束,和 lambda_i>0。因此,如果希望使用无约束的优化器(例如 nlm),则有必要重新参数化。一种可能性是最大化关于 2m-1 无约束参数的可能性”。

无约束参数由

给出
eta<-log(lambda) 
tau<-log(delta/(1-sum(delta))

我不完全明白如何去实现它。我将如何编写一个函数来优化这个转换后的参数空间?

【问题讨论】:

  • 我不清楚这里涉及的对象的确切形状。带有示例输入数据的清晰 reproducible example 将非常有帮助。
  • 将不受约束的参数合并到目标函数中,即用etatau 表示。正如@MrFlick 建议的那样,提供一个可重现的示例。

标签: r optimization constraints


【解决方案1】:

当使用optim() 时没有像这样的参数转换:

simpleFun  <-  function(x)
                   (x-3)^2
out = optim(par=5,
            fn=simpleFun)

参数估计集将通过out$par 获得,即3 in 如您所料,这种情况。或者,您可以包装您的功能 f 在转换中的参数如下:

out = optim(par=5,
            fn=function(x)
                # apply the transformation x -> x^3
                simpleFun(x^3))

现在是获得正确的最佳参数集的技巧 您需要将 same 转换应用于参数的函数 估计如下:

(out$par)^3
#> 2.99741 

(是的,参数估计略有不同。对于这个人为的 例如,您可以设置method="BFGS" 以获得更好的估计。无论如何,这表明转换的选择确实很重要 有些情况,但那是另一个讨论...)

要完成答案,听起来您想像这样使用包装器

# the function to be optimized
f <- function(samples,lambda,delta) 
    -sum(log(outer(samples,lambda,dpois)%*%delta))

out <- optim(# par it now a 2m vector
             par = c(eta1 = 1,
                     eta2 = 1,
                     eta3 = 1,
                     tau1 = 1,
                     tau2 = 1,
                     tau3 = 1),

             # a wrapper that applies the constraints
             fn=function(x,samples){
                 # exp() guarantees that the values of lambda are > 0
                 lambda = exp(x[1:3]) 
                 # delta is also > 0
                 delta = exp(x[4:6])
                 # and now it sums to 1
                 delta = delta / sum(delta)
                 f(samples,lambda,delta)
             },
             samples=samples)

以上保证了传递给f()的参数具有正确的约束,只要你对out$par应用相同的变换,optim()就会为f()估计一组最优参数。

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2021-12-11
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多