R 具有线性无关数据的双克里金中的线性相关误差 问题(以最少的工作示例)

R 具有线性无关数据的双克里金中的线性相关误差 问题(以最少的工作示例),r,kriging,R,Kriging,当数据接近线性相关时,双克里金给出线性相关误差的时间约为一半。下面的例子可以看出这一点,当我在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 duplicate

当数据接近线性相关时,双克里金给出线性相关误差的时间约为一半。下面的例子可以看出这一点,当我在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),并且出现了此问题

相关问题 关于堆栈溢出的
dieckriging
问题不多。最接近的问题是(来自
Kriging
包),其中问题是真正的线性依赖。请注意,
Kriging
包不能替代
dieckriging
,因为它仅限于二维

期望的解决方案 我想:

  • 更改我的
    km
    呼叫以避免此问题的方法(首选)
  • 确定此问题何时发生的一种方法,以便我可以删除对克里格调用来说彼此太近的观测值

    • 您的问题不是软件问题。这相当于一个数学问题

      您的第一个数据包含以下两个点
      (0,2)
      (1e-7,2)
      ,它们非常接近,但对应(非常)不同的输出:4和5。因此,您正在尝试调整克里格模型,这是一种插值模型,以适应混沌响应。这是行不通的。如果您的响应在接近的点之间变化很大,那么克里格/高斯过程建模不是一个好工具

      然而,当您优化昂贵的模型时,情况与您的示例不同。对于非常接近的输入点,响应没有这样的差异。 但是,如果你们的点非常接近的话,可能确实存在数值问题

      为了缓和这些数值误差,您可以添加熔核效应。熔核是一个小的常量方差,添加到协方差矩阵的对角线上,这使得点不能精确插值。您的克里格近似曲线不会被强制通过学习点。因此,克里格模型成为回归模型

      DiceKriging中,可以通过两种方式添加金块。首先,您可以通过设置
      km(…,nugget=you_value)
      选择一个先验值并“手动”添加它,或者您可以通过设置
      km(…,nugget.estim=TRUE)
      km
      在学习协方差函数参数的同时学习它。我建议你一般使用第二种

      你的小例子变成:

      Model = km( design = x, response = y , optim.method = "BFGS", control = list(maxit = 1e4), 
      coef.cov = 1, nugget.estim=TRUE)
      
      摘自:

      熔核:代表均质熔核的可选方差值 效果

      nugget.estim:一个可选的布尔值,指示是否 应估计影响。请注意,此选项与 非均匀噪声观测情况(见下文noise.var)。如果 给出了熔核,并将其用作初始值。默认值为FALSE


      PS:协方差核的选择在某些应用中可能很重要。当要近似的函数相当粗糙时,指数核(在
      km
      中设置
      covtype=“exp”
      )是一个不错的选择。有关更多信息,请参阅Rasmussen和Williams的著作(可在网站免费合法获取)

      您的问题不是软件问题。这相当于一个数学问题

      您的第一个数据包含以下两个点
      (0,2)
      (1e-7,2)
      ,它们非常接近,但对应(非常)不同的输出:4和5。因此,您正在尝试调整克里格模型,这是一种插值模型,以适应混沌响应。这是行不通的。如果您的响应在接近的点之间变化很大,那么克里格/高斯过程建模不是一个好工具

      然而,当您优化昂贵的模型时,情况与您的示例不同。对于非常接近的输入点,响应没有这样的差异。 但是,如果你们的点非常接近的话,可能确实存在数值问题

      为了缓和这些数值误差,您可以添加熔核效应。熔核是一个小的常量方差,添加到协方差矩阵的对角线上,这使得点不能精确插值。您的克里格近似曲线不会被强制通过学习点。因此,克里格模型成为回归模型

      DiceKriging中,可以通过两种方式添加金块。首先,您可以通过设置
      km(…,nugget=you_value)
      选择一个先验值并“手动”添加它,或者您可以通过设置
      km(…,nugget.estim=TRUE)
      km
      在学习协方差函数参数的同时学习它。我建议你一般使用第二种

      你的小例子变成:

      Model = km( design = x, response = y , optim.method = "BFGS", control = list(maxit = 1e4), 
      coef.cov = 1, nugget.estim=TRUE)
      
      摘自:

      熔核:代表均质熔核的可选方差值 效果

      nugget.estim:一个可选的布尔值,指示是否 应估计影响。请注意,此选项与 非均匀噪声观测情况(见下文noise.var)。如果 给出了熔核,并将其用作初始值。德福