Kernel transformations

Kernel transformations are applied through the CrossKernel methods transf, linop, algop. A transformation returns a new kernel object derived from the input ones and additional arguments. Example:

import lsqfitgp as lgp
K = lgp.ExpQuad()
Q = (K
    .linop('scale', 2)   # rescale the input
    .algop('expm1')      # amplify positive correlations
    .linop('diff', 1, 0) # derive w.r.t. the first argument
)

A kernel can access all transformations defined in its superclasses. However, most transformations will regress the class of the output at least to the superclass which actually defines the transformation. Example:

K = lgp.ExpQuad()
assert isinstance(K, lgp.IsotropicKernel)
Q = K.linop('dim', 'a') # consider only dimension 'a' of the input
assert not isinstance(Q, lgp.IsotropicKernel)

Index

Method

Name

Classes

algop

-log1p(-x)

All generic classes

algop

1/(1-x)

All generic classes

algop

1/arccos

All generic classes

algop

1/cos

All generic classes

algop

add

CrossKernel, Kernel, CrossStationaryKernel, StationaryKernel, CrossIsotropicKernel, IsotropicKernel, Zeta

algop

arcsin

All generic classes

algop

arctanh

All generic classes

algop

cosh

All generic classes

algop

exp

All generic classes

algop

expm1

All generic classes

algop

expm1x

All generic classes

algop

i0

All generic classes

algop

i1

All generic classes

algop

mul

CrossKernel, Kernel, CrossStationaryKernel, StationaryKernel, CrossIsotropicKernel, IsotropicKernel, Zeta

algop

pow

All generic classes

algop

rpow

All generic classes

algop

sinh

All generic classes

algop

tan

All generic classes

linop

cond

All generic classes

linop

derivable

CrossKernel, Kernel, CrossStationaryKernel, StationaryKernel, CrossIsotropicKernel, IsotropicKernel, Zeta

linop

diff

CrossKernel, Kernel

linop

dim

CrossKernel, Kernel, CrossStationaryKernel, StationaryKernel

linop

fourier

Zeta

linop

loc

CrossKernel, Kernel, CrossStationaryKernel, StationaryKernel, CrossIsotropicKernel, IsotropicKernel, Zeta

linop

maxdim

CrossKernel, Kernel, CrossStationaryKernel, StationaryKernel, CrossIsotropicKernel, IsotropicKernel, Zeta

linop

normalize

All generic classes

linop

rescale

All generic classes

linop

scale

CrossKernel, Kernel, CrossStationaryKernel, StationaryKernel, CrossIsotropicKernel, IsotropicKernel, Zeta

linop

xtransf

CrossKernel, Kernel

transf

forcekron

Kernel

Transformations

CrossKernel.algop('-log1p(-x)')[source]
CrossKernel.algop('1/(1-x)')[source]
CrossKernel.algop('1/arccos')[source]
CrossKernel.algop('1/cos')[source]
CrossKernel.algop('add', self, other)[source]
Sum of kernels.

.. math:
    \mathrm{newkernel}(x, y) &= \mathrm{kernel}(x, y) + \mathrm{other}(x, y), \\
    \mathrm{newkernel}(x, y) &= \mathrm{kernel}(x, y) + \mathrm{other}.

Parameters
----------
other : CrossKernel or scalar
    The other kernel.
CrossKernel.algop('arcsin')[source]
Inverse sine, element-wise.

LAX-backend implementation of :func:`numpy.arcsin`.

*Original docstring below.*

Parameters
----------
x : array_like
    `y`-coordinate on the unit circle.

Returns
-------
angle : ndarray
    The inverse sine of each element in `x`, in radians and in the
    closed interval ``[-pi/2, pi/2]``.
    This is a scalar if `x` is a scalar.

References
----------
Abramowitz, M. and Stegun, I. A., *Handbook of Mathematical Functions*,
10th printing, New York: Dover, 1964, pp. 79ff.
https://personal.math.ubc.ca/~cbm/aands/page_79.htm
CrossKernel.algop('arctanh')[source]
Inverse hyperbolic tangent element-wise.

LAX-backend implementation of :func:`numpy.arctanh`.

*Original docstring below.*

Parameters
----------
x : array_like
    Input array.

Returns
-------
out : ndarray or scalar
    Array of the same shape as `x`.
    This is a scalar if `x` is a scalar.

References
----------
.. [1] M. Abramowitz and I.A. Stegun, "Handbook of Mathematical Functions",
       10th printing, 1964, pp. 86.
       https://personal.math.ubc.ca/~cbm/aands/page_86.htm
.. [2] Wikipedia, "Inverse hyperbolic function",
       https://en.wikipedia.org/wiki/Arctanh
CrossKernel.algop('cosh')[source]
Hyperbolic cosine, element-wise.

LAX-backend implementation of :func:`numpy.cosh`.

*Original docstring below.*

Equivalent to ``1/2 * (np.exp(x) + np.exp(-x))`` and ``np.cos(1j*x)``.

Parameters
----------
x : array_like
    Input array.

Returns
-------
out : ndarray or scalar
    Output array of same shape as `x`.
    This is a scalar if `x` is a scalar.
CrossKernel.algop('exp')[source]
Calculate the exponential of all elements in the input array.

LAX-backend implementation of :func:`numpy.exp`.

*Original docstring below.*

Parameters
----------
x : array_like
    Input values.

Returns
-------
out : ndarray or scalar
    Output array, element-wise exponential of `x`.
    This is a scalar if `x` is a scalar.

References
----------
.. [1] Wikipedia, "Exponential function",
       https://en.wikipedia.org/wiki/Exponential_function
.. [2] M. Abramovitz and I. A. Stegun, "Handbook of Mathematical Functions
       with Formulas, Graphs, and Mathematical Tables," Dover, 1964, p. 69,
       https://personal.math.ubc.ca/~cbm/aands/page_69.htm
CrossKernel.algop('expm1')[source]
Calculate ``exp(x) - 1`` for all elements in the array.

LAX-backend implementation of :func:`numpy.expm1`.

*Original docstring below.*

Parameters
----------
x : array_like
    Input values.

Returns
-------
out : ndarray or scalar
    Element-wise exponential minus one: ``out = exp(x) - 1``.
    This is a scalar if `x` is a scalar.
CrossKernel.algop('expm1x')[source]
Compute accurately :math:`e^x - 1 - x = x^2/2 {}_1F_1(1, 3, x)`.
CrossKernel.algop('i0')[source]
Modified Bessel function of order 0.

LAX-backend implementation of :func:`scipy.special.i0`.

*Original docstring below.*

Defined as,

.. math:
    I_0(x) = \sum_{k=0}^\infty \frac{(x^2/4)^k}{(k!)^2} = J_0(\imath x),

where :math:`J_0` is the Bessel function of the first kind of order 0.

Parameters
----------
x : array_like
    Argument (float)

Returns
-------
I : scalar or ndarray
    Value of the modified Bessel function of order 0 at `x`.

References
----------
.. [1] Cephes Mathematical Functions Library,
       http://www.netlib.org/cephes/
CrossKernel.algop('i1')[source]
Modified Bessel function of order 1.

LAX-backend implementation of :func:`scipy.special.i1`.

*Original docstring below.*

Defined as,

.. math:
    I_1(x) = \frac{1}{2}x \sum_{k=0}^\infty \frac{(x^2/4)^k}{k! (k + 1)!}
           = -\imath J_1(\imath x),

where :math:`J_1` is the Bessel function of the first kind of order 1.

Parameters
----------
x : array_like
    Argument (float)

Returns
-------
I : scalar or ndarray
    Value of the modified Bessel function of order 1 at `x`.

References
----------
.. [1] Cephes Mathematical Functions Library,
       http://www.netlib.org/cephes/
CrossKernel.algop('mul', self, other)[source]
Product of kernels.

.. math:
    \mathrm{newkernel}(x, y) &= \mathrm{kernel}(x, y) \cdot \mathrm{other}(x, y), \\
    \mathrm{newkernel}(x, y) &= \mathrm{kernel}(x, y) \cdot \mathrm{other}.

Parameters
----------
other : CrossKernel or scalar
    The other kernel.
CrossKernel.algop('pow', self, *, exponent)[source]
Power of the kernel.

.. math:
    \mathrm{newkernel}(x, y) = \mathrm{kernel}(x, y)^{\mathrm{exponent}}

Parameters
----------
exponent : nonnegative integer
    The exponent. If traced by jax, it must have unsigned integer type.
CrossKernel.algop('rpow', self, *, base)[source]
Exponentiation of the kernel.

.. math:
    \text{newkernel}(x, y) = \text{base}^{\text{kernel}(x, y)}

Parameters
----------
base : scalar
    A number >= 1. If traced by jax, the value is not checked.
CrossKernel.algop('sinh')[source]
Hyperbolic sine, element-wise.

LAX-backend implementation of :func:`numpy.sinh`.

*Original docstring below.*

Equivalent to ``1/2 * (np.exp(x) - np.exp(-x))`` or
``-1j * np.sin(1j*x)``.

Parameters
----------
x : array_like
    Input array.

Returns
-------
y : ndarray
    The corresponding hyperbolic sine values.
    This is a scalar if `x` is a scalar.

References
----------
M. Abramowitz and I. A. Stegun, Handbook of Mathematical Functions.
New York, NY: Dover, 1972, pg. 83.
CrossKernel.algop('tan')[source]
Compute tangent element-wise.

