Source code for tssearch.distances.lockstep_distances

import numpy as np
from scipy import stats
from scipy.spatial import distance
from tssearch.utils.preprocessing import interpolation
from tssearch.distances.lockstep_utils import _lnorm_multidimensional, _lnorm_unidimensional


[docs]def euclidean_distance(x, y, weight=None): """Computes the Euclidean distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. Returns ------- float Euclidean distance value. """ p = 2 if len(x) != len(y): x, y = interpolation(x, y) if weight is None: ed = np.linalg.norm(x - y, p) else: if len(np.shape(x)) > 1: distance = _lnorm_multidimensional(x, y, weight, p=p) else: distance = _lnorm_unidimensional(x, y, weight, p=p) ed = np.sum(distance) return ed
[docs]def minkowski_distance(x, y, weight=None, p=3): """Computes the Minkowski distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. p: int Lp norm distance degree. Returns ------- float Minkowski distance value. """ if len(x) != len(y): x, y = interpolation(x, y) if weight is None and (p < 3 or p == np.inf): distance = np.linalg.norm(x - y, p) else: if weight is None: weight = np.ones_like(x) if len(np.shape(x)) > 1: distance = _lnorm_multidimensional(x, y, weight, p=p) else: distance = _lnorm_unidimensional(x, y, weight, p=p) distance = np.sum(distance) return distance
[docs]def manhattan_distance(x, y, weight=None): """Computes the Manhattan distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. Returns ------- float Manhattan distance value. """ p = 1 if len(x) != len(y): x, y = interpolation(x, y) if weight is None: distance = np.linalg.norm(x - y, p) else: if len(np.shape(x)) > 1: distance = _lnorm_multidimensional(x, y, weight, p=p) else: distance = _lnorm_unidimensional(x, y, weight, p=p) distance = np.sum(distance) return distance
[docs]def chebyshev_distance(x, y, weight=None): """Computes the Chebyshev distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. Returns ------- float Chebyshev distance value. """ p = np.inf if len(x) != len(y): x, y = interpolation(x, y) if weight is None: d = np.linalg.norm(x - y, p) else: if len(np.shape(x)) > 1: distance = _lnorm_multidimensional(x, y, weight, p=p) else: distance = _lnorm_unidimensional(x, y, weight, p=p) d = np.sum(distance) return d
[docs]def correlation_distance(x, y, weight=None): """Computes the correlation distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. Returns ------- float Correlation distance value. """ if len(x) != len(y): x, y = interpolation(x, y) correlation_d = distance.correlation(x, y, weight) return correlation_d
[docs]def pearson_correlation(x, y, beta=None): """Computes the Pearson correlation between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. beta: float Beta coefficient. Returns ------- float Pearson correlation value. """ if len(x) != len(y): x, y = interpolation(x, y) r, p = stats.pearsonr(x, y) if beta is None: d = 2 * (1 - r) else: d = ((1 - r) / (1 + r)) ** beta return d
[docs]def short_time_series_distance(x, y, tx=None, ty=None): """Computes the short time series distance (STS) between two time series. Reference: Möller-Levet, C. S., Klawonn, F., Cho, K., and Wolkenhauer, O. (2003). Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. tx : nd-array Sampling index of time series x. ty : nd-array Sampling index of time series y. Returns ------- float Short time series distance value. """ if len(x) != len(y): x, y = interpolation(x, y) if tx is None: tx = np.arange(len(x)) if ty is None: ty = np.arange(len(y)) sts = np.sqrt(np.sum((np.diff(y) / np.diff(tx) - np.diff(x) / np.diff(ty)) ** 2)) return sts
[docs]def braycurtis_distance(x, y, weight=None): """Computes the Braycurtis distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. Returns ------- float Braycurtis distance value. """ if len(x) != len(y): x, y = interpolation(x, y) braycurtis_d = distance.braycurtis(x, y, weight) return braycurtis_d
[docs]def canberra_distance(x, y, weight=None): """Computes the Canberra distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. Returns ------- float Canberra distance value. """ if len(x) != len(y): x, y = interpolation(x, y) canberra_d = distance.canberra(x, y, weight) return canberra_d
[docs]def cosine_distance(x, y, weight=None): """Computes the cosine distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. Returns ------- float Cosine distance value. """ if len(x) != len(y): x, y = interpolation(x, y) cosine_d = distance.cosine(x, y, weight) return cosine_d
[docs]def mahalanobis_distance(x, y, weight=None): """Computes the Mahalanobis distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. Returns ------- float Mahalanobis distance value. """ if len(x) != len(y): x, y = interpolation(x, y) mahalanobis_d = distance.mahalanobis(x, y, weight) return mahalanobis_d
[docs]def sqeuclidean_distance(x, y, weight=None): """Computes the squared Euclidean distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. Returns ------- float Squared Euclidean distance value. """ if len(x) != len(y): x, y = interpolation(x, y) sqeuclidean_d = distance.sqeuclidean(x, y, weight) return sqeuclidean_d
[docs]def hamming_distance(x, y, weight=None): """Computes the Hamming distance between two time series. If the time series do not have the same length, an interpolation is performed. Parameters ---------- x : nd-array Time series x. y : nd-array Time series y. weight: nd-array (Default: None) query weight values. Returns ------- float Hamming distance value. """ if len(x) != len(y): x, y = interpolation(x, y) hamming_d = distance.hamming(x, y, weight) return hamming_d