help-gsl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-gsl] BFGS iteration does not make any progress


From: Hannes Bretschneider
Subject: [Help-gsl] BFGS iteration does not make any progress
Date: Wed, 13 Apr 2011 21:23:03 +0200

So I have a problem with the multidimensional minimization procedures
in the GSL (the one I'm trying to use is
gsl_multimin_fdfminimizer_vector_bfgs2, but the others produce the
same problem). I have defined my target function and its gradient and
I can start the iteration, but the algorithm always stays at the same
point.

Now, I thought I would have a math error in my function or gradient
somewhere. However, for a specific set of data I know the optimum and
plugging in those values produces a gradient that is 0 everywhere.

If I start the iteration at the optimum, the algorithm correctly stops
and reports success, but if I disturb the starting vector only
minimally, the iteration runs forever and never finds the optimum.

I also reimplemented the function and gradient in R. I checked that
the C version and the R version produce the same output for the same
input, which they do. Using the BFGS algorithm in R, the optimum is
found in just a few iterations.

I initialize the algorithm with

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

and the iteration looks like this:

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

The only parameter that I can tweak are the initial step size and the
accuracy of the line minimization ingsl_multimin_fdfminimizer_set
(gsl_multimin_fdfminimizer * s, gsl_multimin_function_fdf * fdf, const
gsl_vector * x, double step_size, double tol). Trying different values
there has a small effect (sometimes the algorithm moves a little bit),
but I can't find any values that actually make the algorithm move
around.

Thanks for any suggestions!
--Hannes



reply via email to

[Prev in Thread] Current Thread [Next in Thread]