我正在尝试使用R的optim()函数来优化具有绑定的函数的参数。下面是函数:函数,因为mathjax不工作。下面的代码片段是我实现的它的日志-似然函数,即这里
likelihood_levy <- function(params, x){
mu <- params[1]
sigma <- params[2]
n <- length(x)
ans <- ((1.5 * n) * log(sigma)) +
sum(log(1 / (x - mu))) -
(n * log(sqrt(2*pi) * sigma)) -
(0.5 * sigma * sum(1 / (x - mu)))
}
return(ans)
}
optim(c(-10, 2), likelihood_levy, x = sample1, method="L-BFGS-B",
lower = c(min(sample1) - 0.001, 0))
如何向函数定义中添加参数边界?例如,第一个参数必须小于x,第二个参数不应该低于0。
注意:如果我使用optim()函数的“L B”方法,我会得到一个错误:“L B需要‘fn’的有限值”--任何解决这个问题的方法都会很好!
谢谢!
发布于 2022-01-12 13:37:25
有许多问题:
修复我们所有的这些
likelihood_levy <- function(params, x){
mu <- params[1]
sigma <- params[2]
n <- length(x)
ans <- if (mu >= min(x)) -Inf
else ((1.5 * n) * log(sigma)) +
sum(log(1 / (x - mu))) -
(n * log(sqrt(2*pi) * sigma)) -
(0.5 * sigma * sum(1 / (x - mu)))
return(ans)
}
set.seed(123)
sample1 <- rnorm(25)
st <- c(min(sample1) - 0.001, 1)
res <- optim(st, likelihood_levy, x = sample1, control = list(fnscale = -1))
str(res)
给予
List of 5
$ par : num [1:2] -2.25 1.61
$ value : num -46.6
$ counts : Named int [1:2] 45 NA
..- attr(*, "names")= chr [1:2] "function" "gradient"
$ convergence: int 0
$ message : NULL
发布于 2022-01-12 09:46:03
问题是,函数likelihood_levy
要么返回大于.Machine$double.xmax
的值,要么在函数中发生除法。这条线可能是罪魁祸首:
sum(log(1 / (x - mu)))
如果x
等于或非常接近mu
,就会出现问题。您可以添加一些防御代码来检查这一点。然而:
第一个参数必须小于x。
我不认为optim
有办法做到这一点
https://stackoverflow.com/questions/70678537
复制相似问题