【问题标题】:Using a constructor function to hold parameters fixed: how does it works?使用构造函数来固定参数:它是如何工作的?
【发布时间】:2021-03-26 12:11:12
【问题描述】:

问题

我试图了解构造函数如何在我们需要时设法保持参数固定。

我正在查看彭的在线book 中的示例,我将其发布在下面。

在这种情况下,构造函数make.NegLogLik 用于构建一个计算负对数似然的函数nLL(在本书后面,nLL 将被优化。)

函数

这是构造函数的作用。

构造函数本身:

make.NegLogLik <- function(data, fixed = c(FALSE, FALSE)) {
  params <- fixed
  function(p) {
    params[!fixed] <- p
    mu <- params[1]
    sigma <- params[2]
    
    ## Calculate the Normal density
    a <- -0.5*length(data)*log(2*pi*sigma^2)
    b <- -0.5*sum((data-mu)^2) / (sigma^2)
    -(a + b)
  } 
}

现在让我们用它创建另一个函数,nLL,它实际上计算负对数似然

set.seed(1)
normals <- rnorm(100, 1, 2)

nLL <- make.NegLogLik(normals, c(FALSE, FALSE))

表示没有固定的参数。如果我现在调用nLL,它会返回一个函数:

nLL
#> function(p) {
#>     params[!fixed] <- p
#>     mu <- params[1]
#>     sigma <- params[2]
#>     
#>     ## Calculate the Normal density
#>     a <- -0.5*length(data)*log(2*pi*sigma^2)
#>     b <- -0.5*sum((data-mu)^2) / (sigma^2)
#>     -(a + b)
#>   }

现在我使用它:

nLL(c(1,2))
#> [1] 201.7361

但我也可以使用make.NegLogLik 来构建。一个不同的nLL,其中一个参数是固定的:

nLL <- make.NegLogLik(normals, c(FALSE, 2))
nLL(1)
#> [1] 201.7361

问题

make.NegLogLik 实际上是如何使其工作的?

它首先设置fixed = c(FALSE, FALSE)。那么:params &lt;- fixed,意思是params当然等于c(FALSE, FALSE)

我不明白的是function(p)里面,特别是这一行:

params[!fixed] <- p

我知道!fixed 等于c(TRUE, TRUE),但它不会被p 覆盖吗?

如果我一步一步尝试:

fixed = c(FALSE, 2)
params <- fixed
!fixed
#> [1]  TRUE FALSE
p <- 1
params[!fixed] <- p
params[!fixed]
#> [1] 1
mu <- params[1]
sigma <- params[2]
mu
#> [1] 1
sigma
#> [1] 2

我看到它正在工作,但我还是不明白 params[!fixed] &lt;- p 是如何让它工作的。

让我感到困惑的是,在这种情况下p 只是一个数字1,因为我设置了sigma = 2;但是p 可以是c(1,2),而params[!fixed] &lt;- p 仍然可以工作。

reprex package (v0.3.0) 于 2021-03-26 创建

【问题讨论】:

    标签: r optimization subset


    【解决方案1】:

    我想我明白了,params[!fixed] &lt;- p 所做的是将p 的值分配给params 中对应于!fixed 等于TRUE 的任何槽。

    # Example 1, with `fixed = c(FALSE, 2)`
    fixed = c(FALSE, 2)
    fixed
    #> [1] 0 2
    params <- fixed
    params
    #> [1] 0 2
    !fixed
    #> [1]  TRUE FALSE
    p <- 1
    params[!fixed] <- p
    params[!fixed]
    #> [1] 1
    params
    #> [1] 1 2
    
    # Example 2, with `fixed = c(FALSE, FALSE)`
    fixed = c(FALSE, FALSE)
    fixed
    #> [1] FALSE FALSE
    params <- fixed
    params
    #> [1] FALSE FALSE
    !fixed
    #> [1] TRUE TRUE
    p <- c(1,2)
    params[!fixed] <- p
    params[!fixed]
    #> [1] 1 2
    params
    #> [1] 1 2
    
    # Example 3, with `fixed = c(1, FALSE)`
    fixed = c(1, FALSE)
    fixed
    #> [1] 1 0
    params <- fixed
    params
    #> [1] 1 0
    !fixed
    #> [1] FALSE  TRUE
    p <- 2
    params[!fixed] <- p
    params[!fixed]
    #> [1] 2
    params
    #> [1] 1 2
    

    reprex package (v0.3.0) 于 2021-03-26 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2020-05-09
      • 2012-03-13
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多