问题描述
我有一个 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,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
解决了问题。