所以我对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)
中线最小化的准确性。尝试不同的值有一个小的影响(有时算法移动一点点),但我找不到任何实际使算法移动的值。
感谢您的任何建议!