最小化 R

问题描述

我有一个 600 x 500 布尔数组 data,其中的单元格代表覆盖欧洲大部分地区的地理 0.1' x 0.1' 网格单元格。 TRUE 单元格是那些网格单元格,其中(根据我的天气模拟)某种化学物质从固定点释放几天后应该可以检测到。我的目标是找到一个圆锥体,由两个方位角和一个距离定义,起源于释放点,最适合这个可检测区域。

为此,我创建了 600 x 500 数组 bearing_arraydistance_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,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,2.5 * 10**5,这在视觉上看起来是一个很好的初始猜测,还是一个故意糟糕的猜测。

我之前在将 optim 用于其他类型的函数时没有遇到任何问题,所以我怀疑这里的不连续性可能是罪魁祸首 - 即 mismatch_zone 分数的值没有改变参数中的扰动足够小,所以也许优化器认为它被困在平坦的平台上并放弃(?)

(注意:我很清楚轴承从 180 滚动到 -180 的边界区域。这与问题无关。)

解决方法

没关系,我解决了。事实证明,L-BFGS-B 不是一个合适的方法选择。改用全局模拟退火法SANN解决了问题。