Как оптимизировать несколько массивов в R? - PullRequest
0 голосов
/ 04 мая 2020

Мне нужно минимизировать функцию, основанную на Hsieh Model , используя язык R. Основная цель - минимизировать функцию расстояния, которая зависит от набора других функций.

obj = function(x1){
  s = sf()
  h_til = h_tilf()
  w_til = w_tilf(x1)
  w_r = w_rf()
  p_ir = p_irf()
  #H_tr = H_trf(x1)
  W = Wf(x1)      
  f1 = matrix(0, i, r)
  f2 = matrix(0, i, r)    

  for (c in 1:i){
    for (j in 1:r){
      f1[c, j] = ( (W[c, j] - W_t[c, j]) / W_t[c, j] ) ** 2
      f2[c, j] = ( (p_ir[c, j] - p_t[c, j])  /  p_t[c, j] ) ** 2
}
}
    d1 = sum(f1)
    d2 = sum(f2)
    D = d1 + d2    
    return(D)  
}

Поэтому мой алгоритм должен найти три параметра (w, tau_w, tau_h), которые минимизируют эту функцию расстояния. Эти три параметра являются массивами с i строками и r столбцами. Автор:

w = runif(i*r, 0, 1)
tau_w =  runif(i*r, -1, 1)
tau_h = runif(i*r, -1, 1)

x1 = array( c(tau_w, tau_h, w), dim = c(i, r, 3))

Я пытаюсь решить эту проблему с помощью библиотек optimx и Rsolnp.


res = optim(x1,      #starting values 
            obj)   #function to optimise

Но я получаю эту ошибку:

Error in x1[c, j, 1] : incorrect number of dimensions

Эта минимизация обычно сделано с использованием алгоритма Nelder-Mead. Я новичок в оптимизации и ценю любую помощь. Мой полный код здесь .

1 Ответ

0 голосов
/ 04 мая 2020

Размеры массива x1 теряются при выполнении optim(x1, obj). Таким образом, полученная ошибка возвращается w_tilf(x1), поскольку она включает x1[c,j,1].

. Реконструируйте массив в начале функции obj:

obj = function(x1){
  x1 = array(x1, dim = c(i, r, 3))
  s = sf()
  ......
} 

Тогда opt <- optim(x1, obj) должен работать сейчас. Он вернет решение в поле opt$par в виде вектора, вам нужно будет сделать array(opt$par, dim = c(i, r, 3)), чтобы получить массив.

...