автоматически пробовать разные начальные значения в Optim - PullRequest
1 голос
/ 24 сентября 2019

Я использую optim(.), чтобы попытаться найти наиболее подходящие параметры для некоторой функции fn(dat, par, out=FALSE), где par должен быть вектором двух элементов, а out определяет формат вывода.Я использую

optim(par=c(1,1), fn, dat=dat)

, чтобы определить наиболее подходящие значения par.В зависимости от данных в dat это либо работает, либо выдает ошибку, что

function cannot be evaluated at initial parameters

, что, как я понимаю, требует различных начальных значений для optim(.).Моя проблема в том, что я применяю функцию ко многим наборам данных параллельно и задаюсь вопросом, действительно ли мне нужно попробовать разные значения вручную или есть какой-то способ автоматизировать это по принципу

if no error then great
if error try par=c(0.5,1)
if no error then great
if error try par=c(0.5,0.5)
...

1 Ответ

0 голосов
/ 25 сентября 2019

Вы можете запустить поиск по сетке, прежде чем запускать и отбрасывать NA параметры.Вот пример.

Тестовая функция:

fn <- function(x) {
    if (x[1] < 0)
        NA
    else
        prod(x)
}

Теперь запустите поиск по сетке.

library("NMOF")    
res <- gridSearch(fn,
                  npar = 2,   ## length of x
                  lower = -1, ## lower bound for x
                  upper = 3,  ## upper bound for x                
                  n = 5)      ## number of levels per element in x
## 2 variables with 5, 5 levels: 25 function evaluations required.

Функция показывает вам все комбинации параметров, которые она пробовала.

res$levels
## [[1]]
## [1] -1 -1
## 
## [[2]]
## [1]  0 -1
## 
## [[3]]
## [1]  1 -1
##
##  ....

И он предоставляет значения целевой функции, связанные с этими комбинациями.

res$values
##  [1] NA  0 -1 -2 -3 NA  0  0  0  0 NA  0  1  2  3
## [16] NA  0  2  4  6 NA  0  3  6  9

## => many objective functions values are NA

Лучшее (не- NA) решение:

res$minlevels 
## [1]  3 -1

## => your starting value for optim:
##
##    optim(gridSearch(fn, npar = 2,
##                     lower = -1, upper = 3, n = 5)$minlevels,
##          fn, dat = dat)

Конечно, это не даст вам гарантии, что найден хотя бы один не-NA вектор, но шансы могут улучшиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...