在二元函数上使用 optim

Using optim on a two-variable function

我在优化具有两个参数的函数时遇到问题。

# Creating a corresponding mock data set
N=2000
x <- rnorm(N,0,1)
x <- cumsum(x)
n=length(x)

k=1

dx = rep(0,n-k)
for (i in k:(n - 1)){
  sumx = 0
  for (j in 0:k){
    sumx = sumx + (-1)^j*choose(k,j)*x[i-j+1]
  }
  dx[i-k+1] = sumx
}

vpk <- matrix(ncol = 1, nrow = 10)
for (p in seq(from=1, to=10,by=1)) { 
  vpk[p*1] <- sum(abs(dx)^p)
}

vpk = data.frame(vpk);
names(vpk)='V1';
vpk$V2 = 1:10;

现在我的最小化函数

Rab <- function(a,b){
  g <- ifelse(a>0 & a<1-1/p & p >=b & b<=2, a*p,
              ifelse(a>0 & a<1-1/b & p< b & b<=2, -1+(a+1/b),
                     ifelse(a >= 1-1/pmax(p,b) & b<=2,-1+p,NA)))
} 

#p=1
suma <- function(a,b){
  sume=0
  for(p in seq(from=1,to=10, by=1)){
    sume = sume + (log(vpk$V1[p])/log(n^(-1))-outer(a,b,Rab))^2
  }
  return(sume)
}

我想最小化的值是abab的值如下:

a= seq(0.1,5,by=0.25)
b= seq(0,2,by=0.1)

现在我可以用 ab 绘制函数,首先定义 z

z <-suma(a,b)

persp(a,b,z, theta=-135, phi=45, ticktype='detailed')
image(a,b,z)
contour(a,b,z, add=T)

在这里我可以看到对于要最小化的函数,a 应该接近 0,并且可以介于 0 和 2 之间。

现在,我要做的是最小化'suma'。这是我遇到麻烦的地方。我已经完成了:

optim(c(0.00001,1.5), suma)

但我想我需要使 suma 成为一个只有一个参数的函数才能让它工作。任何帮助表示赞赏!我试过 optim,但我可能想尝试另一个包?

将您的函数更改为:

suma <- function(par){
  sume=0
  for(p in seq(from=1,to=10, by=1)){
    sume = sume + (log(vpk$V1[p])/log(n^(-1))-outer(par[1],par[2],Rab))^2
  }
  return(sume)
}

您可能会对包 optimx 感兴趣。