LAX-backend implementation of :func:`numpy.tan`.

*Original docstring below.*

Equivalent to ``np.sin(x)/np.cos(x)`` element-wise.

Parameters
----------
x : array_like
    Input array.

Returns
-------
y : ndarray
    The corresponding tangent values.
    This is a scalar if `x` is a scalar.

References
----------
M. Abramowitz and I. A. Stegun, Handbook of Mathematical Functions.
New York, NY: Dover, 1972.
CrossKernel.linop('cond', other, cond1[, cond2])[source]
Switch between two independent processes based on a condition.

.. math:
    T(f, g)(x) = \begin{cases}
        f(x) & \text{if $\mathrm{cond}(x)$,} \\
        g(x) & \text{otherwise.}
    \end{cases}

Parameters
----------
cond1, cond2 : callable
    Function that is applied on an array of points and must return
    a boolean array with the same shape.
other :
    Kernel of the process used where the condition is false.
CrossKernel.linop('derivable', xderivable[, yderivable])[source]
Specify the degree of derivability of the function.

Parameters
----------
xderivable, yderivable: int or None
    Degree of derivability of the function. None means unknown.

Notes
-----
The derivability check is hardcoded into the kernel core and it is not
possible to remove it afterwards by applying ``'derivable'`` again with a
higher limit.
CrossKernel.linop('diff', xderiv[, yderiv])[source]
Derive the function.

.. math:
    T(f)(x) = \frac{\partial^n f}{\partial x^n} (x)

Parameters
----------
xderiv, yderiv : Deriv_like
    A `Deriv` or something that can be converted to a `Deriv`.

Raises
------
RuntimeError
    The derivative orders are greater than the `derivative` attribute.
CrossKernel.linop('dim', xdim[, ydim])[source]
Restrict the function to a field of a structured input:

    T(f)(x) = f(x[dim])

If the array is not structured, an exception is raised. If the field for
name `dim` has a nontrivial shape, the array passed to the kernel is still
structured but has only field `dim`.

Parameters
----------
xdim, ydim: None, str, list of str
    Field names or lists of field names.
CrossKernel.linop('fourier', arg2, self[, arg1])[source]
Compute the Fourier series transform of the function.

.. math:

    T(f)(k) = \begin{cases}
            \frac2T \int_0^T \mathrm dx\, f(x)
            \cos\left(\frac{2\pi}T \frac k2 x\right)
            & \text{if $k$ is even} \\
            \frac2T \int_0^T \mathrm dx\, f(x)
            \sin\left(\frac{2\pi}T \frac{k+1}2 x\right)
            & \text{if $k$ is odd}
        \end{cases}

The period :math:`T` is 1.
CrossKernel.linop('loc', xloc[, yloc])[source]
Translate the process inputs:

.. math:
    T(f)(x) = f(x - \mathrm{loc})

Parameters
----------
xloc, yloc: None, number
    Translations.
CrossKernel.linop('maxdim', xmaxdim[, ymaxdim])[source]
Restrict the process to a maximum input dimensionality.

Parameters
----------
xmaxdim, ymaxdim: None, int
    Maximum dimensionality of the input.

Notes
-----
Once applied a restriction, the check is hardcoded into the kernel core and
it is not possible to remove it by applying again `maxdim` with a larger
limit.
CrossKernel.linop('normalize', dox[, doy])[source]
Rescale the process to unit variance.

.. math:
    T(f)(x) &= f(x) / \sqrt{\mathrm{Std}[f(x)]} \\
            &= f(x) / \sqrt{\mathrm{kernel}(x, x)}

Parameters
----------
dox, doy : bool
    Whether to rescale.
CrossKernel.linop('rescale', xfun[, yfun])[source]
Rescale the output of the function.

.. math:
    T(f)(x) = \mathrm{fun}(x) f(x)

Parameters
----------
xfun, yfun : callable or None
    Functions from the type of the arguments of the kernel to scalar.
CrossKernel.linop('scale', xscale[, yscale])[source]
Rescale the process inputs:

.. math:
    T(f)(x) = f(x / \mathrm{scale})

Parameters
----------
xscale, yscale: None, number
    Rescaling factors.
CrossKernel.linop('xtransf', xfun[, yfun])[source]
Transform the inputs of the function.

.. math:
    T(f)(x) = f(\mathrm{fun}(x))

Parameters
----------
xfun, yfun : callable or None
    Functions mapping a new kind of input to the kind of input accepted by
    the kernel.
CrossKernel.transf('forcekron')[source]
Force the kernel to be a separate product over dimensions:

.. math:
    \mathrm{newkernel}(x, y) = \prod_i \mathrm{kernel}(x_i, y_i)

Returns
-------
newkernel : Kernel
    The transformed kernel.