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)
}
您可能想要设置限制以确保 p1
和 p2
满足您的限制:
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]})
既然有最大值,而且只有一个临界点,那么临界点一定是最大值。
我正在尝试估计可以最大化特定事件发生可能性的参数。我的 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)
}
您可能想要设置限制以确保 p1
和 p2
满足您的限制:
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]})
既然有最大值,而且只有一个临界点,那么临界点一定是最大值。