R 中的多参数优化

Multi-parameter optimization in R

我正在尝试估计可以最大化特定事件发生可能性的参数。我的 objective 函数如下所示:

event_prob = function(p1, p2) {
  x = ((1-p1-p2)^4)^67 *
    ((1-p1-p2)^3*p2)^5 *
    ((1-p1-p2)^3*p1)^2 *
    ((1-p1-p2)^2*p1*p2)^3 *
    ((1-p1-p2)^2*p1^2) *
    ((1-p1-p2)*p1^2*p2)^2 *
    (p1^3*p2) *
    (p1^4)
  return(x)
}

在这种情况下,我正在寻找将最大化此函数的 p1 和 p2 [0,1]。我尝试按以下方式使用 optim()

aaa = optim(c(0,0),event_prob)

但我收到错误消息“fn(par, ...) 错误:缺少参数“p2”,没有默认值”。 我使用 optim() 错了吗?或者是否有不同的函数(包?)我应该用于多参数优化?

根据 Erwin Kalvelagen 的评论:重新定义函数 event_prob:

event_prob = function(p) {
  p1 = p[1]
  p2 = p[2]
  x = ((1-p1-p2)^4)^67 *
    ((1-p1-p2)^3*p2)^5 *
    ((1-p1-p2)^3*p1)^2 *
    ((1-p1-p2)^2*p1*p2)^3 *
    ((1-p1-p2)^2*p1^2) *
    ((1-p1-p2)*p1^2*p2)^2 *
    (p1^3*p2) *
    (p1^4)
  return(x)
}

您可能想要设置限制以确保 p1p2 满足您的限制:

optim(c(0.5,0.5),event_prob,method="L-BFGS-B",lower=0,upper=1)

这个问题其实可以通过解析来解决

objective函数简化为

F(p1,p2) = (1-p1-p2)^299 * p1^19 * p2^11

要在整个区域最大化

C = { (p1,p2) | 0<=p1, 0<=p2, p1+p2<=1 }

请注意,如果 p1=0 或 p2 =0 或 p1+p2 = 1,则 F 为 0,而如果其中 none 为真,则 F 为正。因此 F 的最大值出现在 C

的内部

记录日志

f(p1,p2) = 299*log(1-p1-p2) + 19*log(p1) + 11*log(p2)

事实上,解决更一般的问题同样容易:在 C 上最大化 f,其中

f( p1,..pN) = b*log( 1-p1-..-pn) + Sum{ a[j]*log(p[j])}
where b and each a[j] is positive and
C = { (p1,..pN) | 0<pj, j=1..N and p1+p2+..pN<1 }

临界点出现在f的所有偏导数都为零的地方,也就是

-b/(1-p1-..-pn) + a[j]/p[j] = 0 j=1..N

可以写成

b*p[j] + a[j]*(p1+..p[N]) = a[j] j=1..N

M*p = a
where M = b*I + a*Ones', and Ones is a vector with each component 1

M 的倒数是

inv(M) = (1/b)*(I - a*Ones'/(b + Ones'*a))

因此唯一的临界点是

p^ = inv(M)*a
   = a/(b + Sum{i|a[i]})

既然有最大值,而且只有一个临界点,那么临界点一定是最大值。