Skip to contents

Makes a kernel act on some input columns only: \(k_S(x, x') = k(x_S, x'_S)\) for the selected columns \(S\). Sums of restricted kernels give additive models such as \(f(x) = f_1(x_1) + f_2(x_2, x_3)\).

Usage

select_dimensions(kernel, columns)

Arguments

kernel

A Gaussian-process kernel specification.

columns

Positive integer indices of the input columns the kernel acts on, without duplicates.

Value

A composite kernel specification.

Details

A restricted kernel is positive semidefinite whenever kernel is, because it is kernel composed with a linear projection. A sum \(\sum_j k_j(x_{S_j}, x'_{S_j})\) is the covariance of \(f(x) = \sum_j f_j(x_{S_j})\) with independent components \(f_j\).

The selection is not a hyperparameter. It adds no parameter and no level to parameter paths: select_dimensions(rbf_kernel(), 2) has the paths variance and length_scale, like rbf_kernel(). ARD parameters of kernel have one value per selected column.

Columns index the inputs the kernel receives. The number of input columns is not known when a specification is built, so column indices and ARD lengths are checked when the kernel is evaluated and when a model is fitted. Derivatives with respect to unselected input columns are zero.

Stability

Stable: from version 1.0.0 this interface changes incompatibly only in a major release, after a deprecation period. Results and options that concern an experimental model class, kernel, or argument follow that interface's tier. See gaussianprocesses-package for the policy.

Examples

# An additive model f(x) = f1(x1) + f2(x2, x3).
kernel <- sum_kernel(
  select_dimensions(rbf_kernel(length_scale = 0.5), 1),
  select_dimensions(matern52_kernel(length_scale = c(1, 2)), 2:3)
)
kernel
#> SumKernel(
#>   SelectDimensions(columns=1,
#>     RBF(variance=1, length_scale=0.5)
#>   )
#>   SelectDimensions(columns=c(2, 3),
#>     Matern-5/2(variance=1, length_scale=c(1, 2))
#>   )
#> )
names(kernel_parameters(kernel, flatten = TRUE))
#> [1] "kernel1.variance"        "kernel1.length_scale"   
#> [3] "kernel2.variance"        "kernel2.length_scale[1]"
#> [5] "kernel2.length_scale[2]"

x <- cbind(c(0, 0.5, 1), c(1, 0, -1), c(2, 2, 0))
all.equal(
  evaluate_kernel(kernel, x),
  evaluate_kernel(rbf_kernel(length_scale = 0.5), x[, 1]) +
    evaluate_kernel(matern52_kernel(length_scale = c(1, 2)), x[, 2:3])
)
#> [1] TRUE