Многомерная минимизация с научной библиотекой Gnu - PullRequest
1 голос
/ 13 апреля 2011

Итак, у меня проблема с многомерными процедурами минимизации в GSL (я пытаюсь использовать gsl_multimin_fdfminimizer_vector_bfgs2, но другие вызывают ту же проблему). Я определил свою целевую функцию и ее градиент, и я могу начать итерацию, но алгоритм всегда остается в одной и той же точке.

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

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

Я также переопределил функцию и градиент в R. Я проверил, что версия C и версия R выдают одинаковый вывод для одного и того же ввода, что они делают. Используя алгоритм BFGS в R, оптимум находится всего за несколько итераций.

Я инициализирую алгоритм с

 const gsl_multimin_fdfminimizer_type *T;
 gsl_multimin_fdfminimizer *s;

 gsl_multimin_function_fdf lindsey_func;
 const gsl_vector * p[] = {x, y};

 lindsey_func.n = J;
 lindsey_func.f = lindsey_loglik;
 lindsey_func.df = lindsey_gradient;
 lindsey_func.fdf = lindsey_gf;
 lindsey_func.params = p;

 T = gsl_multimin_fdfminimizer_vector_bfgs2;
 s = gsl_multimin_fdfminimizer_alloc(T, J);     

 gsl_multimin_fdfminimizer_set(s, &lindsey_func, beta0, .001, 1e-4);

и итерация выглядит так:

 do
 {
  iter++;
  status = gsl_multimin_fdfminimizer_iterate(s);
  printf("%d\n", status);
  if (status)
       break;

  status = gsl_multimin_test_gradient(s->gradient, 1e-3);

  if (status == GSL_SUCCESS)
  {
     printf("Minimum found at: ");
     printf("[");
     for (j = 0; j < J; j++)
     {
      printf("%.5f, ", gsl_vector_get(s->x, j));
     }
     printf("]\n");
  }
 } while (status == GSL_CONTINUE && iter < iter_max);

Единственный параметр, который я могу настроить, - это начальный размер шага и точность минимизации линии в gsl_multimin_fdfminimizer_set (gsl_multimin_fdfminimizer * s, gsl_multimin_function_fdf * fdf, const gsl_vector * x, double step_size, double tol). Попытка использовать разные значения имеет небольшой эффект (иногда алгоритм движется немного), но я не могу найти значений, которые фактически заставляют алгоритм двигаться.

Спасибо за любые предложения!

...