当数据接近线性相关时,Dicekriging给出线性相关误差大约一半的时间。这可以通过下面的例子看出,当我在Ubuntu和Windows计算机上运行它时,它给出了大约一半的错误。当我使用遗传或BFGS优化运行它时会发生这种情况。
install.packages("DiceKriging")
library(DiceKriging)
x = data.frame(Param1 = c(0,1,2,2,2,2), Param2 = c(2,0,1,1e-7,0,2))
y = 1:6
duplicated(cbind(x,y))
Model = km( design = x, response = y , optim.method = "gen", control = list(maxit = 1e4), coef.cov = 1)
Model = km( design = x, response = y , optim.method = "BFGS", control = list(maxit = 1e4), coef.cov = 1)
当数据稍微分散时,不会发生此类错误。
# No problems occur if the data is more dispersed.
x = data.frame(Param1 = c(0,1,2,2,2,2), Param2 = c(2,0,1,1e-2,0,2))
y = 1:6
duplicated(cbind(x,y))
Model = km( design = x, response = y , optim.method = "gen", control = list(maxit = 1e4), coef.cov = 1)
使用Kriging优化昂贵的模型意味着最佳点附近的点将被密集采样。发生此错误时无法执行此操作。此外,当有多个参数全部接近时,接近点需要得到的误差可能比上面的1e-7
更接近。当一个点的4个坐标与另一个点相距1e-3
并且出现此问题时,我得到了错误(在我的实际问题中,而不是上面的MWE)。
关于堆栈溢出的问题不多DiceKriging
。最接近的问题是this one(来自Kriging
包),其中问题是真正的线性依赖。请注意,Kriging
包不能替代DiceKriging
,因为它仅限于2维。
我想要:
km
来电以避免此问题的方法(首选)答案 0 :(得分:3)
您的问题不是软件问题。这是一个数学问题。
您的第一个数据包含以下两点(0 , 2)
和(1e-7, 2)
非常接近但对应于(非常)不同的输出:4和5.因此,您正在尝试调整Kriging模型对于混沌响应,这是一个插值模型。这不行。如果您的响应在接近的点之间变化很大,那么克里金/高斯过程建模不是一个好工具。
但是,当您优化昂贵的模型时,事情与您的示例不同。非常接近的输入点的响应没有这种差异。 但是,如果你的观点非常接近,那么确实存在数值问题。
为了软化这些数字错误,您可以添加块金效果。块是添加到协方差矩阵的对角线的小的常数方差,这允许点不被精确地插值。您的克里金近似曲线不会被强制通过学习点。因此,克里金模型成为回归模型。
在 DiceKriging 中,可以通过两种方式添加块。首先,您可以选择先验值并通过设置km(..., nugget=you_value)
“手动”添加,或者您可以在学习协方差函数的参数的同时通过设置km
来学习它km(..., nugget.estim=TRUE)
。我建议你一般使用第二种。
那么你的小例子就变成了:
Model = km( design = x, response = y , optim.method = "BFGS", control = list(maxit = 1e4),
coef.cov = 1, nugget.estim=TRUE)
nugget :代表均质金块的可选方差值 影响。
nugget.estim :一个可选的布尔值,表示是否为金块 效果应该估计。请注意,此选项与此无关 异构噪声观测的情况(见下面的noise.var)。如果 给出了块,它被用作初始值。默认值为FALSE。
PS:在某些应用中,协方差内核的选择很重要。当近似函数非常粗糙时,指数内核(covtype="exp"
中的km
集)可能是一个不错的选择。有关更多信息,请参阅拉斯穆森和威廉姆斯一书(http://www.gaussianprocess.org/)