首页 > 解决方案 > 如何为采用点坐标的函数设置 R 的 optim() 起始值?

问题描述

我在 R 中构建了一个简单的函数,其中包含四个参数。这四个参数是两点的坐标,AC

该函数根据 和 的位置计算罚AC

我想知道构建此功能的最佳方法是什么,因为我稍后会对其进行优化以找到给我最小惩罚的点坐标。

我应该创建一个接受四个参数的函数吗?看这个玩具例子:

simple_function1 <- function(x,y,z,w) {
  sum_coordinates <- sum(x+y) + sum(z+w)
  distance <- w-y
  penalty <- sum_coordinates + distance
  return(penalty)
}

simple_function1(0,1,0,0)
#> [1] 0

或者我应该接受一个接受两点坐标的函数?

pointA <- c(0,1)
pointC <- c(0,0)
simple_function2 <- function(A,C) {
  sum_coordinates <- sum(A[1]+A[2]) + sum(C[1]+C[2])
  distance <- C[2]-A[2]
  penalty <- sum_coordinates + distance
  return(penalty)
}
simple_function2(pointA,pointC)
#> [1] 0

创建函数后,我想对其进行优化。我需要给optim().

例如,如果我尝试优化第一个功能,则simple_function1


optim_output1 <- optim(par = c(0,0,0,0), # Applying optim
                       fn = simple_function1
)

我收到一个错误:

#> Error in fn(par, ...): argument "y" is missing, with no default

第二个版本simple_function2对我来说更有意义,但我不知道如何判断optim()起始值是什么。

我努力了:

optim_output2 <- optim(par = c(c(0,0),c(0,0)), # Applying optim
                       fn = simple_function2
)

但我得到一个类似的错误:

#> Error in fn(par, ...): argument "C" is missing, with no default

标签: roptimization

解决方案


我重写了我的函数,使它只需要一个参数,一个包含四个值的向量:

# create function
simple_function <- function(x) {
  xa <- x[1]
  ya <- x[2]
  xm <- x[3]
  ym <- x[4]
  sum_coordinates <- sum(xa+ya) + sum(xm+ym)
  distance <- ym - ya
  tot <- sum_coordinates + distance
  return(tot)
}
# the function takes a vector
vec <- c(1,1,0,0)
simple_function(vec)
#> [1] 1

现在optim()工作:

# optimizing the function
optim_output <- optim(par = c(0,0,0,0), # Applying optim
                       fn = simple_function
)

但使用包装函数会更好:

toy_function <- function(x,y,z,w) {
  sum_coordinates <- sum(x+y) + sum(z+w)
  distance <- w-y
  penalty <- sum_coordinates + distance
  return(penalty)
}

wrapper = function(args){
  toy_function(x = args[1],
                 y = args[2],
                 z = args[3],
                 w = args[4])
}

# the function takes a vector
vec <- c(1,1,0,0)
wrapper(vec)
#> [1] 1
#> [1] 1

  
# optimizing the function
optim_output <- optim(par = c(0,0,0,0), # Applying optim
                        fn = wrapper
  )

optim_output
#> $par
#> [1]  4.905791e+21  1.614870e+23 -2.644937e+22 -3.214087e+23
#> 
#> $value
#> [1] -6.64361e+23
#> 
#> $counts
#> function gradient 
#>      501       NA 
#> 
#> $convergence
#> [1] 1
#> 
#> $message
#> NULL

reprex 包(v0.3.0)于 2021-03-26 创建


推荐阅读