そのため、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)
。異なる値を試してみると、効果はわずかですが(アルゴリズムが少し動くこともあります)、実際にアルゴリズムを動かす値は見つかりません。
提案をありがとう!