在二元函数上使用 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)
}
我想最小化的值是a
和b
,a
和b
的值如下:
a= seq(0.1,5,by=0.25)
b= seq(0,2,by=0.1)
现在我可以用 a
和 b
绘制函数,首先定义 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 感兴趣。
我在优化具有两个参数的函数时遇到问题。
# 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)
}
我想最小化的值是a
和b
,a
和b
的值如下:
a= seq(0.1,5,by=0.25)
b= seq(0,2,by=0.1)
现在我可以用 a
和 b
绘制函数,首先定义 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 感兴趣。