具有线性独立数据的 DiceKriging 中的线性相关性错误
Linear Dependence errors in DiceKriging with linearly independent data
问题(用最少的工作示例)
当数据接近线性相关时,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)
为什么这是个问题
使用克里金法优化昂贵的模型意味着将对接近最优值的点进行密集采样。发生此错误时无法执行此操作。此外,当有多个参数都接近时,接近点需要比上面的 1e-7
更接近才能得到这个错误。当一个点的 4 个坐标与另一个点相距 1e-3
左右并且出现此问题时,我得到了错误(在我的实际问题中,不是上面的 MWE)。
相关问题
栈溢出的问题DiceKriging
不多。最接近的问题是 (来自 Kriging
包),其中问题是真正的线性相关性。请注意,Kriging
包不能替代 DiceKriging
,因为它仅限于 2 个维度。
期望的解决方案
我想要:
- 一种更改我的
km
调用以避免此问题的方法(首选)
- 一种确定何时会出现此问题的方法,以便我可以删除对于克里格调用来说彼此太近的观测值。
您的问题不是软件问题。这更像是一个数学问题。
您的第一个数据包含以下两个点 (0 , 2)
和 (1e-7, 2)
,它们非常接近但对应于(非常)不同的输出:4 和 5。因此,您正在尝试调整Kriging 模型,是一种插值模型,对混沌响应。这行不通。 Kriging/Gaussian 如果您的响应在接近的点之间变化很大,那么流程建模不是一个好工具。
但是,当您优化昂贵的模型时,情况与您的示例不同。对于非常接近的输入点,响应没有这样的差异。
但是,如果您的观点非常接近,可能确实存在数值问题。
为了缓和这些数值错误,您可以添加 nugget 效果。 nugget 是添加到协方差矩阵对角线的小常量方差,它允许点不被精确插值。您的克里格近似曲线不会被迫准确地通过学习点。这样,克里金模型就变成了回归模型。
在DiceKriging中,可以通过两种方式添加金块。首先,你可以选择一个先验a值,通过设置km(..., nugget=you_value)
加上"manually",或者你可以让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: an optional variance value standing for the homogeneous nugget
effect.
nugget.estim: an optional boolean indicating whether the nugget
effect should be estimated. Note that this option does not concern the
case of heterogeneous noisy observations (see noise.var below). If
nugget is given, it is used as an initial value. Default is FALSE.
PS:协方差核的选择在某些应用中可能很重要。当要逼近的函数比较粗糙时,指数内核(在km
中设置covtype="exp"
)可能是一个不错的选择。有关更多信息,请参阅 Rasmussen 和 Williams 的书(可在 http://www.gaussianprocess.org/ 免费合法获取)
问题(用最少的工作示例)
当数据接近线性相关时,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)
为什么这是个问题
使用克里金法优化昂贵的模型意味着将对接近最优值的点进行密集采样。发生此错误时无法执行此操作。此外,当有多个参数都接近时,接近点需要比上面的 1e-7
更接近才能得到这个错误。当一个点的 4 个坐标与另一个点相距 1e-3
左右并且出现此问题时,我得到了错误(在我的实际问题中,不是上面的 MWE)。
相关问题
栈溢出的问题DiceKriging
不多。最接近的问题是 Kriging
包),其中问题是真正的线性相关性。请注意,Kriging
包不能替代 DiceKriging
,因为它仅限于 2 个维度。
期望的解决方案
我想要:
- 一种更改我的
km
调用以避免此问题的方法(首选) - 一种确定何时会出现此问题的方法,以便我可以删除对于克里格调用来说彼此太近的观测值。
您的问题不是软件问题。这更像是一个数学问题。
您的第一个数据包含以下两个点 (0 , 2)
和 (1e-7, 2)
,它们非常接近但对应于(非常)不同的输出:4 和 5。因此,您正在尝试调整Kriging 模型,是一种插值模型,对混沌响应。这行不通。 Kriging/Gaussian 如果您的响应在接近的点之间变化很大,那么流程建模不是一个好工具。
但是,当您优化昂贵的模型时,情况与您的示例不同。对于非常接近的输入点,响应没有这样的差异。 但是,如果您的观点非常接近,可能确实存在数值问题。
为了缓和这些数值错误,您可以添加 nugget 效果。 nugget 是添加到协方差矩阵对角线的小常量方差,它允许点不被精确插值。您的克里格近似曲线不会被迫准确地通过学习点。这样,克里金模型就变成了回归模型。
在DiceKriging中,可以通过两种方式添加金块。首先,你可以选择一个先验a值,通过设置km(..., nugget=you_value)
加上"manually",或者你可以让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: an optional variance value standing for the homogeneous nugget effect.
nugget.estim: an optional boolean indicating whether the nugget effect should be estimated. Note that this option does not concern the case of heterogeneous noisy observations (see noise.var below). If nugget is given, it is used as an initial value. Default is FALSE.
PS:协方差核的选择在某些应用中可能很重要。当要逼近的函数比较粗糙时,指数内核(在km
中设置covtype="exp"
)可能是一个不错的选择。有关更多信息,请参阅 Rasmussen 和 Williams 的书(可在 http://www.gaussianprocess.org/ 免费合法获取)