问题描述
|
所以我对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)
中行最小化的精度。尝试使用不同的值会有很小的影响(有时算法会稍微移动一点),但是我找不到任何实际上会使算法四处移动的值。
感谢您的任何建议!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)