Source code for pyts.metrics.boss
"""Code for BOSS metric."""
# Author: Johann Faouzi <johann.faouzi@gmail.com>
# License: BSD-3-Clause
import numpy as np
from math import sqrt
from sklearn.utils import check_array
[docs]def boss(x, y):
r"""Return the BOSS distance between two arrays.
Parameters
----------
x : array-like, shape = (n_timestamps,)
First array.
y : array-like, shape = (n_timestamps,)
Second array.
Returns
-------
dist : float
The BOSS distance between both arrays.
Notes
-----
The BOSS metric is defined as
.. math::
BOSS(x, y) = \sum_{\substack{i=1\\ x_i > 0}}^n (x_i - y_i)^2
where :math:`x` and :math:`y` are vectors of non-negative integers.
The BOSS distance is not a distance metric as it neither satisfies the
symmetry condition nor the triangle inequality.
References
----------
.. [1] P. Schäfer, "The BOSS is concerned with time series classification
in the presence of noise". Data Mining and Knowledge Discovery,
29(6), 1505-1530 (2015).
Examples
--------
>>> from pyts.metrics import boss
>>> x = [0, 5, 5, 3, 4, 5]
>>> y = [3, 0, 0, 0, 8, 0]
>>> boss(x, y)
10.0
>>> boss(y, x)
5.0
"""
x = check_array(x, ensure_2d=False, dtype='float64')
y = check_array(y, ensure_2d=False, dtype='float64')
if x.ndim != 1:
raise ValueError("'x' must a one-dimensional array.")
if y.ndim != 1:
raise ValueError("'y' must a one-dimensional array.")
if x.shape != y.shape:
raise ValueError("'x' and 'y' must have the same shape.")
non_zero_idx = ~np.isclose(x, np.zeros_like(x), rtol=1e-5, atol=1e-8)
return sqrt(np.sum((x[non_zero_idx] - y[non_zero_idx]) ** 2))