in orbit/utils/kernels.py [0:0]
def sandwich_kernel(x, x_i):
"""
Parameters
----------
x : array-like
points required to compute kernel weight
x_i : array-like
reference points location used to compute correspondent distance of each entry points
Returns
-------
np.ndarray :
2D array with size N x M such that
N as the number of entry points
M as the number of reference points
matrix entries hold the value of weight of each element
See Also
--------
1. https://mc-stan.org/docs/2_24/stan-users-guide/gaussian-process-regression.html
2. https://en.wikipedia.org/wiki/Local_regression
"""
N = len(x)
M = len(x_i)
k = np.zeros((N, M), dtype=np.double)
np_idx = np.where(x < x_i[0])
k[np_idx, 0] = 1
for m in range(M - 1):
np_idx = np.where(np.logical_and(x >= x_i[m], x < x_i[m + 1]))
total_dist = x_i[m + 1] - x_i[m]
backward_dist = x[np_idx] - x_i[m]
forward_dist = x_i[m + 1] - x[np_idx]
k[np_idx, m] = forward_dist / total_dist
k[np_idx, m + 1] = backward_dist / total_dist
np_idx = np.where(x >= x_i[M - 1])
k[np_idx, M - 1] = 1
# TODO: it is probably not needed
k = k / np.sum(k, axis=1, keepdims=True)
return k