Ошибки линейной зависимости в DiceKriging с линейно независимыми данными

Проблема (с минимальным рабочим примером)

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 выше, когда есть несколько близких параметров, чтобы получить эту ошибку. Я получил ошибки (в моей реальной проблеме, а не в MWE выше), когда 4 координаты точки находились примерно на расстоянии 1e-3 от другой точки, и возникла эта проблема.

Похожие вопросы

Вопросов о переполнении стека не так много DiceKriging. Самый близкий вопрос - этот (из Kriging package ), в котором проблема заключается в подлинной линейной зависимости. Обратите внимание, что пакет Kriging не является заменой пакета DiceKriging, поскольку он ограничен двумя измерениями.

Желаемое решение

Я хотел бы либо:

  • Способ изменить мой вызов km, чтобы избежать этой проблемы (предпочтительно)
  • Способ определить, когда возникнет эта проблема, чтобы я мог отбрасывать наблюдения, которые слишком близки друг к другу для вызова кригинга.

person Stuart    schedule 22.05.2015    source источник


Ответы (1)


Ваша проблема не программная. Скорее математический.

Ваши первые данные содержат две следующие точки (0 , 2) и (1e-7, 2), которые очень-очень близки, но соответствуют (очень) разным результатам: 4 и 5. Следовательно, вы пытаетесь настроить модель Кригинга, которая является интерполяционной моделью, на хаотический отклик. . Это не может работать. Моделирование кригинга/гауссовского процесса не является хорошим инструментом, если ваша реакция сильно различается между близкими точками.

Однако, когда вы оптимизируете дорогие модели, все обстоит не так, как на вашем примере. Нет такой разницы в отклике для очень близких точек входа. Но действительно может быть числовая проблема, если ваши точки очень близки.

Чтобы смягчить эти числовые ошибки, вы можете добавить эффект самородка. Самородок — это небольшая постоянная дисперсия, добавляемая к диагонали ковариационной матрицы, что позволяет не точно интерполировать точки. Ваша кривая аппроксимации кригинга не обязана проходить точно через точки обучения. Таким образом, модель кригинга становится моделью регрессии.

В 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)

Выдержка из документации по DiceKriging:

самородок: необязательное значение дисперсии, обозначающее эффект однородного самородка.

nugget.estim: необязательное логическое значение, указывающее, следует ли оценивать эффект самородка. Обратите внимание, что эта опция не относится к случаю разнородных зашумленных наблюдений (см. Noise.var ниже). Если задан самородок, он используется как начальное значение. По умолчанию ЛОЖЬ.

PS: Выбор ядра ковариации может быть важен в некоторых приложениях. Когда функция для аппроксимации довольно грубая, экспоненциальное ядро ​​(установите covtype="exp" в km) может быть хорошим выбором. Дополнительную информацию см. в книге Расмуссена и Вильямса (бесплатно и легально доступна по адресу http://www.gaussianprocess.org/)

person Pop    schedule 03.06.2015