我正在嘗試使用 R 的 optim() 函式優化函式的引數。這是函式:函式,因為mathjax不起作用 下面的代碼片段是我對其Log-Likelihood函式的實作,在這里
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-BFGS-B”方法,我會收到一條錯誤訊息,上面寫著“L-BFGS-B 需要 'fn' 的有限值”任何解決這個問題的方法都很棒!
謝謝!
uj5u.com熱心網友回復:
問題是該函式likelihood_levy要么回傳一個大于.Machine$double.xmax或在函式內的值,正在發生除以零。這條線可能是罪魁禍首:
sum(log(1 / (x - mu)))
如果x等于或非常接近mu,就會出現問題。您可以添加一些防御性代碼來檢查這一點。然而:
第一個引數必須小于 x
我認為沒有辦法做到這一點 optim
uj5u.com熱心網友回復:
有多個問題:
- 在 return 陳述句之前有一個無關的右大括號。
- 即使 lower 確保 x - mu 為正,在計算數值梯度時我們仍然會遇到問題,因此請使用無導數方法。
- optim 計算最小值,但我們想要最大似然,而不是最小似然。告訴 optim 最大化(我們在下面做)或使用負對數似然而不是對數似然。
- 起始值應該是可行的,即它應該是可以計算對數似然的。
- 我們需要處理 mu > min(x) 的情況。
- sample1 丟失,因此我們無法重現問題中的問題。
修復我們擁有的所有這些
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409216.html
標籤:
