1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use super::ExactEllipticalProcessParams;
use crate::{
nonparametric::{kernel_matrix, regressor::GaussianProcessRegressor, EllipticalProcessError},
ExactEllipticalParams, RandomVariable,
};
use crate::{DistributionError, EllipticalParams};
use opensrdk_kernel_method::*;
use opensrdk_linear_algebra::SymmetricPackedMatrix;
impl<K, T> GaussianProcessRegressor<K, T> for ExactEllipticalProcessParams<K, T>
where
K: PositiveDefiniteKernel<T>,
T: RandomVariable,
{
fn gp_predict_multivariate(
&self,
xs: &[T],
) -> Result<ExactEllipticalParams, DistributionError> {
let len = xs.len();
if len == 0 {
return Err(DistributionError::InvalidParameters(
EllipticalProcessError::Empty.into(),
));
}
let kxxs = kernel_matrix(&self.base.kernel, &self.base.theta, &self.base.x, xs)?;
let kxsx = kxxs.t();
let kxsxs = kernel_matrix(&self.base.kernel, &self.base.theta, xs, xs)?;
let kxx_inv_kxxs = self.sigma_inv_mul(kxxs)?;
let mean = self.mu[0] + &kxsx * &self.sigma_inv_y;
let covariance = kxsxs - &kxsx * kxx_inv_kxxs;
let cov_p = SymmetricPackedMatrix::from_mat(&covariance).unwrap();
ExactEllipticalParams::new(mean.vec(), cov_p.pptrf().unwrap())
}
}