How to: Use the T-Process for Robust GP Regression

1 Using the T-Process

The Student-t process (TP) provides heavier-tailed predictions than the standard GP, making it robust to outlier observations. Use the TP when your dimer or NEB search visits high-energy configurations that produce noisy or unreliable force evaluations.

1.1 When to use the T-process

  • Your energy surface has steep gradients near the transition state

  • You observe occasional force evaluation failures or spikes

  • You want more conservative uncertainty estimates

1.2 Python API

from gpr_optim import StudentTProcessRegression, default_gpr_parameters

# Create and configure TP model
tp = StudentTProcessRegression()
tp.set_hyperprior_parameters(a=1.0, b=1.0)  # weakly informative

# The TP has the same API as GaussianProcessRegression:
params = default_gpr_parameters()
tp.initialize(params, atoms_config)
tp.set_hyperparameters(observation, atoms_config)
tp.optimize(observation)

# Predictions work identically
tp.calculate_potential(query)
tp.calculate_variance(query)  # variance scaled by TP prefactor

# Check the TP prefactor (signal variance estimate)
print(f"TP prefactor: {tp.get_tp_prefactor():.4f}")

1.3 Hyperprior parameters

The inverse-gamma hyperprior has two parameters:

  • a (shape): controls how strongly the prior constrains the variance. Larger a = tighter prior. Default 1e-20 (non-informative).

  • b (scale): controls the expected variance level. Larger b = higher expected variance. Default 1e-20.

Setting

a

b

Effect

Non-informative

1e-20

1e-20

TP = GP (same predictions)

Weakly informative

1.0

1.0

Mild robustness

Informative

10.0

10.0

Strong robustness

1.4 C++ API

#include <gpr_optim/StudentTProcessRegression.h>

gpr::StudentTProcessRegression tp;
tp.setHyperpriorParameters(1.0, 1.0);
tp.initialize(params, atoms_config);
tp.optimize(observation);
tp.calculatePotential(query);

1.5 Factorized optimization

For faster hyperparameter optimization, use the eigendecomposition-based factorized likelihood with noise grid search:

gpr::GaussianProcessRegression gp;
gp.initialize(params, atoms_config);
gp.optimizeFactorized(observation);  // eigendecomp + noise grid