Source code for glimix_core.cov._linear

from numpy import exp, log
from optimix import Function, Scalar

from .._util import format_function


[docs]class LinearCov(Function): """ Linear covariance function, K = s⋅XXᵀ. The mathematical representation is s⋅XXᵀ, for a n×r matrix X provided by the user and a scaling parameter s. Example ------- .. doctest:: >>> from glimix_core.cov import LinearCov >>> from numpy import dot >>> from numpy.random import RandomState >>> >>> X = RandomState(0).randn(2, 3) >>> cov = LinearCov(X) >>> cov.scale = 1.3 >>> cov.name = "K" >>> print(cov) LinearCov(): K scale: 1.3 """
[docs] def __init__(self, X): """ Constructor. Parameters ---------- X : array_like Matrix X from K = s⋅XXᵀ. """ self._logscale = Scalar(0.0) self._X = X Function.__init__(self, "LinearCov", logscale=self._logscale) self._logscale.bounds = (-20.0, +10)
@property def X(self): """ Matrix X from K = s⋅XXᵀ. """ return self._X def fix(self): """ Prevent s update during optimization. """ self._fix("logscale") def unfix(self): """ Enable s update during optimization. """ self._unfix("logscale") @property def scale(self): """ Scale parameter. """ return exp(self._logscale.value) @scale.setter def scale(self, scale): from numpy_sugar import epsilon scale = max(scale, epsilon.tiny) self._logscale.value = log(scale) def value(self): """ Covariance matrix. Returns ------- K : ndarray s⋅XXᵀ. """ X = self.X return self.scale * (X @ X.T) def gradient(self): """ Derivative of the covariance matrix over log(s). Returns ------- logscale : ndarray s⋅XXᵀ. """ return dict(logscale=self.value()) def __str__(self): return format_function(self, {}, [("scale", self.scale)])