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. Largera= tighter prior. Default1e-20(non-informative).b(scale): controls the expected variance level. Largerb= higher expected variance. Default1e-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