Оптимальная функция, возвращающая неверное решение - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь получить минимум функции с optim в R, проблема в том, что решение, возвращаемое методом, неверно, и меняюсь, если я ввожу другую начальную точку. Я покажу вам некоторый код и вывод при получении. Чего мне не хватает?

> funx = function(vx) (vx[1] -2)^4 + (vx[1]-2*vx[2])^2 + -10/(vx[1]^2-vx[2])
> optim(c(0,1), funx)
$par
[1] 0.7080021 1.5315815

$value
[1] 18.03898

$counts
function gradient 
      61       NA 

$convergence
[1] 0

$message
NULL

> optim(c(0,3), funx)
$par
[1] 1.271924 1.617791

$value
[1] -4.5036e+16

$counts
function gradient 
     237       NA 

$convergence
[1] 0

$message
NULL

> funx(c(1.271924, 1.617791))
[1] 29566209

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Действительно, это проблема округления. Если вы вернете точные значения обратно к funx(), вы получите небольшое (т.е. очень отрицательное) значение: если вы округлите до шести цифр, вы получите большое значение.

oo <-optim(c(0,3), funx)
funx(oo$par)
## [1] -4.5036e+16
 funx(round(oo$par,6))
## [1] 29566209

Это действительно плохое поведение, вам, возможно, придется принять это во внимание при работе с ней. (Я бы также настоятельно рекомендовал использовать оптимизацию на основе производных, либо рассчитать производные самостоятельно, либо использовать deriv().)

0 голосов
/ 26 апреля 2019

Вы можете добавить, например, method = "L-BFGS-B" в вашем оптимизаторе и определить верхний и нижний пределы ваших параметров в зависимости от вашего определения функции. Это может произвести значения из их оригинальных интервалов.

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