r - 如何为采用点坐标的函数设置 R 的 optim() 起始值?
问题描述
我在 R 中构建了一个简单的函数,其中包含四个参数。这四个参数是两点的坐标,A
和C
。
该函数根据 和 的位置计算罚A
分C
。
我想知道构建此功能的最佳方法是什么,因为我稍后会对其进行优化以找到给我最小惩罚的点坐标。
我应该创建一个接受四个参数的函数吗?看这个玩具例子:
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
解决方案
我重写了我的函数,使它只需要一个参数,一个包含四个值的向量:
# 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 创建
推荐阅读
- python - 如何在 Django ManyToManyField 中通过类使用 ManyRelatedManager 的 add()、set() 和 clear() 方法?
- c# - JSON 到 c# 类序列化返回 null
- excel - 打开excel时如何停止自动数据透视表计算
- chart.js - 使时间序列在轴上显示最后日期?
- max - 查找一个月的最大每周平均值
- javascript - 无法在 ReastJS useEffect 挂钩中清空数组
- java - 如何找到一个视觉列表的大小
- javascript - 为每个标签突出显示具有不同颜色的选定文本
- java - 在android camerax图像分析中检测文档角的最佳方法是什么?
- android - 如何使用 QtAndroid::androidActivity().callObjectMethod 获取 int 值?