【发布时间】:2021-01-31 11:33:52
【问题描述】:
我有一个600 x 500 布尔数组data,其中的单元格代表覆盖欧洲大部分地区的地理0.1' x 0.1' 网格单元。 TRUE 单元格是那些网格单元格,其中(根据我的天气模拟)某种化学物质从固定点释放几天后应该可以检测到。我的目标是找到一个锥体,由两个方位角和一个距离定义,从释放点开始,最适合这个可检测区域。
为此,我创建了600 x 500 数组bearing_array 和distance_array,其中每个单元格的值表示从释放位置到该网格单元的方位和距离,以及函数:
#Return Boolean array of cells which belong to cone of given bearing, width, and extent:
in_zone <- function(central_bearing, cone_width, distance) {
upper_bearing <- central_bearing + cone_width/2
lower_bearing <- central_bearing - cone_width/2
return( (bearing_array >= lower_bearing) * (bearing_array <= upper_bearing) * (dist_array[,] <= distance) )
}
#Return fraction of grid cells where the cone's prediction does not match with the data (this fraction is the quantity to be minimized)
mismatch_zone <- function(params, arr) {
central_bearing <- params[1]
cone_width <- params[2]
distance <- params[3]
return( mean( in_zone(central_bearing, cone_width, distance) != arr ) )
}
我正在尝试将锥体的参数拟合如下:
guess <- c(-40, 10, 2.5 * 10**5)
lower <- c(-180, 0.1, 10**1)
upper <- c(180, 90, 10**7)
fit <- optim(guess, mismatch_zone, arr = data, lower = lower, upper = upper, method="L-BFGS-B")
但optim 仅在 1 次迭代和 1 次评估后继续退出,只是返回初始猜测:
> fit
$par
[1] -40 10 250000
$value
[1] 0.00032
$counts
function gradient
1 1
$convergence
[1] 0
$message
[1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"
无论我是否使用上述初始猜测 c(-40, 10, 2.5 * 10**5,这种情况总是会发生,这在视觉上似乎是一个很好的初始猜测,还是故意糟糕的猜测。
我以前使用optim 处理其他类型的函数没有遇到任何问题,所以我怀疑这里可能是不连续性的原因 - 即mismatch_zone 分数的值不会因为足够小的扰动而改变参数,所以也许优化器认为它被困在一个平坦的平台上并放弃了(?)
(注意:我很清楚轴承从180滚动到-180的边界区域。这与问题无关。)
【问题讨论】:
标签: r optimization minimization