I try to use kriging with customized kernels. Unfortunately I run into a problem for kernels with more than 1 hyperparameter. My kernel is stated the following way:
function R = my_first_kernel(x1,x2,theta,~)
exp_sin_sq = @(a,b,c,d) exp(-2*sin(pi/c*abs(a-b)).^2/d^2);
R = exp_sin_sq(x1(:,1),x2(:,1),theta(1),theta(2))
end
If I use theta(1) instead of theta(2) the kernel works. However, in this case I only have one hyperparameter to train, what I don’t want.
I use the kernel by setting the Correlation Family as a handle:
X = 0:0.25:2*pi;
Y = sin(X);
MetaOpts.Type = 'Metamodel';
MetaOpts.MetaType = 'Kriging';
MetaOpts.ExpDesign.Sampling = 'User';
MetaOpts.Corr.Family = @my_first_kernel;
MetaOpts.ExpDesign.X = X;
MetaOpts.ExpDesign.Y = Y;
MetaOpts.Optim.InitialValue = ones(2,1);
test = uq_createModel(MetaOpts);
I saw in the user manual that \theta should be a vector: “The input theta of the function my_eval_R corresponds to the hyperparameters θ and it is expected to be a vector of arbitrary length.” If I state the kernel as in the beginning, I get the error: " Index exceeds the number of array elements (1). " This occurs as the theta handed to the kernel is only a scalar and not a vector. I tried to make theta a vector by setting the optimization initial values to a vector: MetaOpts.Optim.InitialValue = ones(2,1) (also = ones(1,2)) This unfortunately didn’t help. I hope I stated the problem clear enough.
Some system information:
- UQLab: version 1.4.0
- Matlab: version R2019b
- Operating system: windows