1

所以我对 GSL 中的多维最小化程序有疑问(我尝试使用的是gsl_multimin_fdfminimizer_vector_bfgs2,但其他程序产生了同样的问题)。我已经定义了我的目标函数及其梯度,我可以开始迭代,但算法始终保持在同一点。

现在,我认为我的函数或梯度在某处会出现数学错误。但是,对于一组特定的数据,我知道最佳值,并且插入这些值会产生一个处处为 0 的梯度。

如果我以最优值开始迭代,算法会正确停止并报告成功,但如果我只对起始向量进行最低限度的干扰,则迭代将永远运行并且永远不会找到最优值。

我还在 R 中重新实现了函数和梯度。我检查了 C 版本和 R 版本是否为相同的输入产生相同的输出,它们确实如此。使用 R 中的 BFGS 算法,只需几次迭代即可找到最优值。

我用初始化算法

 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). 在那里尝试不同的值会产生很小的影响(有时算法会移动一点),但我找不到任何实际使算法移动的值。

感谢您的任何建议!

4

0 回答 0