我需要使用" optimx"但我发现当我更改起始值时输出会发生变化。这是正常的还是我的脚本中有错误?:
dat1 <- array(1:60, c(3,5,4));dat2 <- array(1:60, c(3,5,4));dat3 <- array(1:60, c(3,5,4))
#reorder dimensions
dat1 <- aperm(dat1, c(3,1,2)); dat2 <- aperm(dat2, c(3,1,2));dat3 <- aperm(dat3, c(3,1,2))
#make array a matrix
dat1a <- dat1;dim(dat1a) <- c(dim(dat1)[1],prod(dim(dat1)[2:3]))
dat2a <- dat2;dim(dat2a) <- c(dim(dat2)[1],prod(dim(dat2)[2:3]))
dat3a <- dat3;dim(dat3a) <- c(dim(dat3)[1],prod(dim(dat3)[2:3]))
案例一:
fun <- function(x1, x2, y) {
keep <- !(is.na(x1) | is.na(x2) | is.na(y))
if (sum(keep) > 0) {
best=function(p,x1, x2, y){
sum((y [keep]-(((p[1]*x1[keep]+p[2]*x2[keep]+p[3])^p[4])+p[5]))^2)}
res <- optimx(c(0.5,3,4,0.1,1.8),best,x1=x1,x2=x2,y=y)
res <- coef(res)[1:5]
} else { res <- c(NA, NA, NA,NA,NA) }
return(res)}
res2 <- mapply(fun, x1=as.data.frame(dat1a), x2=as.data.frame(dat2a), y=as.data.frame(dat3a))
RES2:
V1 V2 V3 V4 V5 V6 V7
[1,] -6.4508094 4.3192551 -4.4118228 0.96978160 -5.3236129 1.7360552 6.7636543
[2,] -0.7073374 -0.7404623 -0.7490429 -0.56937504 -0.6729419 -0.7373379 -0.7387721
案例二:
# same function but I changed the starting values
fun=function(x1, x2, y) {
keep <- !(is.na(x1) | is.na(x2) | is.na(y))
if (sum(keep) > 0) {
best=function(p,x1, x2, y){
sum((y [keep]-(((p[1]*x1[keep]+p[2]*x2[keep]+p[3])^p[4])+p[5]))^2)}
res <- optimx(c(1,1,1,1,1),best,x1=x1,x2=x2,y=y)
res <- coef(res)[1:5]
} else { res <- c(NA, NA, NA,NA,NA) }
return(res)}
res3 <- mapply(fun, x1=as.data.frame(dat1a), x2=as.data.frame(dat2a), y=as.data.frame(dat3a))
RES3:
V1 V2 V3 V4 V5 V6 V7 V8
[1,] 0.6018246 0.1993663 -0.2520812 -0.1702029 -1.176793 -6.513526 -0.1749120 -1.329519
[2,] 7.6637890 3.4957285 3.0466838 2.2510481 1.601970 1.245830 1.0175985 0.852469
答案 0 :(得分:3)
您的脚本中没有错误。这是优化器的工作方式。在您的情况下,您使用optimx
和默认参数(即未指定方法以及上限和下限参数),这意味着内部optimx
将使用基本R optim
函数默认的Nelder-Mead
方法。
我引用Wikipedia(这可能不是最好的来源,但它正确解释了):
Nelder-Mead方法或下坡单纯形法或变形虫方法是一种常用的非线性优化技术,对于可能不知道衍生物的问题,这是一种定义明确的数值方法。然而,Nelder-Mead技术是一种启发式搜索方法,它可以收集到非固定点[1],解决可通过替代方法解决的问题。[2]
上面引用的关键字,我强调的是启发式:
启发式,是解决问题,学习或发现的任何方法,它采用不保证最佳或完美的实用方法,但足以实现直接目标。
因此,optim
函数试图在你的情况下找到一个局部最小值,它将提供一个快速的次优解(即它没有找到全局最小值)。这是出于速度和计算目的而发生的。
因此,通过更改初始值,您可以更改方法的起点,因此每次获得不同的局部最小值。
其余的方法以类似的方式工作,但研究每种方法以确定是否正在计算启发式解决方案是有意义的。
This是我发现的另一个类似的问题,它提供了一个很好的解释。