Jon*_*son 5 r mathematical-optimization
我一直在使用Excel解算器来处理以下问题
求解等式中的ab和c:
y = a*b*c*x/((1 - c*x)(1 - c*x + b*c*x))
Run Code Online (Sandbox Code Playgroud)
受限制
0 < a < 100
0 < b < 100
0 < c < 100
f(x[1]) < 10
f(x[2]) > 20
f(x[3]) < 40
Run Code Online (Sandbox Code Playgroud)
我有大约10(x,y)值对.我最小化了abs的总和(y - f(x)).并且我可以在每个x处约束函数结果的系数和值范围.
我尝试了nls(没有试图强加约束),虽然Excel提供了几乎我提供的任何起始值的估计值,但nls几乎从未返回答案.
我转而使用optim,但是我在应用约束时遇到了麻烦.
这是我到目前为止的地方 -
best = function(p,x,y){sum(abs(y - p[1]*p[2]*p[3]*x/((1 - p[3]*x)*(1 - p[3]*x + p[2]*p[3]*x))))}
p = c(1,1,1)
x = c(.1,.5,.9)
y = c(5,26,35)
optim(p,best,x=x,y=y)
Run Code Online (Sandbox Code Playgroud)
我这样做是为了添加第一组约束 -
optim(p,best,x=x,y=y,method="L-BFGS-B",lower=c(0,0,0),upper=c(100,100,100))
Run Code Online (Sandbox Code Playgroud)
我收到错误""ERROR:ABNORMAL_TERMINATION_IN_LNSRCH"
最终得到更高的错误值($ value).所以看起来我做错了什么.我根本无法弄清楚如何应用我的另一组约束.
有人能为我提供一个基本的想法,如何解决非统计学家可以理解的这个问题?我看了很多帖子,看了几本R书.R书最简单地使用了优化.
Vin*_*ynd 12
绝对值引入了一个奇点:您可能希望使用正方形,尤其是基于梯度的方法(例如L-BFGS).
函数的分母可以为零.
参数出现在产品中并且允许它们(任意接近)为零的事实也会导致问题.
您可以尝试使用其他优化器(优化任务视图上的完整列表),直到找到优化收敛的优化器.
x0 <- c(.1,.5,.9)
y0 <- c(5,26,35)
p <- c(1,1,1)
lower <- 0*p
upper <- 100 + lower
f <- function(p,x=x0,y=y0) sum(
(
y - p[1]*p[2]*p[3]*x / ( (1 - p[3]*x)*(1 - p[3]*x + p[2]*p[3]*x) )
)^2
)
library(dfoptim)
nmkb(p, f, lower=lower, upper=upper) # Converges
library(Rvmmin)
Rvmmin(p, f, lower=lower, upper=upper) # Does not converge
library(DEoptim)
DEoptim(f, lower, upper) # Does not converge
library(NMOF)
PSopt(f, list(min=lower, max=upper))[c("xbest", "OFvalue")] # Does not really converge
DEopt(f, list(min=lower, max=upper))[c("xbest", "OFvalue")] # Does not really converge
library(minqa)
bobyqa(p, f, lower, upper) # Does not really converge
Run Code Online (Sandbox Code Playgroud)
作为最后的手段,您始终可以使用网格搜索.
library(NMOF)
r <- gridSearch( f,
lapply(seq_along(p), function(i) seq(lower[i],upper[i],length=200))
)
Run Code Online (Sandbox Code Playgroud)