From f356e07374adfb37170426dc6dab3d767be1a9e1 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Fri, 7 Feb 2020 13:01:12 +0000 Subject: [PATCH 01/20] [patch:lib] Rework preprocessing module (#75) * Rework sequentia.preprocessing * Remove Test.ipynb --- lib/sequentia/preprocessing/__init__.py | 7 +- lib/sequentia/preprocessing/methods.py | 209 ---- lib/sequentia/preprocessing/preprocess.py | 148 +-- lib/sequentia/preprocessing/transforms.py | 267 +++++ lib/test/lib/preprocessing/test_methods.py | 1050 ++++++++--------- lib/test/lib/preprocessing/test_preprocess.py | 572 ++++----- 6 files changed, 1141 insertions(+), 1112 deletions(-) delete mode 100644 lib/sequentia/preprocessing/methods.py create mode 100644 lib/sequentia/preprocessing/transforms.py diff --git a/lib/sequentia/preprocessing/__init__.py b/lib/sequentia/preprocessing/__init__.py index 2068a169..b0e4c054 100644 --- a/lib/sequentia/preprocessing/__init__.py +++ b/lib/sequentia/preprocessing/__init__.py @@ -1,5 +1,2 @@ -from .methods import ( - trim_zeros, downsample, center, standardize, fft, filtrate, - _trim_zeros, _downsample, _center, _standardize, _fft, _filtrate -) -from .preprocess import Preprocess \ No newline at end of file +from .preprocess import Preprocess +from .transforms import * \ No newline at end of file diff --git a/lib/sequentia/preprocessing/methods.py b/lib/sequentia/preprocessing/methods.py deleted file mode 100644 index 9df4670e..00000000 --- a/lib/sequentia/preprocessing/methods.py +++ /dev/null @@ -1,209 +0,0 @@ -import scipy.fftpack -import numpy as np -from ..internals import _Validator - -def trim_zeros(X): - """Trim zero-observations from the input observation sequence(s). - - Parameters - ---------- - X: numpy.ndarray or List[numpy.ndarray] - An individual observation sequence or a list of multiple observation sequences. - - Returns - ------- - trimmed: numpy.ndarray or List[numpy.ndarray] - The zero-trimmed input observation sequence(s). - """ - val = _Validator() - X = val.observation_sequences(X, allow_single=True) - return _trim_zeros(X) - -def _trim_zeros(X): - def transform(x): - return x[~np.all(x == 0, axis=1)] - - if isinstance(X, list): - return [transform(x) for x in X] - elif isinstance(X, np.ndarray): - return transform(X) - -def center(X): - """Centers an observation sequence (or multiple sequences) by centering observations around the mean. - - Parameters - ---------- - X: numpy.ndarray or List[numpy.ndarray] - An individual observation sequence or a list of multiple observation sequences. - - Returns - ------- - centered: numpy.ndarray or List[numpy.ndarray] - The centered input observation sequence(s). - """ - val = _Validator() - X = val.observation_sequences(X, allow_single=True) - return _center(X) - -def _center(X): - def transform(x): - return x - x.mean(axis=0) - - if isinstance(X, list): - return [transform(x) for x in X] - elif isinstance(X, np.ndarray): - return transform(X) - -def standardize(X): - """Standardizes an observation sequence (or multiple sequences) by transforming observations - so that they have zero mean and unit variance. - - Parameters - ---------- - X: numpy.ndarray or List[numpy.ndarray] - An individual observation sequence or a list of multiple observation sequences. - - Returns - ------- - standardized: numpy.ndarray or List[numpy.ndarray] - The standardized input observation sequence(s). - """ - val = _Validator() - X = val.observation_sequences(X, allow_single=True) - return _standardize(X) - -def _standardize(X): - def transform(x): - return (x - x.mean(axis=0)) / x.std(axis=0) - - if isinstance(X, list): - return [transform(x) for x in X] - elif isinstance(X, np.ndarray): - return transform(X) - -def downsample(X, n, method='decimate'): - """Downsamples an observation sequence (or multiple sequences) by either: - - - Decimating the next :math:`n-1` observations - - Averaging the current observation with the next :math:`n-1` observations - - Parameters - ---------- - X: numpy.ndarray or List[numpy.ndarray] - An individual observation sequence or a list of multiple observation sequences. - - n: int - Downsample factor. - - method: {'decimate', 'average'} - The downsampling method. - - Returns - ------- - downsampled: numpy.ndarray or List[numpy.ndarray] - The downsampled input observation sequence(s). - """ - val = _Validator() - X = val.observation_sequences(X, allow_single=True) - val.restricted_integer(n, lambda x: x > 1, desc='downsample factor', expected='greater than one') - val.one_of(method, ['decimate', 'average'], desc='downsampling method') - - if isinstance(X, np.ndarray): - val.restricted_integer(n, lambda x: x <= len(X), - desc='downsample factor', expected='no greater than the number of frames') - else: - val.restricted_integer(n, lambda x: x <= min(len(x) for x in X), - desc='downsample factor', expected='no greater than the number of frames in the shortest sequence') - - return _downsample(X, n, method) - -def _downsample(X, n, method): - def transform(x): - N, D = x.shape - if method == 'decimate': - return np.delete(x, [i for i in range(N) if i % n != 0], 0) - elif method == 'average': - r = len(x) % n - xn, xr = (x, None) if r == 0 else (x[:-r], x[-r:]) - dxn = xn.T.reshape(-1, n).mean(axis=1).reshape(D, -1).T - return dxn if xr is None else np.vstack((dxn, xr.mean(axis=0))) - - if isinstance(X, list): - return [transform(x) for x in X] - elif isinstance(X, np.ndarray): - return transform(X) - -def fft(X): - """Applies a Discrete Fourier Transform to the input observation sequence(s). - - Parameters - ---------- - X: numpy.ndarray or List[numpy.ndarray] - An individual observation sequence or a list of multiple observation sequences. - - Returns - ------- - transformed: numpy.ndarray or List[numpy.ndarray] - The transformed input observation sequence(s). - """ - val = _Validator() - X = val.observation_sequences(X, allow_single=True) - return _fft(X) - -def _fft(X): - def transform(x): - return scipy.fftpack.rfft(x, axis=0) - - if isinstance(X, list): - return [transform(x) for x in X] - elif isinstance(X, np.ndarray): - return transform(X) - -def filtrate(X, n, method='median'): - """Applies a median or mean filter to the input observation sequence(s). - - Parameters - ---------- - X: numpy.ndarray or List[numpy.ndarray] - An individual observation sequence or a list of multiple observation sequences. - - n: int - Window size. - - method: {'median', 'mean'} - The filtering method. - - Returns - ------- - filtered: numpy.ndarray or List[numpy.ndarray] - The filtered input observation sequence(s). - """ - val = _Validator() - X = val.observation_sequences(X, allow_single=True) - val.restricted_integer(n, lambda x: x > 1, desc='window size', expected='greater than one') - val.one_of(method, ['median', 'mean'], desc='filtering method') - - if isinstance(X, np.ndarray): - val.restricted_integer(n, lambda x: x <= len(X), - desc='window size', expected='no greater than the number of frames') - else: - val.restricted_integer(n, lambda x: x <= min(len(x) for x in X), - desc='window size', expected='no greater than the number of frames in the shortest sequence') - - return _filtrate(X, n, method) - -def _filtrate(X, n, method): - def transform(x): - measure = np.median if method == 'median' else np.mean - filtered = [] - right = n // 2 - left = (n - 1) - right - for i in range(len(x)): - l, m, r = x[((i - left) * (left < i)):i], x[i], x[(i + 1):(i + 1 + right)] - filtered.append(measure(np.vstack((l, m, r)), axis=0)) - return np.array(filtered) - - if isinstance(X, list): - return [transform(x) for x in X] - elif isinstance(X, np.ndarray): - return transform(X) \ No newline at end of file diff --git a/lib/sequentia/preprocessing/preprocess.py b/lib/sequentia/preprocessing/preprocess.py index f3f0c99d..0b746ea3 100644 --- a/lib/sequentia/preprocessing/preprocess.py +++ b/lib/sequentia/preprocessing/preprocess.py @@ -1,126 +1,100 @@ import numpy as np -from .methods import ( - _trim_zeros, _center, _standardize, _downsample, _fft, _filtrate -) +from copy import copy +from tqdm.auto import tqdm +from .transforms import Transform from ..internals import _Validator -class Preprocess: - """Efficiently applies multiple preprocessing transformations to the provided input observation sequence(s).""" - - def __init__(self): - self._transforms = [] - self._val = _Validator() +__all__ = ['Preprocess'] - def trim_zeros(self): - """Trim zero-observations from the input observation sequence(s).""" - self._transforms.append((_trim_zeros, {})) - - def center(self): - """Centers an observation sequence (or multiple sequences) by centering observations around the mean.""" - self._transforms.append((_center, {})) +class Preprocess: + """A pipeline of preprocessing transformations. - def standardize(self): - """Standardizes an observation sequence (or multiple sequences) by transforming observations - so that they have zero mean and unit variance.""" - self._transforms.append((_standardize, {})) + Parameters + ---------- + steps: List[Transform] + A list of preprocessing transformations. + """ - def downsample(self, n, method='decimate'): - """Downsamples an observation sequence (or multiple sequences) by either: + def __init__(self, steps): + if not (isinstance(steps, list) and all(isinstance(step, Transform) for step in steps)): + raise TypeError("Expected steps to be list of Transform objects") + self._val = _Validator() + self.steps = steps - - Decimating the next :math:`n-1` observations - - Averaging the current observation with the next :math:`n-1` observations + def transform(self, X, verbose=False): + """Applies the preprocessing transformations to the provided input observation sequence(s). Parameters ---------- - n: int - Downsample factor. - - method: {'decimate', 'average'} - The downsampling method. - """ - self._val.restricted_integer(n, lambda x: x > 1, desc='downsample factor', expected='greater than one') - self._val.one_of(method, ['decimate', 'average'], desc='downsampling method') - self._transforms.append((_downsample, {'n': n, 'method': method})) + X: numpy.ndarray or List[numpy.ndarray] + An individual observation sequence or a list of multiple observation sequences. - def fft(self): - """Applies a Discrete Fourier Transform to the input observation sequence(s).""" - self._transforms.append((_fft, {})) + verbose: bool + Whether or not to display a progress bar when applying transformations. - def filtrate(self, n, method='median'): - """Applies a median or mean filter to the input observation sequence(s). + Returns + ------- + transformed: numpy.ndarray or List[numpy.ndarray] + The input observation sequence(s) with preprocessing transformations applied in order. + """ + X_t = copy(X) + pbar = tqdm(self.steps, desc='Applying transformations', disable=not(verbose and len(self.steps) > 1), leave=True, ncols='100%') + for step in pbar: + pbar.set_description("Applying transformations - {}".format(step._describe())) + X_t = step.transform(X_t, verbose=False) + return X_t + + def _fit(self, X, verbose): + """TODO""" + X = self._val.observation_sequences(X, allow_single=True) + X_t = copy(X) + pbar = tqdm(self.steps, desc='Fitting transformations', disable=not(verbose and len(self.steps) > 1), leave=True, ncols='100%') + for step in pbar: + pbar.set_description("Fitting transformations - {}".format(step._describe())) + X_t = step.fit_transform(X_t, verbose=False) + return X_t + + def fit(self, X, verbose=False): + """Fit the preprocessing transformations with the provided observation sequence(s). Parameters ---------- - n: int - Window size. + X: numpy.ndarray or List[numpy.ndarray] + An individual observation sequence or a list of multiple observation sequences. - method: {'median', 'mean'} - The filtering method. + verbose: bool + Whether or not to display a progress bar when fitting transformations. """ - self._val.restricted_integer(n, lambda x: x > 1, desc='window size', expected='greater than one') - self._val.one_of(method, ['median', 'mean'], desc='filtering method') - self._transforms.append((_filtrate, {'n': n, 'method': method})) + self._fit(X, verbose) - def transform(self, X): - """Applies the preprocessing transformations to the provided input observation sequence(s). + def fit_transform(self, X, verbose=False): + """Fit the preprocessing transformations with the provided observation sequence(s) and transform them. Parameters ---------- X: numpy.ndarray or List[numpy.ndarray] An individual observation sequence or a list of multiple observation sequences. + verbose: bool + Whether or not to display a progress bar when fitting and applying transformations. + Returns ------- transformed: numpy.ndarray or List[numpy.ndarray] The input observation sequence(s) with preprocessing transformations applied in order. """ - X_transform = self._val.observation_sequences(X, allow_single=True) - for transform, kwargs in self._transforms: - if transform == _downsample: - if isinstance(X_transform, np.ndarray): - self._val.restricted_integer(kwargs['n'], lambda x: x <= len(X_transform), - desc='downsample factor', expected='no greater than the number of frames') - else: - self._val.restricted_integer(kwargs['n'], lambda x: x <= min(len(x) for x in X_transform), - desc='downsample factor', expected='no greater than the number of frames in the shortest sequence') - elif transform == _filtrate: - if isinstance(X, np.ndarray): - self._val.restricted_integer(kwargs['n'], lambda x: x <= len(X), - desc='window size', expected='no greater than the number of frames') - else: - self._val.restricted_integer(kwargs['n'], lambda x: x <= min(len(x) for x in X), - desc='window size', expected='no greater than the number of frames in the shortest sequence') - X_transform = transform(X_transform, **kwargs) - return X_transform + return self._fit(X, verbose) def summary(self): """Displays an ordered summary of the preprocessing transformations.""" - if len(self._transforms) == 0: + if len(self.steps) == 0: raise RuntimeError('At least one preprocessing transformation is required') steps = [] - for i, (transform, kwargs) in enumerate(self._transforms): - idx = i + 1 - if transform == _center: - steps.append(('{}. Centering'.format(idx), None)) - elif transform == _standardize: - steps.append(('{}. Standardization'.format(idx), None)) - elif transform == _downsample: - header = 'Decimation' if kwargs['method'] == 'decimate' else 'Averaging' - steps.append(( - '{}. Downsampling:'.format(idx), - ' {} with downsample factor (n={})'.format(header, kwargs['n']) - )) - elif transform == _fft: - steps.append(('{}. Discrete Fourier Transform'.format(idx), None)) - elif transform == _filtrate: - steps.append(( - '{}. Filtering:'.format(idx), - ' {} filter with window size (n={})'.format(kwargs['method'].capitalize(), kwargs['n']) - )) - elif transform == _trim_zeros: - steps.append(('{}. Zero-trimming'.format(idx), None)) + for i, step in enumerate(self.steps, start=1): + class_name, description = step.__class__.__name__, step._describe() + steps.append(('{}. {}'.format(i, class_name), ' {}'.format(description))) title = 'Preprocessing summary:' length = max(max(len(h), 0 if b is None else len(b)) for h, b in steps) diff --git a/lib/sequentia/preprocessing/transforms.py b/lib/sequentia/preprocessing/transforms.py new file mode 100644 index 00000000..7fd70f0d --- /dev/null +++ b/lib/sequentia/preprocessing/transforms.py @@ -0,0 +1,267 @@ +import numpy as np +from copy import copy +from tqdm.auto import tqdm +from ..internals import _Validator + +__all__ = ['Transform', 'Equalize', 'TrimZeros', 'MinMaxScale', 'Center', 'Standardize', 'Downsample', 'Filter'] + +class Transform: + def __init__(self): + self._val = _Validator() + + def _describe(self): + """Description of the transformation. + + Returns + ------- + description: str + The description of the transformation. + """ + raise NotImplementedError + + def transform(self, X, verbose=False): + """Applies the transformation. + + Parameters + ---------- + X: numpy.ndarray or List[numpy.ndarray] + An individual observation sequence or a list of multiple observation sequences. + + verbose: bool + Whether or not to display a progress bar when applying transformations. + + Returns + ------- + transformed: numpy.ndarray or List[numpy.ndarray] + The transformed input observation sequence(s). + """ + raise NotImplementedError + + def _apply(self, transform, X, verbose): + """TODO""" + X = self._val.observation_sequences(X, allow_single=True) + verbose = self._val.boolean(verbose, 'verbose') + + def apply_transform(): + if isinstance(X, np.ndarray): + return transform(copy(X)) + else: + return [transform(x) for x in tqdm(copy(X), desc=self._describe(), disable=not(verbose))] + + if self._is_fitted(): + return apply_transform() + else: + try: + self.fit(X) + return apply_transform() + except: + raise + finally: + self._unfit() + + def fit(self, X): + """TODO""" + self._val.observation_sequences(X, allow_single=True) + + def _unfit(self): + """TODO""" + pass + + def _is_fitted(self): + """TODO""" + return False + + def fit_transform(self, X, verbose=False): + """Fit the transformation with the provided observation sequence(s) and transform them. + + Parameters + ---------- + X: numpy.ndarray or List[numpy.ndarray] + An individual observation sequence or a list of multiple observation sequences. + + verbose: bool + Whether or not to display a progress bar when fitting and applying transformations. + + Returns + ------- + transformed: numpy.ndarray or List[numpy.ndarray] + The transformed input observation sequence(s). + """ + self.fit(X) + return self.transform(X, verbose) + +class Equalize(Transform): + """Equalize all observation sequence lengths by padding or trimming zeros.""" + def __init__(self): + super().__init__() + self.length = None + + def fit(self, X): + """Fits the transformation with the length of the longest provided sequence. + + Parameters + ---------- + X: numpy.ndarray or List[numpy.ndarray] + An individual observation sequence or a list of multiple observation sequences. + """ + X = self._val.observation_sequences(X, allow_single=True) + self.length = max(len(x) for x in X) if isinstance(X, list) else len(X) + + def _unfit(self): + self.length = None + + def _is_fitted(self): + return self.length is not None + + def _describe(self): + return 'Equalize sequence lengths' + + def transform(self, X, verbose=False): + def equalize(x): + T, D = x.shape + return np.vstack((x, np.zeros((self.length - T, D)))) if T <= self.length else x[:self.length] + return self._apply(equalize, X, verbose) + +class TrimZeros(Transform): + """Trim zero-observations from the input observation sequence(s).""" + def _describe(self): + return 'Remove zero-observations' + + def transform(self, X, verbose=False): + def trim_zeros(x): + return x[~np.all(x == 0, axis=1)] + return self._apply(trim_zeros, X, verbose) + +class MinMaxScale(Transform): + """Scales the observation sequence features to each be within a provided range. + + Parameters + ---------- + scale: tuple(int, int) + The range of the transformed observation sequence features. + """ + def __init__(self, scale=(0, 1)): + super().__init__() + if not isinstance(scale, tuple): + raise TypeError('TODO') + if not all(isinstance(val, int) for val in scale): + raise TypeError('TODO') + if not scale[0] < scale[1]: + raise ValueError('TODO') + self.scale = scale + + def _describe(self): + return 'Min-max scaling into range {}'.format(self.scale) + + def transform(self, X, verbose=False): + def min_max_scale(x): + min_, max_ = self.scale + scale = (max_ - min_) / (x.max(axis=0) - x.min(axis=0)) + return scale * x + min_ - x.min(axis=0) * scale + return self._apply(min_max_scale, X, verbose) + +class Center(Transform): + """Centers the observation sequence features around their means. Results in zero-mean features.""" + def _describe(self): + return 'Centering around mean (zero mean)' + + def transform(self, X, verbose=False): + def center(x): + return x - x.mean(axis=0) + return self._apply(center, X, verbose) + +class Standardize(Transform): + """Centers the observation sequence features around their means, then scales them by their deviations. Results in zero-mean, unit-variance features.""" + def _describe(self): + return 'Standard scaling (zero mean, unit variance)' + + def transform(self, X, verbose=False): + def standardize(x): + return (x - x.mean(axis=0)) / x.std(axis=0) + return self._apply(standardize, X, verbose) + +class Downsample(Transform): + """Downsamples an observation sequence (or multiple sequences) by either: + + - Decimating the next :math:`n-1` observations + - Averaging the current observation with the next :math:`n-1` observations + + Parameters + ---------- + factor: int > 0 + Downsample factor. + + method: {'decimate', 'mean'} + The downsampling method. + """ + def __init__(self, factor, method='decimate'): + super().__init__() + self.factor = self._val.restricted_integer(factor, lambda x: x > 0, desc='downsample factor', expected='positive') + self.method = self._val.one_of(method, ['decimate', 'mean'], desc='downsampling method') + + def _describe(self): + method = 'Decimation' if self.method == 'decimate' else 'Mean' + return '{} downsampling with factor {}'.format(method, self.factor) + + def transform(self, X, verbose=False): + X = self._val.observation_sequences(X, allow_single=True) + + if isinstance(X, np.ndarray): + self._val.restricted_integer(self.factor, lambda x: x <= len(X), + desc='downsample factor', expected='no greater than the number of frames') + else: + self._val.restricted_integer(self.factor, lambda x: x <= min(len(x) for x in X), + desc='downsample factor', expected='no greater than the number of frames in the shortest sequence') + + def downsample(x): + N, D = x.shape + if self.method == 'decimate': + return np.delete(x, [i for i in range(N) if i % self.factor != 0], 0) + elif self.method == 'mean': + r = len(x) % self.factor + xn, xr = (x, None) if r == 0 else (x[:-r], x[-r:]) + dxn = xn.T.reshape(-1, self.factor).mean(axis=1).reshape(D, -1).T + return dxn if xr is None else np.vstack((dxn, xr.mean(axis=0))) + + return self._apply(downsample, X, verbose) + +class Filter(Transform): + """Applies a median or mean filter to the input observation sequence(s). + + Parameters + ---------- + window_size: int + The size of the filtering window. + + method: {'median', 'mean'} + The filtering method. + """ + def __init__(self, window_size, method='median'): + super().__init__() + self.window_size = self._val.restricted_integer(window_size, lambda x: x > 0, desc='window size', expected='positive') + self.method = self._val.one_of(method, ['median', 'mean'], desc='filtering method') + + def _describe(self): + return '{} filtering with window-size {}'.format(self.method.capitalize(), self.window_size) + + def transform(self, X, verbose=False): + X = self._val.observation_sequences(X, allow_single=True) + + if isinstance(X, np.ndarray): + self._val.restricted_integer(self.window_size, lambda x: x <= len(X), + desc='window size', expected='no greater than the number of frames') + else: + self._val.restricted_integer(self.window_size, lambda x: x <= min(len(x) for x in X), + desc='window size', expected='no greater than the number of frames in the shortest sequence') + + def filter_(x): + measure = np.median if self.method == 'median' else np.mean + filtered = [] + right = self.window_size // 2 + left = (self.window_size - 1) - right + for i in range(len(x)): + l, m, r = x[((i - left) * (left < i)):i], x[i], x[(i + 1):(i + 1 + right)] + filtered.append(measure(np.vstack((l, m, r)), axis=0)) + return np.array(filtered) + + return self._apply(filter_, X, verbose) \ No newline at end of file diff --git a/lib/test/lib/preprocessing/test_methods.py b/lib/test/lib/preprocessing/test_methods.py index ef60ecf6..5e2b7434 100644 --- a/lib/test/lib/preprocessing/test_methods.py +++ b/lib/test/lib/preprocessing/test_methods.py @@ -1,525 +1,525 @@ -import pytest -import numpy as np -from sequentia.preprocessing import trim_zeros, downsample, center, standardize, fft, filtrate -from ...support import assert_equal, assert_all_equal - -# Set seed for reproducible randomness -seed = 0 -np.random.seed(seed) -rng = np.random.RandomState(seed) - -# Sample data -X_even = rng.random((6, 2)) -X_odd = rng.random((7, 2)) -Xs = [i * rng.random((3 * i, 2)) for i in range(1, 4)] - -# Zero-padded sample data -zeros = np.zeros((3, 2)) -X_padded = np.vstack((zeros, X_even, zeros)) -Xs_padded = [np.vstack((zeros, x, zeros)) for x in Xs] - -# ============ # -# trim_zeros() # -# ============ # - -def test_trim_zeros_single(): - """Trim a single zero-padded observation sequence""" - assert_equal(trim_zeros(X_padded), np.array([ - [0.5488135 , 0.71518937], - [0.60276338, 0.54488318], - [0.4236548 , 0.64589411], - [0.43758721, 0.891773 ], - [0.96366276, 0.38344152], - [0.79172504, 0.52889492] - ])) - -def test_trim_zeros_multiple(): - """Trim multiple zero-padded observation sequences""" - assert_all_equal(trim_zeros(Xs_padded), [ - np.array([ - [0.14335329, 0.94466892], - [0.52184832, 0.41466194], - [0.26455561, 0.77423369] - ]), - np.array([ - [0.91230066, 1.1368679 ], - [0.0375796 , 1.23527099], - [1.22419145, 1.23386799], - [1.88749616, 1.3636406 ], - [0.7190158 , 0.87406391], - [1.39526239, 0.12045094] - ]), - np.array([ - [2.00030015, 2.01191361], - [0.63114768, 0.38677889], - [0.94628505, 1.09113231], - [1.71059031, 1.31580454], - [2.96512151, 0.30613443], - [0.62663027, 0.48392855], - [1.95932498, 0.75987481], - [1.39893232, 0.73327678], - [0.47690875, 0.33112542] - ]) - ]) - -# ======== # -# center() # -# ======== # - -def test_center_single_even(): - """Center a single even-length observation sequence""" - assert_equal(center(X_even), np.array([ - [-0.07922094, 0.09684335 ], - [-0.02527107, -0.07346283], - [-0.20437965, 0.0275481 ], - [-0.19044724, 0.27342698 ], - [0.33562831 , -0.2349045 ], - [0.16369059 , -0.0894511 ] - ])) - -def test_center_single_odd(): - """Center a single odd-length observation sequence""" - assert_equal(center(X_odd), np.array([ - [0.14006915 , 0.2206014 ], - [-0.35693936, -0.61786594], - [-0.40775702, 0.1276246 ], - [0.35018134 , 0.16501691 ], - [0.55064293 , 0.09416332 ], - [0.03350395 , 0.07553393 ], - [-0.30970099, -0.06507422] - ])) - -def test_center_multiple(): - """Center multiple observation sequences""" - assert_all_equal(center(Xs), [ - np.array([ - [-0.16656579, 0.23348073 ], - [0.21192925 , -0.29652624], - [-0.04536346, 0.06304551 ] - ]), - np.array([ - [-0.11700701, 0.14284084 ], - [-0.99172808, 0.24124394 ], - [0.19488377 , 0.23984094 ], - [0.85818848 , 0.36961354 ], - [-0.31029188, -0.11996315], - [0.36595472 , -0.87357611] - ]), - np.array([ - [0.58749559 , 1.18747257 ], - [-0.78165687, -0.43766215], - [-0.46651951, 0.26669127 ], - [0.29778575 , 0.4913635 ], - [1.55231696 , -0.51830661], - [-0.78617429, -0.34051249], - [0.54652042 , -0.06456623], - [-0.01387224, -0.09116426], - [-0.93589581, -0.49331562] - ]) - ]) - -# ============= # -# standardize() # -# ============= # - -def test_standardize_single_even(): - """Standardize a single even-length observation sequence""" - assert_equal(standardize(X_even), np.array([ - [-0.40964472, 0.60551094], - [-0.13067455, -0.45932478], - [-1.05682966, 0.17224387], - [-0.98478635, 1.70959629], - [ 1.73550526, -1.46873528], - [ 0.84643002, -0.55929105] - ])) - -def test_standardize_single_odd(): - """Standardize a single odd-length observation sequence""" - assert_equal(standardize(X_odd), np.array([ - [ 0.40527155, 0.83146609], - [-1.03275681, -2.32879115], - [-1.17979099, 0.48102837], - [ 1.01320338, 0.62196325], - [ 1.59321247, 0.35490986], - [ 0.09693924, 0.28469405], - [-0.89607884, -0.24527047] - ])) - -def test_standardize_multiple(): - """Standardize multiple observation sequences""" - assert_all_equal(standardize(Xs), [ - np.array([ - [-1.05545468, 1.05686059], - [ 1.34290313, -1.34223879], - [-0.28744845, 0.2853782 ] - ]), - np.array([ - [-0.20256659, 0.34141162], - [-1.71691396, 0.57661018], - [ 0.33738952, 0.57325679], - [ 1.4857256 , 0.88343331], - [-0.53718803, -0.28673041], - [ 0.63355347, -2.08798149] - ]), - np.array([ - [ 0.75393018, 2.22884906], - [-1.0030964 , -0.82147823], - [-0.59868217, 0.50057122], - [ 0.38214698, 0.922274 ], - [ 1.99208067, -0.97284537], - [-1.00889357, -0.63913134], - [ 0.70134695, -0.12118881], - [-0.01780218, -0.17111248], - [-1.20103046, -0.92593806] - ]) - ]) - -# ============ # -# downsample() # -# ============ # - -def test_downsample_single_large_factor(): - """Downsample a single observation sequence with a downsample factor that is too large""" - with pytest.raises(ValueError) as e: - downsample(X_even, n=7) - assert str(e.value) == 'Expected downsample factor to be no greater than the number of frames' - -def test_downsample_single_decimate_max(): - """Downsample a single observation sequence with decimation and the maximum downsample factor""" - assert_equal(downsample(X_even, n=6, method='decimate'), np.array([ - [0.548814, 0.715189] - ])) - -def test_downsample_single_decimate(): - """Downsample a single observation sequence with decimation""" - assert_equal(downsample(X_odd, n=3, method='decimate'), np.array([ - [0.56804456, 0.92559664], - [0.77815675, 0.87001215], - [0.11827443, 0.63992102] - ])) - -def test_downsample_single_average_max(): - """Downsample a single observation sequence with averaging and the maximum downsample factor""" - assert_equal(downsample(X_even, n=6, method='average'), np.array([ - [0.62803445, 0.61834602] - ])) - -def test_downsample_single_average(): - """Downsample a single observation sequence with averaging""" - assert_equal(downsample(X_odd, n=3, method='average'), np.array([ - [0.21976634, 0.61511526], - [0.73941815, 0.81656663], - [0.11827443, 0.63992102] - ])) - -def test_downsample_multiple_large_factor(): - """Downsample multiple observation sequences with a downsample factor that is too large""" - with pytest.raises(ValueError) as e: - downsample(Xs, n=4) - assert str(e.value) == 'Expected downsample factor to be no greater than the number of frames in the shortest sequence' - -def test_downsample_multiple_decimate_max(): - """Downsample multiple observation sequences with decimation and the maximum downsample factor""" - assert_all_equal(downsample(Xs, n=3, method='decimate'), [ - np.array([[0.14335329, 0.94466892]]), - np.array([ - [0.91230066, 1.1368679], - [1.88749616, 1.3636406] - ]), - np.array([ - [2.00030015, 2.01191361], - [1.71059031, 1.31580454], - [1.95932498, 0.75987481] - ]) - ]) - -def test_downsample_multiple_decimate(): - """Downsample multiple observation sequences with decimation""" - assert_all_equal(downsample(Xs, n=2, method='decimate'), [ - np.array([ - [0.14335329, 0.94466892], - [0.26455561, 0.77423369] - ]), - np.array([ - [0.91230066, 1.1368679 ], - [1.22419145, 1.23386799], - [0.7190158 , 0.87406391] - ]), - np.array([ - [2.00030015, 2.01191361], - [0.94628505, 1.09113231], - [2.96512151, 0.30613443], - [1.95932498, 0.75987481], - [0.47690875, 0.33112542] - ]) - ]) - -def test_downsample_multiple_average_max(): - """Downsample multiple observation sequences with averaging and the maximum downsample factor""" - assert_all_equal(downsample(Xs, n=3, method='average'), [ - np.array([[0.30991907, 0.71118818]]), - np.array([ - [0.72469057, 1.2020023 ], - [1.33392478, 0.78605182] - ]), - np.array([ - [1.19257763, 1.16327494], - [1.76744736, 0.70195584], - [1.27838868, 0.60809234] - ]) - ]) - -def test_downsample_multiple_average(): - """Downsample multiple observation sequences with averaging""" - assert_all_equal(downsample(Xs, n=2, method='average'), [ - np.array([ - [0.3326008 , 0.67966543], - [0.26455561, 0.77423369] - ]), - np.array([ - [0.47494013, 1.18606945], - [1.5558438 , 1.2987543 ], - [1.0571391 , 0.49725743] - ]), - np.array([ - [1.31572391, 1.19934625], - [1.32843768, 1.20346843], - [1.79587589, 0.39503149], - [1.67912865, 0.74657579], - [0.47690875, 0.33112542] - ]) - ]) - -# ===== # -# fft() # -# ===== # - -def test_fft_single_even(): - """Fourier-transform a single even-length observation sequence""" - assert_equal(fft(X_even), np.array([ - [3.76820669 , 3.7100761 ], - [0.11481172 , -0.1543624 ], - [0.63130621 , -0.24113686], - [-0.40450227, 0.5554055 ], - [-0.30401501, 0.21344437 ], - [0.10405544 , -0.22102611] - ])) - -def test_fft_single_odd(): - """Fourier-transform a single odd-length observation sequence""" - assert_equal(fft(X_odd), np.array([ - [2.9958279 , 4.93496669 ], - [-1.00390978, -0.48392518], - [0.5541071 , 0.35066311 ], - [1.18725568 , 0.35112659 ], - [-0.30212914, 0.61692894 ], - [ 0.30689611, 0.90490347 ], - [-0.12906015, 0.21149633 ] - ])) - -def test_fft_multiple(): - """Fourier-transform multiple observation sequences""" - assert_all_equal(fft(Xs), [ - np.array([ - [0.92975722 , 2.13356455], - [-0.24984868, 0.3502211 ], - [-0.22282202, 0.31139827] - ]), - np.array([ - [6.17584606 , 5.96416233 ], - [-1.23037812, -0.60287768], - [0.73829285 , -1.27706196], - [1.1117722 , 0.76868158 ], - [1.61328273 , -0.65386301], - [-0.46483024, 0.52543726 ] - ]), - np.array([ - [1.27152410e+01 , 7.41996935e+00 ], - [-1.95373695e+00, 1.09840950e+00 ], - [-2.37772910e-01, -8.08832368e-01], - [9.05412519e-01 , -1.04236869e-02], - [1.29066145e+00 , 1.89963643e-01 ], - [2.14770264e+00 , 2.42140476e+00 ], - [-2.55077169e+00, 4.15688893e-01 ], - [1.54435193e+00 , 1.83423599e+00 ], - [2.17466597e+00 , -4.45551803e-01] - ]) - ]) - -# ========== # -# filtrate() # -# ========== # - -def test_filtrate_single_large_window(): - """Filter a single observation sequence with a window size that is too large""" - with pytest.raises(ValueError) as e: - filtrate(X_even, n=7) - assert str(e.value) == 'Expected window size to be no greater than the number of frames' - -def test_filtrate_single_median_max(): - """Filter a single observation sequence with median filtering and the maximum window size""" - assert_equal(filtrate(X_even, n=6, method='median'), np.array([ - [0.49320036, 0.68054174], - [0.5488135 , 0.64589411], - [0.57578844, 0.59538865], - [0.60276338, 0.54488318], - [0.61465612, 0.58739452], - [0.79172504, 0.52889492] - ])) - -def test_filtrate_single_median(): - """Filter a single observation sequence with median filtering""" - assert_equal(filtrate(X_odd, n=3, method='median'), np.array([ - [0.31954031, 0.50636297], - [0.07103606, 0.83261985], - [0.07103606, 0.83261985], - [0.77815675, 0.83261985], - [0.77815675, 0.79915856], - [0.46147936, 0.78052918], - [0.28987689, 0.7102251 ] - ])) - -def test_filtrate_single_mean_max(): - """Filter a single observation sequence with mean filtering and the maximum window size""" - assert_equal(filtrate(X_even, n=6, method='mean'), np.array([ - [0.50320472, 0.69943492], - [0.59529633, 0.63623624], - [0.62803445, 0.61834602], - [0.64387864, 0.59897735], - [0.65415745, 0.61250089], - [0.73099167, 0.60136981] - ])) - -def test_filtrate_single_mean(): - """Filter a single observation sequence with mean filtering""" - assert_equal(filtrate(X_odd, n=3, method='mean'), np.array([ - [0.31954031, 0.50636297], - [0.21976634, 0.61511526], - [0.28980374, 0.5965871 ], - [0.59233116, 0.83393019], - [0.73941815, 0.81656663], - [0.51945738, 0.73986959], - [0.28987689, 0.7102251 ] - ])) - -def test_filtrate_multiple_large_window(): - """Filter multiple observation sequences with a window size that is too large""" - with pytest.raises(ValueError) as e: - filtrate(Xs, n=4) - assert str(e.value) == 'Expected window size to be no greater than the number of frames in the shortest sequence' - -def test_filtrate_multiple_median_max(): - """Filter multiple observation sequences with median filtering and the maximum window size""" - assert_all_equal(filtrate(Xs, n=3, method='median'), [ - np.array([ - [0.3326008 , 0.67966543], - [0.26455561, 0.77423369], - [0.39320197, 0.59444781] - ]), - np.array([ - [0.47494013, 1.18606945], - [0.91230066, 1.23386799], - [1.22419145, 1.23527099], - [1.22419145, 1.23386799], - [1.39526239, 0.87406391], - [1.0571391 , 0.49725743] - ]), - np.array([ - [1.31572391, 1.19934625], - [0.94628505, 1.09113231], - [0.94628505, 1.09113231], - [1.71059031, 1.09113231], - [1.71059031, 0.48392855], - [1.95932498, 0.48392855], - [1.39893232, 0.73327678], - [1.39893232, 0.73327678], - [0.93792053, 0.5322011 ] - ]) - ]) - -def test_filtrate_multiple_median(): - """Filter multiple observation sequences with median filtering""" - assert_all_equal(filtrate(Xs, n=2, method='median'), [ - np.array([ - [0.3326008 , 0.67966543], - [0.39320197, 0.59444781], - [0.26455561, 0.77423369] - ]), - np.array([ - [0.47494013, 1.18606945], - [0.63088552, 1.23456949], - [1.5558438 , 1.2987543 ], - [1.30325598, 1.11885225], - [1.0571391 , 0.49725743], - [1.39526239, 0.12045094] - ]), - np.array([ - [1.31572391, 1.19934625], - [0.78871637, 0.7389556 ], - [1.32843768, 1.20346843], - [2.33785591, 0.81096949], - [1.79587589, 0.39503149], - [1.29297762, 0.62190168], - [1.67912865, 0.74657579], - [0.93792053, 0.5322011 ], - [0.47690875, 0.33112542] - ]) - ]) - -def test_filtrate_multiple_average_max(): - """Filter multiple observation sequences with mean filtering and the maximum window size""" - assert_all_equal(filtrate(Xs, n=3, method='mean'), [ - np.array([ - [0.3326008 , 0.67966543], - [0.30991907, 0.71118818], - [0.39320197, 0.59444781] - ]), - np.array([ - [0.47494013, 1.18606945], - [0.72469057, 1.2020023 ], - [1.04975573, 1.2775932 ], - [1.27690113, 1.15719083], - [1.33392478, 0.78605182], - [1.0571391 , 0.49725743] - ]), - np.array([ - [1.31572391, 1.19934625], - [1.19257763, 1.16327494], - [1.09600768, 0.93123858], - [1.87399896, 0.9043571 ], - [1.76744736, 0.70195584], - [1.85035892, 0.51664593], - [1.32829585, 0.65902671], - [1.27838868, 0.60809234], - [0.93792053, 0.5322011 ] - ]) - ]) - -def test_filtrate_multiple_mean(): - """Filter multiple observation sequences with mean filtering""" - assert_all_equal(filtrate(Xs, n=2, method='mean'), [ - np.array([ - [0.3326008 , 0.67966543], - [0.39320197, 0.59444781], - [0.26455561, 0.77423369] - ]), - np.array([ - [0.47494013, 1.18606945], - [0.63088552, 1.23456949], - [1.5558438 , 1.2987543 ], - [1.30325598, 1.11885225], - [1.0571391 , 0.49725743], - [1.39526239, 0.12045094] - ]), - np.array([ - [1.31572391, 1.19934625], - [0.78871637, 0.7389556 ], - [1.32843768, 1.20346843], - [2.33785591, 0.81096949], - [1.79587589, 0.39503149], - [1.29297762, 0.62190168], - [1.67912865, 0.74657579], - [0.93792053, 0.5322011 ], - [0.47690875, 0.33112542] - ]) - ]) \ No newline at end of file +# import pytest +# import numpy as np +# from sequentia.preprocessing import trim_zeros, downsample, center, standardize, fft, filtrate +# from ...support import assert_equal, assert_all_equal + +# # Set seed for reproducible randomness +# seed = 0 +# np.random.seed(seed) +# rng = np.random.RandomState(seed) + +# # Sample data +# X_even = rng.random((6, 2)) +# X_odd = rng.random((7, 2)) +# Xs = [i * rng.random((3 * i, 2)) for i in range(1, 4)] + +# # Zero-padded sample data +# zeros = np.zeros((3, 2)) +# X_padded = np.vstack((zeros, X_even, zeros)) +# Xs_padded = [np.vstack((zeros, x, zeros)) for x in Xs] + +# # ============ # +# # trim_zeros() # +# # ============ # + +# def test_trim_zeros_single(): +# """Trim a single zero-padded observation sequence""" +# assert_equal(trim_zeros(X_padded), np.array([ +# [0.5488135 , 0.71518937], +# [0.60276338, 0.54488318], +# [0.4236548 , 0.64589411], +# [0.43758721, 0.891773 ], +# [0.96366276, 0.38344152], +# [0.79172504, 0.52889492] +# ])) + +# def test_trim_zeros_multiple(): +# """Trim multiple zero-padded observation sequences""" +# assert_all_equal(trim_zeros(Xs_padded), [ +# np.array([ +# [0.14335329, 0.94466892], +# [0.52184832, 0.41466194], +# [0.26455561, 0.77423369] +# ]), +# np.array([ +# [0.91230066, 1.1368679 ], +# [0.0375796 , 1.23527099], +# [1.22419145, 1.23386799], +# [1.88749616, 1.3636406 ], +# [0.7190158 , 0.87406391], +# [1.39526239, 0.12045094] +# ]), +# np.array([ +# [2.00030015, 2.01191361], +# [0.63114768, 0.38677889], +# [0.94628505, 1.09113231], +# [1.71059031, 1.31580454], +# [2.96512151, 0.30613443], +# [0.62663027, 0.48392855], +# [1.95932498, 0.75987481], +# [1.39893232, 0.73327678], +# [0.47690875, 0.33112542] +# ]) +# ]) + +# # ======== # +# # center() # +# # ======== # + +# def test_center_single_even(): +# """Center a single even-length observation sequence""" +# assert_equal(center(X_even), np.array([ +# [-0.07922094, 0.09684335 ], +# [-0.02527107, -0.07346283], +# [-0.20437965, 0.0275481 ], +# [-0.19044724, 0.27342698 ], +# [0.33562831 , -0.2349045 ], +# [0.16369059 , -0.0894511 ] +# ])) + +# def test_center_single_odd(): +# """Center a single odd-length observation sequence""" +# assert_equal(center(X_odd), np.array([ +# [0.14006915 , 0.2206014 ], +# [-0.35693936, -0.61786594], +# [-0.40775702, 0.1276246 ], +# [0.35018134 , 0.16501691 ], +# [0.55064293 , 0.09416332 ], +# [0.03350395 , 0.07553393 ], +# [-0.30970099, -0.06507422] +# ])) + +# def test_center_multiple(): +# """Center multiple observation sequences""" +# assert_all_equal(center(Xs), [ +# np.array([ +# [-0.16656579, 0.23348073 ], +# [0.21192925 , -0.29652624], +# [-0.04536346, 0.06304551 ] +# ]), +# np.array([ +# [-0.11700701, 0.14284084 ], +# [-0.99172808, 0.24124394 ], +# [0.19488377 , 0.23984094 ], +# [0.85818848 , 0.36961354 ], +# [-0.31029188, -0.11996315], +# [0.36595472 , -0.87357611] +# ]), +# np.array([ +# [0.58749559 , 1.18747257 ], +# [-0.78165687, -0.43766215], +# [-0.46651951, 0.26669127 ], +# [0.29778575 , 0.4913635 ], +# [1.55231696 , -0.51830661], +# [-0.78617429, -0.34051249], +# [0.54652042 , -0.06456623], +# [-0.01387224, -0.09116426], +# [-0.93589581, -0.49331562] +# ]) +# ]) + +# # ============= # +# # standardize() # +# # ============= # + +# def test_standardize_single_even(): +# """Standardize a single even-length observation sequence""" +# assert_equal(standardize(X_even), np.array([ +# [-0.40964472, 0.60551094], +# [-0.13067455, -0.45932478], +# [-1.05682966, 0.17224387], +# [-0.98478635, 1.70959629], +# [ 1.73550526, -1.46873528], +# [ 0.84643002, -0.55929105] +# ])) + +# def test_standardize_single_odd(): +# """Standardize a single odd-length observation sequence""" +# assert_equal(standardize(X_odd), np.array([ +# [ 0.40527155, 0.83146609], +# [-1.03275681, -2.32879115], +# [-1.17979099, 0.48102837], +# [ 1.01320338, 0.62196325], +# [ 1.59321247, 0.35490986], +# [ 0.09693924, 0.28469405], +# [-0.89607884, -0.24527047] +# ])) + +# def test_standardize_multiple(): +# """Standardize multiple observation sequences""" +# assert_all_equal(standardize(Xs), [ +# np.array([ +# [-1.05545468, 1.05686059], +# [ 1.34290313, -1.34223879], +# [-0.28744845, 0.2853782 ] +# ]), +# np.array([ +# [-0.20256659, 0.34141162], +# [-1.71691396, 0.57661018], +# [ 0.33738952, 0.57325679], +# [ 1.4857256 , 0.88343331], +# [-0.53718803, -0.28673041], +# [ 0.63355347, -2.08798149] +# ]), +# np.array([ +# [ 0.75393018, 2.22884906], +# [-1.0030964 , -0.82147823], +# [-0.59868217, 0.50057122], +# [ 0.38214698, 0.922274 ], +# [ 1.99208067, -0.97284537], +# [-1.00889357, -0.63913134], +# [ 0.70134695, -0.12118881], +# [-0.01780218, -0.17111248], +# [-1.20103046, -0.92593806] +# ]) +# ]) + +# # ============ # +# # downsample() # +# # ============ # + +# def test_downsample_single_large_factor(): +# """Downsample a single observation sequence with a downsample factor that is too large""" +# with pytest.raises(ValueError) as e: +# downsample(X_even, n=7) +# assert str(e.value) == 'Expected downsample factor to be no greater than the number of frames' + +# def test_downsample_single_decimate_max(): +# """Downsample a single observation sequence with decimation and the maximum downsample factor""" +# assert_equal(downsample(X_even, n=6, method='decimate'), np.array([ +# [0.548814, 0.715189] +# ])) + +# def test_downsample_single_decimate(): +# """Downsample a single observation sequence with decimation""" +# assert_equal(downsample(X_odd, n=3, method='decimate'), np.array([ +# [0.56804456, 0.92559664], +# [0.77815675, 0.87001215], +# [0.11827443, 0.63992102] +# ])) + +# def test_downsample_single_average_max(): +# """Downsample a single observation sequence with averaging and the maximum downsample factor""" +# assert_equal(downsample(X_even, n=6, method='average'), np.array([ +# [0.62803445, 0.61834602] +# ])) + +# def test_downsample_single_average(): +# """Downsample a single observation sequence with averaging""" +# assert_equal(downsample(X_odd, n=3, method='average'), np.array([ +# [0.21976634, 0.61511526], +# [0.73941815, 0.81656663], +# [0.11827443, 0.63992102] +# ])) + +# def test_downsample_multiple_large_factor(): +# """Downsample multiple observation sequences with a downsample factor that is too large""" +# with pytest.raises(ValueError) as e: +# downsample(Xs, n=4) +# assert str(e.value) == 'Expected downsample factor to be no greater than the number of frames in the shortest sequence' + +# def test_downsample_multiple_decimate_max(): +# """Downsample multiple observation sequences with decimation and the maximum downsample factor""" +# assert_all_equal(downsample(Xs, n=3, method='decimate'), [ +# np.array([[0.14335329, 0.94466892]]), +# np.array([ +# [0.91230066, 1.1368679], +# [1.88749616, 1.3636406] +# ]), +# np.array([ +# [2.00030015, 2.01191361], +# [1.71059031, 1.31580454], +# [1.95932498, 0.75987481] +# ]) +# ]) + +# def test_downsample_multiple_decimate(): +# """Downsample multiple observation sequences with decimation""" +# assert_all_equal(downsample(Xs, n=2, method='decimate'), [ +# np.array([ +# [0.14335329, 0.94466892], +# [0.26455561, 0.77423369] +# ]), +# np.array([ +# [0.91230066, 1.1368679 ], +# [1.22419145, 1.23386799], +# [0.7190158 , 0.87406391] +# ]), +# np.array([ +# [2.00030015, 2.01191361], +# [0.94628505, 1.09113231], +# [2.96512151, 0.30613443], +# [1.95932498, 0.75987481], +# [0.47690875, 0.33112542] +# ]) +# ]) + +# def test_downsample_multiple_average_max(): +# """Downsample multiple observation sequences with averaging and the maximum downsample factor""" +# assert_all_equal(downsample(Xs, n=3, method='average'), [ +# np.array([[0.30991907, 0.71118818]]), +# np.array([ +# [0.72469057, 1.2020023 ], +# [1.33392478, 0.78605182] +# ]), +# np.array([ +# [1.19257763, 1.16327494], +# [1.76744736, 0.70195584], +# [1.27838868, 0.60809234] +# ]) +# ]) + +# def test_downsample_multiple_average(): +# """Downsample multiple observation sequences with averaging""" +# assert_all_equal(downsample(Xs, n=2, method='average'), [ +# np.array([ +# [0.3326008 , 0.67966543], +# [0.26455561, 0.77423369] +# ]), +# np.array([ +# [0.47494013, 1.18606945], +# [1.5558438 , 1.2987543 ], +# [1.0571391 , 0.49725743] +# ]), +# np.array([ +# [1.31572391, 1.19934625], +# [1.32843768, 1.20346843], +# [1.79587589, 0.39503149], +# [1.67912865, 0.74657579], +# [0.47690875, 0.33112542] +# ]) +# ]) + +# # ===== # +# # fft() # +# # ===== # + +# def test_fft_single_even(): +# """Fourier-transform a single even-length observation sequence""" +# assert_equal(fft(X_even), np.array([ +# [3.76820669 , 3.7100761 ], +# [0.11481172 , -0.1543624 ], +# [0.63130621 , -0.24113686], +# [-0.40450227, 0.5554055 ], +# [-0.30401501, 0.21344437 ], +# [0.10405544 , -0.22102611] +# ])) + +# def test_fft_single_odd(): +# """Fourier-transform a single odd-length observation sequence""" +# assert_equal(fft(X_odd), np.array([ +# [2.9958279 , 4.93496669 ], +# [-1.00390978, -0.48392518], +# [0.5541071 , 0.35066311 ], +# [1.18725568 , 0.35112659 ], +# [-0.30212914, 0.61692894 ], +# [ 0.30689611, 0.90490347 ], +# [-0.12906015, 0.21149633 ] +# ])) + +# def test_fft_multiple(): +# """Fourier-transform multiple observation sequences""" +# assert_all_equal(fft(Xs), [ +# np.array([ +# [0.92975722 , 2.13356455], +# [-0.24984868, 0.3502211 ], +# [-0.22282202, 0.31139827] +# ]), +# np.array([ +# [6.17584606 , 5.96416233 ], +# [-1.23037812, -0.60287768], +# [0.73829285 , -1.27706196], +# [1.1117722 , 0.76868158 ], +# [1.61328273 , -0.65386301], +# [-0.46483024, 0.52543726 ] +# ]), +# np.array([ +# [1.27152410e+01 , 7.41996935e+00 ], +# [-1.95373695e+00, 1.09840950e+00 ], +# [-2.37772910e-01, -8.08832368e-01], +# [9.05412519e-01 , -1.04236869e-02], +# [1.29066145e+00 , 1.89963643e-01 ], +# [2.14770264e+00 , 2.42140476e+00 ], +# [-2.55077169e+00, 4.15688893e-01 ], +# [1.54435193e+00 , 1.83423599e+00 ], +# [2.17466597e+00 , -4.45551803e-01] +# ]) +# ]) + +# # ========== # +# # filtrate() # +# # ========== # + +# def test_filtrate_single_large_window(): +# """Filter a single observation sequence with a window size that is too large""" +# with pytest.raises(ValueError) as e: +# filtrate(X_even, n=7) +# assert str(e.value) == 'Expected window size to be no greater than the number of frames' + +# def test_filtrate_single_median_max(): +# """Filter a single observation sequence with median filtering and the maximum window size""" +# assert_equal(filtrate(X_even, n=6, method='median'), np.array([ +# [0.49320036, 0.68054174], +# [0.5488135 , 0.64589411], +# [0.57578844, 0.59538865], +# [0.60276338, 0.54488318], +# [0.61465612, 0.58739452], +# [0.79172504, 0.52889492] +# ])) + +# def test_filtrate_single_median(): +# """Filter a single observation sequence with median filtering""" +# assert_equal(filtrate(X_odd, n=3, method='median'), np.array([ +# [0.31954031, 0.50636297], +# [0.07103606, 0.83261985], +# [0.07103606, 0.83261985], +# [0.77815675, 0.83261985], +# [0.77815675, 0.79915856], +# [0.46147936, 0.78052918], +# [0.28987689, 0.7102251 ] +# ])) + +# def test_filtrate_single_mean_max(): +# """Filter a single observation sequence with mean filtering and the maximum window size""" +# assert_equal(filtrate(X_even, n=6, method='mean'), np.array([ +# [0.50320472, 0.69943492], +# [0.59529633, 0.63623624], +# [0.62803445, 0.61834602], +# [0.64387864, 0.59897735], +# [0.65415745, 0.61250089], +# [0.73099167, 0.60136981] +# ])) + +# def test_filtrate_single_mean(): +# """Filter a single observation sequence with mean filtering""" +# assert_equal(filtrate(X_odd, n=3, method='mean'), np.array([ +# [0.31954031, 0.50636297], +# [0.21976634, 0.61511526], +# [0.28980374, 0.5965871 ], +# [0.59233116, 0.83393019], +# [0.73941815, 0.81656663], +# [0.51945738, 0.73986959], +# [0.28987689, 0.7102251 ] +# ])) + +# def test_filtrate_multiple_large_window(): +# """Filter multiple observation sequences with a window size that is too large""" +# with pytest.raises(ValueError) as e: +# filtrate(Xs, n=4) +# assert str(e.value) == 'Expected window size to be no greater than the number of frames in the shortest sequence' + +# def test_filtrate_multiple_median_max(): +# """Filter multiple observation sequences with median filtering and the maximum window size""" +# assert_all_equal(filtrate(Xs, n=3, method='median'), [ +# np.array([ +# [0.3326008 , 0.67966543], +# [0.26455561, 0.77423369], +# [0.39320197, 0.59444781] +# ]), +# np.array([ +# [0.47494013, 1.18606945], +# [0.91230066, 1.23386799], +# [1.22419145, 1.23527099], +# [1.22419145, 1.23386799], +# [1.39526239, 0.87406391], +# [1.0571391 , 0.49725743] +# ]), +# np.array([ +# [1.31572391, 1.19934625], +# [0.94628505, 1.09113231], +# [0.94628505, 1.09113231], +# [1.71059031, 1.09113231], +# [1.71059031, 0.48392855], +# [1.95932498, 0.48392855], +# [1.39893232, 0.73327678], +# [1.39893232, 0.73327678], +# [0.93792053, 0.5322011 ] +# ]) +# ]) + +# def test_filtrate_multiple_median(): +# """Filter multiple observation sequences with median filtering""" +# assert_all_equal(filtrate(Xs, n=2, method='median'), [ +# np.array([ +# [0.3326008 , 0.67966543], +# [0.39320197, 0.59444781], +# [0.26455561, 0.77423369] +# ]), +# np.array([ +# [0.47494013, 1.18606945], +# [0.63088552, 1.23456949], +# [1.5558438 , 1.2987543 ], +# [1.30325598, 1.11885225], +# [1.0571391 , 0.49725743], +# [1.39526239, 0.12045094] +# ]), +# np.array([ +# [1.31572391, 1.19934625], +# [0.78871637, 0.7389556 ], +# [1.32843768, 1.20346843], +# [2.33785591, 0.81096949], +# [1.79587589, 0.39503149], +# [1.29297762, 0.62190168], +# [1.67912865, 0.74657579], +# [0.93792053, 0.5322011 ], +# [0.47690875, 0.33112542] +# ]) +# ]) + +# def test_filtrate_multiple_average_max(): +# """Filter multiple observation sequences with mean filtering and the maximum window size""" +# assert_all_equal(filtrate(Xs, n=3, method='mean'), [ +# np.array([ +# [0.3326008 , 0.67966543], +# [0.30991907, 0.71118818], +# [0.39320197, 0.59444781] +# ]), +# np.array([ +# [0.47494013, 1.18606945], +# [0.72469057, 1.2020023 ], +# [1.04975573, 1.2775932 ], +# [1.27690113, 1.15719083], +# [1.33392478, 0.78605182], +# [1.0571391 , 0.49725743] +# ]), +# np.array([ +# [1.31572391, 1.19934625], +# [1.19257763, 1.16327494], +# [1.09600768, 0.93123858], +# [1.87399896, 0.9043571 ], +# [1.76744736, 0.70195584], +# [1.85035892, 0.51664593], +# [1.32829585, 0.65902671], +# [1.27838868, 0.60809234], +# [0.93792053, 0.5322011 ] +# ]) +# ]) + +# def test_filtrate_multiple_mean(): +# """Filter multiple observation sequences with mean filtering""" +# assert_all_equal(filtrate(Xs, n=2, method='mean'), [ +# np.array([ +# [0.3326008 , 0.67966543], +# [0.39320197, 0.59444781], +# [0.26455561, 0.77423369] +# ]), +# np.array([ +# [0.47494013, 1.18606945], +# [0.63088552, 1.23456949], +# [1.5558438 , 1.2987543 ], +# [1.30325598, 1.11885225], +# [1.0571391 , 0.49725743], +# [1.39526239, 0.12045094] +# ]), +# np.array([ +# [1.31572391, 1.19934625], +# [0.78871637, 0.7389556 ], +# [1.32843768, 1.20346843], +# [2.33785591, 0.81096949], +# [1.79587589, 0.39503149], +# [1.29297762, 0.62190168], +# [1.67912865, 0.74657579], +# [0.93792053, 0.5322011 ], +# [0.47690875, 0.33112542] +# ]) +# ]) \ No newline at end of file diff --git a/lib/test/lib/preprocessing/test_preprocess.py b/lib/test/lib/preprocessing/test_preprocess.py index 3bc37cc6..248b31b8 100644 --- a/lib/test/lib/preprocessing/test_preprocess.py +++ b/lib/test/lib/preprocessing/test_preprocess.py @@ -1,286 +1,286 @@ -import pytest -import numpy as np -from sequentia.preprocessing import ( - Preprocess, - trim_zeros, downsample, center, standardize, fft, filtrate, - _trim_zeros, _downsample, _center, _standardize, _fft, _filtrate -) -from ...support import assert_equal, assert_all_equal - -# Set seed for reproducible randomness -seed = 0 -np.random.seed(seed) -rng = np.random.RandomState(seed) - -# Sample data -X = rng.random((7, 2)) -Xs = [i * rng.random((3 * i, 2)) for i in range(1, 4)] - -# Zero-trimming preprocessor -trim = Preprocess() -trim.trim_zeros() - -# Centering preprocessor -cent = Preprocess() -cent.center() - -# Standardizing preprocessor -standard = Preprocess() -standard.standardize() - -# Discrete Fourier Transform preprocessor -fourier = Preprocess() -fourier.fft() - -# Downsampling preprocessor -down = Preprocess() -down_kwargs = {'n': 3, 'method': 'decimate'} -down.downsample(**down_kwargs) - -# Filtering preprocessor -filt = Preprocess() -filt_kwargs = {'n': 3, 'method': 'median'} -filt.filtrate(**filt_kwargs) - -# Combined preprocessor -combined = Preprocess() -combined.trim_zeros() -combined.center() -combined.standardize() -combined.filtrate(**filt_kwargs) -combined.downsample(**down_kwargs) -combined.fft() - -# ======================= # -# Preprocess.trim_zeros() # -# ======================= # - -def test_trim_zeros_adds_transform(): - """Applying a single zero-trimming transformation""" - assert len(trim._transforms) == 1 - assert trim._transforms[0] == (_trim_zeros, {}) - -def test_trim_zeros_single(): - """Applying zero-trimming to a single observation sequence""" - assert_equal(trim.transform(X), trim_zeros(X)) - -def test_trim_zeros_multiple(): - """Applying zero-trimming to multiple observation sequences""" - assert_all_equal(trim.transform(Xs), trim_zeros(Xs)) - -def test_trim_zeros_summary(capsys): - """Summary of a zero-trimming transformation""" - trim.summary() - assert capsys.readouterr().out == ( - 'Preprocessing summary:\n' - '======================\n' - '1. Zero-trimming\n' - '======================\n' - ) - -# =================== # -# Preprocess.center() # -# =================== # - -def test_center_adds_transform(): - """Applying a single centering transformation""" - assert len(cent._transforms) == 1 - assert cent._transforms[0] == (_center, {}) - -def test_center_single(): - """Applying centering to a single observation sequence""" - assert_equal(cent.transform(X), center(X)) - -def test_center_multiple(): - """Applying centering to multiple observation sequences""" - assert_all_equal(cent.transform(Xs), center(Xs)) - -def test_center_summary(capsys): - """Summary of a centering transformation""" - cent.summary() - assert capsys.readouterr().out == ( - 'Preprocessing summary:\n' - '======================\n' - '1. Centering\n' - '======================\n' - ) - -# ======================== # -# Preprocess.standardize() # -# ======================== # - -def test_standardize_adds_transform(): - """Applying a single standardizing transformation""" - assert len(standard._transforms) == 1 - assert standard._transforms[0] == (_standardize, {}) - -def test_standardize_single(): - """Applying standardization to a single observation sequence""" - assert_equal(standard.transform(X), standardize(X)) - -def test_standardize_multiple(): - """Applying standardization to multiple observation sequences""" - assert_all_equal(standard.transform(Xs), standardize(Xs)) - -def test_standardize_summary(capsys): - """Summary of a standardizing transformation""" - standard.summary() - assert capsys.readouterr().out == ( - 'Preprocessing summary:\n' - '======================\n' - '1. Standardization\n' - '======================\n' - ) - -# ================ # -# Preprocess.fft() # -# ================ # - -def test_fft_adds_transform(): - """Applying a single discrete fourier transformation""" - assert len(fourier._transforms) == 1 - assert fourier._transforms[0] == (_fft, {}) - -def test_fft_single(): - """Applying discrete fourier transformation to a single observation sequence""" - assert_equal(fourier.transform(X), fft(X)) - -def test_fft_multiple(): - """Applying discrete fourier transformation to multiple observation sequences""" - assert_all_equal(fourier.transform(Xs), fft(Xs)) - -def test_fft_summary(capsys): - """Summary of a discrete fourier transformation""" - fourier.summary() - assert capsys.readouterr().out == ( - ' Preprocessing summary: \n' - '=============================\n' - '1. Discrete Fourier Transform\n' - '=============================\n' - ) - -# ======================= # -# Preprocess.downsample() # -# ======================= # - -def test_downsample_adds_transform(): - """Applying a single downsampling transformation""" - assert len(down._transforms) == 1 - assert down._transforms[0] == (_downsample, down_kwargs) - -def test_downsample_single(): - """Applying downsampling to a single observation sequence""" - assert_equal(down.transform(X), downsample(X, **down_kwargs)) - -def test_downsample_multiple(): - """Applying downsampling to multiple observation sequences""" - assert_all_equal(down.transform(Xs), downsample(Xs, **down_kwargs)) - -def test_downsample_summary(capsys): - """Summary of a downsampling transformation""" - down.summary() - assert capsys.readouterr().out == ( - ' Preprocessing summary: \n' - '==========================================\n' - '1. Downsampling:\n' - ' Decimation with downsample factor (n=3)\n' - '==========================================\n' - ) - -# ===================== # -# Preprocess.filtrate() # -# ===================== # - -def test_filtrate_adds_transform(): - """Applying a single filtering transformation""" - assert len(filt._transforms) == 1 - assert filt._transforms[0] == (_filtrate, filt_kwargs) - -def test_filtrate_single(): - """Applying filtering to a single observation sequence""" - assert_equal(filt.transform(X), filtrate(X, **filt_kwargs)) - -def test_filtrate_multiple(): - """Applying filtering to multiple observation sequences""" - assert_all_equal(filt.transform(Xs), filtrate(Xs, **filt_kwargs)) - -def test_filtrate_summary(capsys): - """Summary of a filtering transformation""" - filt.summary() - assert capsys.readouterr().out == ( - ' Preprocessing summary: \n' - '=======================================\n' - '1. Filtering:\n' - ' Median filter with window size (n=3)\n' - '=======================================\n' - ) - -# ======================== # -# Combined transformations # -# ======================== # - -def test_combined_adds_transforms(): - """Applying multiple filtering transformations""" - assert len(combined._transforms) == 6 - assert combined._transforms == [ - (_trim_zeros, {}), - (_center, {}), - (_standardize, {}), - (_filtrate, filt_kwargs), - (_downsample, down_kwargs), - (_fft, {}) - ] - -def test_combined_single(): - """Applying combined transformations to a single observation sequence""" - X_pre = X - X_pre = trim_zeros(X_pre) - X_pre = center(X_pre) - X_pre = standardize(X_pre) - X_pre = filtrate(X_pre, **filt_kwargs) - X_pre = downsample(X_pre, **down_kwargs) - X_pre = fft(X_pre) - assert_equal(combined.transform(X), X_pre) - -def test_combined_multiple(): - """Applying combined transformations to multiple observation sequences""" - Xs_pre = Xs - Xs_pre = trim_zeros(Xs_pre) - Xs_pre = center(Xs_pre) - Xs_pre = standardize(Xs_pre) - Xs_pre = filtrate(Xs_pre, **filt_kwargs) - Xs_pre = downsample(Xs_pre, **down_kwargs) - Xs_pre = fft(Xs_pre) - assert_all_equal(combined.transform(Xs), Xs_pre) - -def test_combined_summary(capsys): - """Summary with combined transformations applied""" - combined.summary() - assert capsys.readouterr().out == ( - ' Preprocessing summary: \n' - '==========================================\n' - '1. Zero-trimming\n' - '------------------------------------------\n' - '2. Centering\n' - '------------------------------------------\n' - '3. Standardization\n' - '------------------------------------------\n' - '4. Filtering:\n' - ' Median filter with window size (n=3)\n' - '------------------------------------------\n' - '5. Downsampling:\n' - ' Decimation with downsample factor (n=3)\n' - '------------------------------------------\n' - '6. Discrete Fourier Transform\n' - '==========================================\n' - ) - -# ==================== # -# Preprocess.summary() # -# ==================== # - -def test_empty_summary(): - """Summary without any transformations applied""" - with pytest.raises(RuntimeError) as e: - Preprocess().summary() - assert str(e.value) == 'At least one preprocessing transformation is required' \ No newline at end of file +# import pytest +# import numpy as np +# from sequentia.preprocessing import ( +# Preprocess, +# trim_zeros, downsample, center, standardize, fft, filtrate, +# _trim_zeros, _downsample, _center, _standardize, _fft, _filtrate +# ) +# from ...support import assert_equal, assert_all_equal + +# # Set seed for reproducible randomness +# seed = 0 +# np.random.seed(seed) +# rng = np.random.RandomState(seed) + +# # Sample data +# X = rng.random((7, 2)) +# Xs = [i * rng.random((3 * i, 2)) for i in range(1, 4)] + +# # Zero-trimming preprocessor +# trim = Preprocess() +# trim.trim_zeros() + +# # Centering preprocessor +# cent = Preprocess() +# cent.center() + +# # Standardizing preprocessor +# standard = Preprocess() +# standard.standardize() + +# # Discrete Fourier Transform preprocessor +# fourier = Preprocess() +# fourier.fft() + +# # Downsampling preprocessor +# down = Preprocess() +# down_kwargs = {'n': 3, 'method': 'decimate'} +# down.downsample(**down_kwargs) + +# # Filtering preprocessor +# filt = Preprocess() +# filt_kwargs = {'n': 3, 'method': 'median'} +# filt.filtrate(**filt_kwargs) + +# # Combined preprocessor +# combined = Preprocess() +# combined.trim_zeros() +# combined.center() +# combined.standardize() +# combined.filtrate(**filt_kwargs) +# combined.downsample(**down_kwargs) +# combined.fft() + +# # ======================= # +# # Preprocess.trim_zeros() # +# # ======================= # + +# def test_trim_zeros_adds_transform(): +# """Applying a single zero-trimming transformation""" +# assert len(trim._transforms) == 1 +# assert trim._transforms[0] == (_trim_zeros, {}) + +# def test_trim_zeros_single(): +# """Applying zero-trimming to a single observation sequence""" +# assert_equal(trim.transform(X), trim_zeros(X)) + +# def test_trim_zeros_multiple(): +# """Applying zero-trimming to multiple observation sequences""" +# assert_all_equal(trim.transform(Xs), trim_zeros(Xs)) + +# def test_trim_zeros_summary(capsys): +# """Summary of a zero-trimming transformation""" +# trim.summary() +# assert capsys.readouterr().out == ( +# 'Preprocessing summary:\n' +# '======================\n' +# '1. Zero-trimming\n' +# '======================\n' +# ) + +# # =================== # +# # Preprocess.center() # +# # =================== # + +# def test_center_adds_transform(): +# """Applying a single centering transformation""" +# assert len(cent._transforms) == 1 +# assert cent._transforms[0] == (_center, {}) + +# def test_center_single(): +# """Applying centering to a single observation sequence""" +# assert_equal(cent.transform(X), center(X)) + +# def test_center_multiple(): +# """Applying centering to multiple observation sequences""" +# assert_all_equal(cent.transform(Xs), center(Xs)) + +# def test_center_summary(capsys): +# """Summary of a centering transformation""" +# cent.summary() +# assert capsys.readouterr().out == ( +# 'Preprocessing summary:\n' +# '======================\n' +# '1. Centering\n' +# '======================\n' +# ) + +# # ======================== # +# # Preprocess.standardize() # +# # ======================== # + +# def test_standardize_adds_transform(): +# """Applying a single standardizing transformation""" +# assert len(standard._transforms) == 1 +# assert standard._transforms[0] == (_standardize, {}) + +# def test_standardize_single(): +# """Applying standardization to a single observation sequence""" +# assert_equal(standard.transform(X), standardize(X)) + +# def test_standardize_multiple(): +# """Applying standardization to multiple observation sequences""" +# assert_all_equal(standard.transform(Xs), standardize(Xs)) + +# def test_standardize_summary(capsys): +# """Summary of a standardizing transformation""" +# standard.summary() +# assert capsys.readouterr().out == ( +# 'Preprocessing summary:\n' +# '======================\n' +# '1. Standardization\n' +# '======================\n' +# ) + +# # ================ # +# # Preprocess.fft() # +# # ================ # + +# def test_fft_adds_transform(): +# """Applying a single discrete fourier transformation""" +# assert len(fourier._transforms) == 1 +# assert fourier._transforms[0] == (_fft, {}) + +# def test_fft_single(): +# """Applying discrete fourier transformation to a single observation sequence""" +# assert_equal(fourier.transform(X), fft(X)) + +# def test_fft_multiple(): +# """Applying discrete fourier transformation to multiple observation sequences""" +# assert_all_equal(fourier.transform(Xs), fft(Xs)) + +# def test_fft_summary(capsys): +# """Summary of a discrete fourier transformation""" +# fourier.summary() +# assert capsys.readouterr().out == ( +# ' Preprocessing summary: \n' +# '=============================\n' +# '1. Discrete Fourier Transform\n' +# '=============================\n' +# ) + +# # ======================= # +# # Preprocess.downsample() # +# # ======================= # + +# def test_downsample_adds_transform(): +# """Applying a single downsampling transformation""" +# assert len(down._transforms) == 1 +# assert down._transforms[0] == (_downsample, down_kwargs) + +# def test_downsample_single(): +# """Applying downsampling to a single observation sequence""" +# assert_equal(down.transform(X), downsample(X, **down_kwargs)) + +# def test_downsample_multiple(): +# """Applying downsampling to multiple observation sequences""" +# assert_all_equal(down.transform(Xs), downsample(Xs, **down_kwargs)) + +# def test_downsample_summary(capsys): +# """Summary of a downsampling transformation""" +# down.summary() +# assert capsys.readouterr().out == ( +# ' Preprocessing summary: \n' +# '==========================================\n' +# '1. Downsampling:\n' +# ' Decimation with downsample factor (n=3)\n' +# '==========================================\n' +# ) + +# # ===================== # +# # Preprocess.filtrate() # +# # ===================== # + +# def test_filtrate_adds_transform(): +# """Applying a single filtering transformation""" +# assert len(filt._transforms) == 1 +# assert filt._transforms[0] == (_filtrate, filt_kwargs) + +# def test_filtrate_single(): +# """Applying filtering to a single observation sequence""" +# assert_equal(filt.transform(X), filtrate(X, **filt_kwargs)) + +# def test_filtrate_multiple(): +# """Applying filtering to multiple observation sequences""" +# assert_all_equal(filt.transform(Xs), filtrate(Xs, **filt_kwargs)) + +# def test_filtrate_summary(capsys): +# """Summary of a filtering transformation""" +# filt.summary() +# assert capsys.readouterr().out == ( +# ' Preprocessing summary: \n' +# '=======================================\n' +# '1. Filtering:\n' +# ' Median filter with window size (n=3)\n' +# '=======================================\n' +# ) + +# # ======================== # +# # Combined transformations # +# # ======================== # + +# def test_combined_adds_transforms(): +# """Applying multiple filtering transformations""" +# assert len(combined._transforms) == 6 +# assert combined._transforms == [ +# (_trim_zeros, {}), +# (_center, {}), +# (_standardize, {}), +# (_filtrate, filt_kwargs), +# (_downsample, down_kwargs), +# (_fft, {}) +# ] + +# def test_combined_single(): +# """Applying combined transformations to a single observation sequence""" +# X_pre = X +# X_pre = trim_zeros(X_pre) +# X_pre = center(X_pre) +# X_pre = standardize(X_pre) +# X_pre = filtrate(X_pre, **filt_kwargs) +# X_pre = downsample(X_pre, **down_kwargs) +# X_pre = fft(X_pre) +# assert_equal(combined.transform(X), X_pre) + +# def test_combined_multiple(): +# """Applying combined transformations to multiple observation sequences""" +# Xs_pre = Xs +# Xs_pre = trim_zeros(Xs_pre) +# Xs_pre = center(Xs_pre) +# Xs_pre = standardize(Xs_pre) +# Xs_pre = filtrate(Xs_pre, **filt_kwargs) +# Xs_pre = downsample(Xs_pre, **down_kwargs) +# Xs_pre = fft(Xs_pre) +# assert_all_equal(combined.transform(Xs), Xs_pre) + +# def test_combined_summary(capsys): +# """Summary with combined transformations applied""" +# combined.summary() +# assert capsys.readouterr().out == ( +# ' Preprocessing summary: \n' +# '==========================================\n' +# '1. Zero-trimming\n' +# '------------------------------------------\n' +# '2. Centering\n' +# '------------------------------------------\n' +# '3. Standardization\n' +# '------------------------------------------\n' +# '4. Filtering:\n' +# ' Median filter with window size (n=3)\n' +# '------------------------------------------\n' +# '5. Downsampling:\n' +# ' Decimation with downsample factor (n=3)\n' +# '------------------------------------------\n' +# '6. Discrete Fourier Transform\n' +# '==========================================\n' +# ) + +# # ==================== # +# # Preprocess.summary() # +# # ==================== # + +# def test_empty_summary(): +# """Summary without any transformations applied""" +# with pytest.raises(RuntimeError) as e: +# Preprocess().summary() +# assert str(e.value) == 'At least one preprocessing transformation is required' \ No newline at end of file From 59bb9b26f4faf803101139542167568f5da8448d Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Fri, 7 Feb 2020 13:22:25 +0000 Subject: [PATCH 02/20] [patch:docs] Update README.md (#76) --- README.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index d9626c76..0877f28f 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,9 @@ Despite these types of sequences sounding very specific, you probably observe so ## Features -Sequentia offers the use of **multivariate observation sequences with differing durations** in conjunction with the following algorithms and methods. +Sequentia offers the use of multivariate observation sequences with varying durations, in conjunction with the following algorithms and methods: -### Classication algorithms +### Classification algorithms - [x] Hidden Markov Models (via [Pomegranate](https://github.com/jmschrei/pomegranate) [[1]](#references)) - [x] Multivariate Gaussian Emissions @@ -59,20 +59,19 @@ Sequentia offers the use of **multivariate observation sequences with differing ### Preprocessing methods -- [x] Centering and standardization -- [x] Downsampling (decimation and averaging) -- [x] Filtering (mean and median) -- [x] Discrete Fourier Transform +- [x] Centering, standardization and min-max scaling +- [x] Decimation and mean downsampling +- [x] Mean and median filtering ### Parallelization - [x] Multi-processing for DTW k-NN predictions -> **Disclaimer**: The package currently remains largely untested and is still in its early pre-alpha stages – _use with caution_! +> **Disclaimer**: The package currently remains largely untested and is still in its early stages – _use with caution_! ## Installation -``` +```console pip install sequentia ``` @@ -82,7 +81,7 @@ Documentation for the package is available on [Read The Docs](https://sequentia. ## Tutorials and examples -For tutorials and examples on the usage of Sequentia, [look at the notebooks here](https://nbviewer.jupyter.org/github/eonu/sequentia/tree/master/notebooks/)! +For tutorials and examples on the usage of Sequentia, [look at the notebooks here](https://nbviewer.jupyter.org/github/eonu/sequentia/tree/master/notebooks/). ## References From 79bca60e40bd63a878540a98bf781cc693380905 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Fri, 7 Feb 2020 13:56:17 +0000 Subject: [PATCH 03/20] [patch:pkg] Clean up package imports (#77) --- lib/sequentia/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/sequentia/__init__.py b/lib/sequentia/__init__.py index e69de29b..e3d3871b 100644 --- a/lib/sequentia/__init__.py +++ b/lib/sequentia/__init__.py @@ -0,0 +1,2 @@ +from .classifiers import * +from .preprocessing import * \ No newline at end of file From 76ea05e609aeac30b5832595c875740924eeeddf Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Fri, 7 Feb 2020 14:06:10 +0000 Subject: [PATCH 04/20] =?UTF-8?q?[release]=200.7.0a1=20=F0=9F=8E=89=20(#78?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/conf.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index bc139c0f..fc8c831d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -24,7 +24,7 @@ author = 'Edwin Onuonga' # The full version, including alpha/beta/rc tags -release = '0.6.1' +release = '0.7.0a1' # -- General configuration --------------------------------------------------- diff --git a/setup.py b/setup.py index fd01be49..8956b789 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from __future__ import print_function from setuptools import setup, find_packages -VERSION = '0.6.1' +VERSION = '0.7.0a1' with open('README.md', 'r') as fh: long_description = fh.read() From 3ba706b62947fd908b668d832ac1647f05c69ece Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Mon, 11 May 2020 03:21:28 +0100 Subject: [PATCH 05/20] [patch:ci] Fix pomegranate to v0.12.0 (#79) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8956b789..a09111ab 100644 --- a/setup.py +++ b/setup.py @@ -41,7 +41,7 @@ python_requires='>=3.5,<3.8', install_requires = [ 'numpy>=1.17,<2', - 'pomegranate>=0.11,<1', + 'pomegranate==0.12.0', 'fastdtw>=0.3,<0.4', 'scipy>=1.3,<2', 'scikit-learn>=0.22,<1', From 79767eaf838378844cb8569a13dbf7f4ee779942 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Mon, 11 May 2020 04:32:20 +0100 Subject: [PATCH 06/20] [add:lib] Add (de)serialization support for all classifiers (#80) * Finish tests for HMM and HMMClassifier * Finish serialization documentation * Ensure no NaNs in tests * Ensure Nans in HMM.test_as_dict_with_nan * Ensure NaNs in HMM.test_as_dict_with_nan * Ensure NaNs in HMM.test_as_dict_with_nan * Remove HMM NaN serialization test --- lib/sequentia/classifiers/dtwknn/dtwknn.py | 74 ++++++- lib/sequentia/classifiers/hmm/hmm.py | 95 +++++++- .../classifiers/hmm/hmm_classifier.py | 76 ++++++- .../lib/classifiers/dtwknn/test_dtwknn.py | 75 ++++++- lib/test/lib/classifiers/hmm/test_hmm.py | 203 +++++++++++++++++- .../classifiers/hmm/test_hmm_classifier.py | 122 ++++++++++- setup.py | 3 +- 7 files changed, 630 insertions(+), 18 deletions(-) diff --git a/lib/sequentia/classifiers/dtwknn/dtwknn.py b/lib/sequentia/classifiers/dtwknn/dtwknn.py index 50cc64e9..8cc52305 100644 --- a/lib/sequentia/classifiers/dtwknn/dtwknn.py +++ b/lib/sequentia/classifiers/dtwknn/dtwknn.py @@ -2,6 +2,7 @@ import tqdm.auto import random import numpy as np +import h5py from joblib import Parallel, delayed from multiprocessing import cpu_count from fastdtw import fastdtw @@ -155,4 +156,75 @@ def evaluate(self, X, y, labels=None, verbose=True, n_jobs=1): predictions = self.predict(X, verbose=verbose, n_jobs=n_jobs) cm = confusion_matrix(y, predictions, labels=labels) - return np.sum(np.diag(cm)) / np.sum(cm), cm \ No newline at end of file + return np.sum(np.diag(cm)) / np.sum(cm), cm + + def save(self, path): + """Stores the :class:`DTWKNN` object into a `HDF5 `_ file. + + .. note: + As :math:`k`-NN is a non-parametric classification algorithms, saving the classifier simply saves + all of the training observation sequences and labels (along with the hyper-parameters). + + Parameters + ---------- + path: str + File path (with or without `.h5` extension) to store the HDF5-serialized :class:`DTWKNN` object. + """ + + try: + (self._X, self._y) + except AttributeError: + raise RuntimeError('The classifier needs to be fitted before it can be saved') + + with h5py.File(path, 'w') as f: + # Store hyper-parameters (k, radius) + params = f.create_group('params') + params.create_dataset('k', data=self._k) + params.create_dataset('radius', data=self._radius) + + # Store training data and labels (X, y) + data = f.create_group('data') + X = data.create_group('X') + for i, x in enumerate(self._X): + X.create_dataset(str(i), data=x) + data.create_dataset('y', data=np.string_(self._y)) + + @classmethod + def load(cls, path, encoding='utf-8', metric=euclidean): + """Deserializes a HDF5-serialized :class:`DTWKNN` object. + + Parameters + ---------- + path: str + File path of the serialized HDF5 data generated by the :meth:`save` method. + + encoding: str + The encoding used to represent training labels when decoding the HDF5 file. + + .. note:: + Supported string encodings in Python can be found `here `_. + + metric: callable + Distance metric for FastDTW. + + Returns + ------- + deserialized: :class:`DTWKNN` + The deserialized DTWKNN classifier object. + + See Also + -------- + save: Serializes a :class:`DTWKNN` into a HDF5 file. + """ + + with h5py.File(path, 'r') as f: + # Deserialize the model hyper-parameters + params = f['params'] + clf = cls(k=int(params['k'][()]), radius=int(params['radius'][()]), metric=metric) + + # Deserialize the training data and labels + X, y = f['data']['X'], f['data']['y'] + clf._X = [np.array(X[k]) for k in X.keys()] + clf._y = [label.decode(encoding) for label in y] + + return clf \ No newline at end of file diff --git a/lib/sequentia/classifiers/hmm/hmm.py b/lib/sequentia/classifiers/hmm/hmm.py index a5cc35e4..f2e6af50 100644 --- a/lib/sequentia/classifiers/hmm/hmm.py +++ b/lib/sequentia/classifiers/hmm/hmm.py @@ -1,3 +1,4 @@ +import json import numpy as np import pomegranate as pg from .topologies.ergodic import _ErgodicTopology @@ -174,4 +175,96 @@ def transitions(self): @transitions.setter def transitions(self, probabilities): self._topology.validate_transitions(probabilities) - self._transitions = probabilities \ No newline at end of file + self._transitions = probabilities + + def as_dict(self): + """Serializes the :class:`HMM` object into a `dict`, ready to be stored in JSON format. + + Returns + ------- + serialized: dict + JSON-ready serialization of the :class:`HMM` object. + """ + + try: + self._model + except AttributeError as e: + raise AttributeError('The model needs to be fitted before it can be exported to a dict') from e + + model = self._model.to_json() + + if 'NaN' in model: + raise ValueError('Encountered NaN value(s) in HMM parameters') + else: + return { + 'label': self._label, + 'n_states': self._n_states, + 'topology': 'ergodic' if isinstance(self._topology, _ErgodicTopology) else 'left-right', + 'model': { + 'initial': self._initial.tolist(), + 'transitions': self._transitions.tolist(), + 'n_seqs': self._n_seqs, + 'n_features': self._n_features, + 'hmm': json.loads(model) + } + } + + def save(self, path): + """Converts the :class:`HMM` object into a `dict` and stores it in a JSON file. + + Parameters + ---------- + path: str + File path (with or without `.json` extension) to store the JSON-serialized :class:`HMM` object. + + See Also + -------- + as_dict: Generates the `dict` that is stored in the JSON file. + """ + + data = self.as_dict() + with open(path, 'w') as f: + json.dump(data, f, indent=4) + + @classmethod + def load(cls, data, random_state=None): + """Deserializes either a `dict` or JSON serialized :class:`HMM` object. + + Parameters + ---------- + data: str or dict + - File path of the serialized JSON data generated by the :meth:`save` method. + - `dict` representation of the :class:`HMM`, generated by the :meth:`as_dict` method. + + random_state: numpy.random.RandomState, int, optional + A random state object or seed for reproducible randomness. + + Returns + ------- + deserialized: :class:`HMM` + The deserialized HMM object. + + See Also + -------- + save: Serializes a :class:`HMM` into a JSON file. + as_dict: Generates a `dict` representation of the :class:`HMM`. + """ + + # Load the serialized HMM data + if isinstance(data, dict): + pass + elif isinstance(data, str): + with open(data, 'r') as f: + data = json.load(f) + else: + pass + + # Deserialize the data into a HMM object + hmm = cls(data['label'], data['n_states'], data['topology'], random_state=random_state) + hmm._initial = np.array(data['model']['initial']) + hmm._transitions = np.array(data['model']['transitions']) + hmm._n_seqs = data['model']['n_seqs'] + hmm._n_features = data['model']['n_features'] + hmm._model = pg.HiddenMarkovModel.from_json(json.dumps(data['model']['hmm'])) + + return hmm \ No newline at end of file diff --git a/lib/sequentia/classifiers/hmm/hmm_classifier.py b/lib/sequentia/classifiers/hmm/hmm_classifier.py index 15a9fa88..601e6ebd 100644 --- a/lib/sequentia/classifiers/hmm/hmm_classifier.py +++ b/lib/sequentia/classifiers/hmm/hmm_classifier.py @@ -1,3 +1,4 @@ +import json import numpy as np from .hmm import HMM from sklearn.metrics import confusion_matrix @@ -121,4 +122,77 @@ def evaluate(self, X, y, prior=True, labels=None): predictions = self.predict(X, prior, return_scores=False) cm = confusion_matrix(y, predictions, labels=labels) - return np.sum(np.diag(cm)) / np.sum(cm), cm \ No newline at end of file + return np.sum(np.diag(cm)) / np.sum(cm), cm + + def as_dict(self): + """Serializes the :class:`HMMClassifier` object into a `dict`, ready to be stored in JSON format. + + .. note:: + Serializing a :class:`HMMClassifier` implicitly serializes the internal :class:`HMM` objects + by calling :meth:`HMM.as_dict` and storing all of the model data in a single `dict`. + + Returns + ------- + serialized: dict + JSON-ready serialization of the :class:`HMMClassifier` object. + + See Also + -------- + HMM.as_dict: The serialization function used for individual :class:`HMM` objects. + """ + + try: + self._models + except AttributeError as e: + raise AttributeError('The classifier needs to be fitted before it can be exported to a dict') from e + + return {'models': [model.as_dict() for model in self._models]} + + def save(self, path): + """Converts the :class:`HMMClassifier` object into a `dict` and stores it in a JSON file. + + Parameters + ---------- + path: str + File path (with or without `.json` extension) to store the JSON-serialized :class:`HMMClassifier` object. + + See Also + -------- + as_dict: Generates the `dict` that is stored in the JSON file. + """ + + data = self.as_dict() + with open(path, 'w') as f: + json.dump(data, f, indent=4) + + @classmethod + def load(cls, path, random_state=None): + """Deserializes either a `dict` or JSON serialized :class:`HMMClassifier` object. + + Parameters + ---------- + path: str + File path of the serialized JSON data generated by the :meth:`save` method. + + random_state: numpy.random.RandomState, int, optional + A random state object or seed for reproducible randomness. + + Returns + ------- + deserialized: :class:`HMMClassifier` + The deserialized HMM classifier object. + + See Also + -------- + save: Serializes a :class:`HMMClassifier` into a JSON file. + as_dict: Generates a `dict` representation of the :class:`HMMClassifier`. + """ + + # Load the serialized HMM classifier as JSON + with open(path, 'r') as f: + data = json.load(f) + + clf = cls() + clf._models = [HMM.load(model, random_state=random_state) for model in data['models']] + + return clf \ No newline at end of file diff --git a/lib/test/lib/classifiers/dtwknn/test_dtwknn.py b/lib/test/lib/classifiers/dtwknn/test_dtwknn.py index dab83329..f833e5f8 100644 --- a/lib/test/lib/classifiers/dtwknn/test_dtwknn.py +++ b/lib/test/lib/classifiers/dtwknn/test_dtwknn.py @@ -1,11 +1,13 @@ import pytest import warnings +import os +import h5py import numpy as np from copy import deepcopy with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) from sequentia.classifiers import DTWKNN -from ....support import assert_equal, assert_not_equal +from ....support import assert_equal, assert_all_equal, assert_not_equal # Set seed for reproducible randomness seed = 0 @@ -213,4 +215,73 @@ def test_evaluate_with_no_labels_k3_r10_no_verbose(capsys): acc, cm = clfs[2].evaluate(X, y, labels=None, verbose=False) assert 'Classifying examples' not in capsys.readouterr().err assert isinstance(acc, float) - assert isinstance(cm, np.ndarray) \ No newline at end of file + assert isinstance(cm, np.ndarray) + +# ============= # +# DTWKNN.save() # +# ============= # + +def test_save_directory(): + """Save a DTWKNN classifier into a directory""" + with pytest.raises(OSError) as e: + clfs[2].save('.') + +def test_save_no_extension(): + """Save a DTWKNN classifier into a file without an extension""" + try: + clfs[2].save('test') + assert os.path.isfile('test') + finally: + os.remove('test') + +def test_save_with_extension(): + """Save a DTWKNN classifier into a file with a .h5 extension""" + try: + clfs[2].save('test.h5') + assert os.path.isfile('test.h5') + finally: + os.remove('test.h5') + +# ============= # +# DTWKNN.load() # +# ============= # + +def test_load_invalid_path(): + """Load a DTWKNN classifier from a directory""" + with pytest.raises(OSError) as e: + DTWKNN.load('.') + +def test_load_inexistent_path(): + """Load a DTWKNN classifier from an inexistent path""" + with pytest.raises(OSError) as e: + DTWKNN.load('test') + +def test_load_invalid_format(): + """Load a DTWKNN classifier from an illegally formatted file""" + try: + with open('test', 'w') as f: + f.write('illegal') + with pytest.raises(OSError) as e: + DTWKNN.load('test') + finally: + os.remove('test') + +def test_load_path(): + """Load a DTWKNN classifier from a valid HDF5 file""" + try: + clfs[2].save('test') + clf = DTWKNN.load('test') + + assert isinstance(clf, DTWKNN) + assert clf._k == 3 + assert clf._radius == 10 + assert isinstance(clf._X, list) + assert len(clf._X) == len(X) + assert isinstance(clf._X[0], np.ndarray) + assert_all_equal(clf._X, X) + assert isinstance(clf._y, list) + assert len(clf._y) == len(y) + assert isinstance(clf._y[0], str) + assert all(y1 == y2 for y1, y2 in zip(clf._y, y)) + finally: + os.remove('test') \ No newline at end of file diff --git a/lib/test/lib/classifiers/hmm/test_hmm.py b/lib/test/lib/classifiers/hmm/test_hmm.py index cbabd387..ab3da229 100644 --- a/lib/test/lib/classifiers/hmm/test_hmm.py +++ b/lib/test/lib/classifiers/hmm/test_hmm.py @@ -1,5 +1,7 @@ import pytest import warnings +import os +import json import numpy as np from copy import deepcopy with warnings.catch_warnings(): @@ -21,9 +23,9 @@ hmm_lr = HMM(label='c1', n_states=5, topology='left-right', random_state=rng) hmm_e = HMM(label='c1', n_states=5, topology='ergodic', random_state=rng) -# ========================= # -# HMM.set_uniform_initial() # -# ========================= # +# ================================================== # +# HMM.set_uniform_initial() + HMM.initial (property) # +# ================================================== # def test_left_right_uniform_initial(): """Uniform initial state distribution for a left-right HMM""" @@ -41,9 +43,9 @@ def test_ergodic_uniform_initial(): 0.2, 0.2, 0.2, 0.2, 0.2 ])) -# ======================== # -# HMM.set_random_initial() # -# ======================== # +# ================================================= # +# HMM.set_random_initial() + HMM.initial (property) # +# ================================================= # def test_left_right_random_initial(): """Random initial state distribution for a left-right HMM""" @@ -61,9 +63,9 @@ def test_ergodic_random_initial(): 0.35029635, 0.13344569, 0.02784745, 0.33782453, 0.15058597 ])) -# ====================================================== # -# HMM.set_uniform_transitions() + HMM.initial (property) # -# ====================================================== # +# ========================================================== # +# HMM.set_uniform_transitions() + HMM.transitions (property) # +# ========================================================== # def test_left_right_uniform_transitions(): """Uniform transition matrix for a left-right HMM""" @@ -387,4 +389,185 @@ def test_ergodic_transitions_ergodic(): topology = _ErgodicTopology(n_states=5, random_state=rng) transitions = topology.random_transitions() hmm.transitions = transitions - assert_equal(hmm.transitions, transitions) \ No newline at end of file + assert_equal(hmm.transitions, transitions) + +# ============= # +# HMM.as_dict() # +# ============= # + +def test_as_dict_unfitted(): + """Export an unfitted HMM to dict""" + hmm = deepcopy(hmm_e) + with pytest.raises(AttributeError) as e: + hmm.as_dict() + assert str(e.value) == 'The model needs to be fitted before it can be exported to a dict' + +def test_as_dict_fitted(): + """Export a fitted HMM to dict""" + hmm = deepcopy(hmm_e) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + d = hmm.as_dict() + + assert d['label'] == 'c1' + assert d['n_states'] == 5 + assert d['topology'] == 'ergodic' + assert_equal(d['model']['initial'], np.array([ + 0.2, 0.2, 0.2, 0.2, 0.2 + ])) + assert_equal(d['model']['transitions'], np.array([ + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2] + ])) + assert d['model']['n_seqs'] == 3 + assert d['model']['n_features'] == 3 + assert isinstance(d['model']['hmm'], dict) + +# ========== # +# HMM.save() # +# ========== # + +def test_save_directory(): + """Save a HMM into a directory""" + hmm = deepcopy(hmm_e) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + with pytest.raises(IsADirectoryError) as e: + hmm.save('.') + assert str(e.value) == "[Errno 21] Is a directory: '.'" + +def test_save_no_extension(): + """Save a HMM into a file without an extension""" + try: + hmm = deepcopy(hmm_e) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + hmm.save('test') + assert os.path.isfile('test') + finally: + os.remove('test') + +def test_save_with_extension(): + """Save a HMM into a file with a .json extension""" + try: + hmm = deepcopy(hmm_e) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + hmm.save('test.json') + assert os.path.isfile('test.json') + finally: + os.remove('test.json') + +# ========== # +# HMM.load() # +# ========== # + +def test_load_invalid_dict(): + """Load a HMM from an invalid dict""" + with pytest.raises(KeyError) as e: + HMM.load({}) + +def test_load_dict(): + """Load a HMM from a valid dict""" + hmm = deepcopy(hmm_e) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + hmm = HMM.load(hmm.as_dict()) + + assert isinstance(hmm, HMM) + assert hmm._label == 'c1' + assert hmm._n_states == 5 + assert isinstance(hmm._topology, _ErgodicTopology) + assert_equal(hmm._initial, np.array([ + 0.2, 0.2, 0.2, 0.2, 0.2 + ])) + assert_equal(hmm._transitions, np.array([ + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2] + ])) + assert hmm._n_seqs == 3 + assert hmm._n_features == 3 + assert isinstance(hmm._model, pg.HiddenMarkovModel) + +def test_load_invalid_path(): + """Load a HMM from a directory""" + with pytest.raises(IsADirectoryError) as e: + HMM.load('.') + +def test_load_inexistent_path(): + """Load a HMM from an inexistent path""" + with pytest.raises(FileNotFoundError) as e: + HMM.load('test') + +def test_load_invalid_format(): + """Load a HMM from an illegally formatted file""" + try: + with open('test', 'w') as f: + f.write('illegal') + with pytest.raises(json.decoder.JSONDecodeError) as e: + HMM.load('test') + finally: + os.remove('test') + +def test_load_invalid_json(): + """Load a HMM from an invalid JSON file""" + try: + with open('test', 'w') as f: + f.write("{}") + with pytest.raises(KeyError) as e: + HMM.load('test') + finally: + os.remove('test') + +def test_load_path(): + """Load a HMM from a valid JSON file""" + try: + hmm = deepcopy(hmm_e) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + hmm.save('test') + hmm = HMM.load('test') + + assert isinstance(hmm, HMM) + assert hmm._label == 'c1' + assert hmm._n_states == 5 + assert isinstance(hmm._topology, _ErgodicTopology) + assert_equal(hmm._initial, np.array([ + 0.2, 0.2, 0.2, 0.2, 0.2 + ])) + assert_equal(hmm._transitions, np.array([ + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2], + [0.2, 0.2, 0.2, 0.2, 0.2] + ])) + assert hmm._n_seqs == 3 + assert hmm._n_features == 3 + assert isinstance(hmm._model, pg.HiddenMarkovModel) + finally: + os.remove('test') \ No newline at end of file diff --git a/lib/test/lib/classifiers/hmm/test_hmm_classifier.py b/lib/test/lib/classifiers/hmm/test_hmm_classifier.py index ac5623eb..00284cc4 100644 --- a/lib/test/lib/classifiers/hmm/test_hmm_classifier.py +++ b/lib/test/lib/classifiers/hmm/test_hmm_classifier.py @@ -1,8 +1,13 @@ import pytest import warnings +import os +import json import numpy as np from copy import deepcopy -from sequentia.classifiers import HMM, HMMClassifier +with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + import pomegranate as pg +from sequentia.classifiers import HMM, HMMClassifier, _ErgodicTopology from ....support import assert_equal, assert_not_equal # Set seed for reproducible randomness @@ -34,6 +39,14 @@ hmm_clf = HMMClassifier() hmm_clf.fit(hmm_list) +# Fit a classifier (with no NaN values) +hmm_clf_no_nan = HMMClassifier() +hmm = HMM(label='c1', n_states=5, topology='ergodic', random_state=rng) +hmm.set_uniform_initial() +hmm.set_uniform_transitions() +hmm.fit([rng.random((10 * i, 3)) for i in range(1, 4)]) +hmm_clf_no_nan.fit([hmm]) + # =================== # # HMMClassifier.fit() # # =================== # @@ -191,4 +204,109 @@ def test_evaluate_no_prior_no_labels(): """Evaluate with no prior and no confusion matrix labels""" acc, cm = hmm_clf.evaluate(X, Y, prior=False, labels=None) assert isinstance(acc, float) - assert isinstance(cm, np.ndarray) \ No newline at end of file + assert isinstance(cm, np.ndarray) + +# ======================= # +# HMMClassifier.as_dict() # +# ======================= # + +def test_as_dict_unfitted(): + """Export an unfitted HMM classifier to dict""" + with pytest.raises(AttributeError) as e: + HMMClassifier().as_dict() + assert str(e.value) == 'The classifier needs to be fitted before it can be exported to a dict' + +def test_as_dict_fitted(): + """Export a fitted HMM classifier to dict""" + d = hmm_clf_no_nan.as_dict() + + assert isinstance(d['models'], list) + assert len(d['models']) == 1 + assert d['models'][0]['label'] == 'c1' + assert d['models'][0]['n_states'] == 5 + assert d['models'][0]['topology'] == 'ergodic' + assert np.array(d['models'][0]['model']['initial']).shape == (5,) + assert np.array(d['models'][0]['model']['transitions']).shape == (5, 5) + assert d['models'][0]['model']['n_seqs'] == 3 + assert d['models'][0]['model']['n_features'] == 3 + assert isinstance(d['models'][0]['model']['hmm'], dict) + +# ==================== # +# HMMClassifier.save() # +# ==================== # + +def test_save_directory(): + """Save a HMM classifier into a directory""" + with pytest.raises(IsADirectoryError) as e: + hmm_clf_no_nan.save('.') + assert str(e.value) == "[Errno 21] Is a directory: '.'" + +def test_save_no_extension(): + """Save a HMM classifier into a file without an extension""" + try: + hmm_clf_no_nan.save('test') + assert os.path.isfile('test') + finally: + os.remove('test') + +def test_save_with_extension(): + """Save a HMM classifier into a file with a .json extension""" + try: + hmm_clf_no_nan.save('test.json') + assert os.path.isfile('test.json') + finally: + os.remove('test.json') + +# ==================== # +# HMMClassifier.load() # +# ==================== # + +def test_load_invalid_path(): + """Load a HMM classifier from a directory""" + with pytest.raises(IsADirectoryError) as e: + HMMClassifier.load('.') + +def test_load_inexistent_path(): + """Load a HMM classifier from an inexistent path""" + with pytest.raises(FileNotFoundError) as e: + HMMClassifier.load('test') + +def test_load_invalid_format(): + """Load a HMM classifier from an illegally formatted file""" + try: + with open('test', 'w') as f: + f.write('illegal') + with pytest.raises(json.decoder.JSONDecodeError) as e: + HMMClassifier.load('test') + finally: + os.remove('test') + +def test_load_invalid_json(): + """Load a HMM classifier from an invalid JSON file""" + try: + with open('test', 'w') as f: + f.write("{}") + with pytest.raises(KeyError) as e: + HMMClassifier.load('test') + finally: + os.remove('test') + +def test_load_path(): + """Load a HMM classifier from a valid JSON file""" + try: + hmm_clf_no_nan.save('test') + h = HMMClassifier.load('test') + + assert isinstance(h, HMMClassifier) + assert isinstance(h._models, list) + assert len(h._models) == 1 + assert h._models[0]._label == 'c1' + assert h._models[0]._n_states == 5 + assert isinstance(h._models[0]._topology, _ErgodicTopology) + assert h._models[0]._initial.shape == (5,) + assert h._models[0]._transitions.shape == (5, 5) + assert h._models[0]._n_seqs == 3 + assert h._models[0]._n_features == 3 + assert isinstance(h._models[0]._model, pg.HiddenMarkovModel) + finally: + os.remove('test') \ No newline at end of file diff --git a/setup.py b/setup.py index a09111ab..75cc7b36 100644 --- a/setup.py +++ b/setup.py @@ -46,6 +46,7 @@ 'scipy>=1.3,<2', 'scikit-learn>=0.22,<1', 'tqdm>=4.36,<5', - 'joblib>=0.14,<1' + 'joblib>=0.14,<1', + 'h5py>=2.10,<2.11' ] ) \ No newline at end of file From 424e9a6b5f3f35addfbd50191e3a5b12aa1e91e3 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Thu, 14 May 2020 21:14:34 +0100 Subject: [PATCH 07/20] [patch:docs] Finish preprocessing documentation and tests (#81) --- .gitignore | 3 +- .../examples/preprocessing/center.py | 8 - .../examples/preprocessing/downsample.py | 8 - docs/_includes/examples/preprocessing/fft.py | 8 - .../examples/preprocessing/filtrate.py | 8 - .../examples/preprocessing/preprocess.py | 20 - .../examples/preprocessing/standardize.py | 8 - .../examples/preprocessing/trim_zeros.py | 10 - docs/index.rst | 6 +- docs/sections/preprocessing/center.rst | 34 +- docs/sections/preprocessing/downsample.rst | 16 +- docs/sections/preprocessing/equalize.rst | 10 + docs/sections/preprocessing/fft.rst | 26 - .../{filtrate.rst => filter.rst} | 20 +- docs/sections/preprocessing/introduction.rst | 21 + docs/sections/preprocessing/min_max_scale.rst | 10 + docs/sections/preprocessing/preprocessing.rst | 9 +- docs/sections/preprocessing/standardize.rst | 19 +- docs/sections/preprocessing/trim_zeros.rst | 22 +- lib/sequentia/preprocessing/preprocess.py | 37 +- lib/sequentia/preprocessing/transforms.py | 208 ++++- lib/test/lib/preprocessing/test_methods.py | 525 ----------- lib/test/lib/preprocessing/test_preprocess.py | 568 ++++++------ lib/test/lib/preprocessing/test_transforms.py | 869 ++++++++++++++++++ notebooks/2 - Preprocessing (Tutorial).ipynb | 327 ++----- .../Pen-Tip Trajectories (Example).ipynb | 71 +- 26 files changed, 1570 insertions(+), 1301 deletions(-) delete mode 100644 docs/_includes/examples/preprocessing/center.py delete mode 100644 docs/_includes/examples/preprocessing/downsample.py delete mode 100644 docs/_includes/examples/preprocessing/fft.py delete mode 100644 docs/_includes/examples/preprocessing/filtrate.py delete mode 100644 docs/_includes/examples/preprocessing/preprocess.py delete mode 100644 docs/_includes/examples/preprocessing/standardize.py delete mode 100644 docs/_includes/examples/preprocessing/trim_zeros.py create mode 100644 docs/sections/preprocessing/equalize.rst delete mode 100644 docs/sections/preprocessing/fft.rst rename docs/sections/preprocessing/{filtrate.rst => filter.rst} (64%) create mode 100644 docs/sections/preprocessing/introduction.rst create mode 100644 docs/sections/preprocessing/min_max_scale.rst delete mode 100644 lib/test/lib/preprocessing/test_methods.py create mode 100644 lib/test/lib/preprocessing/test_transforms.py diff --git a/.gitignore b/.gitignore index abce4b0d..dfd0255a 100644 --- a/.gitignore +++ b/.gitignore @@ -85,4 +85,5 @@ venv.bak/ # Spyder project settings .spyderproject -.spyproject \ No newline at end of file +.spyproject +.vscode \ No newline at end of file diff --git a/docs/_includes/examples/preprocessing/center.py b/docs/_includes/examples/preprocessing/center.py deleted file mode 100644 index 4f50869f..00000000 --- a/docs/_includes/examples/preprocessing/center.py +++ /dev/null @@ -1,8 +0,0 @@ -import numpy as np -from sequentia.preprocessing import center - -# Create some sample data -X = [np.random.random((10 * i, 3)) for i in range(1, 4)] - -# Center the data -X = center(X) \ No newline at end of file diff --git a/docs/_includes/examples/preprocessing/downsample.py b/docs/_includes/examples/preprocessing/downsample.py deleted file mode 100644 index 87ee97cf..00000000 --- a/docs/_includes/examples/preprocessing/downsample.py +++ /dev/null @@ -1,8 +0,0 @@ -import numpy as np -from sequentia.preprocessing import downsample - -# Create some sample data -X = [np.random.random((10 * i, 3)) for i in range(1, 4)] - -# Downsample the data with downsample factor 5 and decimation -X = downsample(X, n=5, method='decimate') \ No newline at end of file diff --git a/docs/_includes/examples/preprocessing/fft.py b/docs/_includes/examples/preprocessing/fft.py deleted file mode 100644 index b31b9180..00000000 --- a/docs/_includes/examples/preprocessing/fft.py +++ /dev/null @@ -1,8 +0,0 @@ -import numpy as np -from sequentia.preprocessing import fft - -# Create some sample data -X = [np.random.random((10 * i, 3)) for i in range(1, 4)] - -# Transform the data -X = fft(X) \ No newline at end of file diff --git a/docs/_includes/examples/preprocessing/filtrate.py b/docs/_includes/examples/preprocessing/filtrate.py deleted file mode 100644 index 58330a5d..00000000 --- a/docs/_includes/examples/preprocessing/filtrate.py +++ /dev/null @@ -1,8 +0,0 @@ -import numpy as np -from sequentia.preprocessing import filtrate - -# Create some sample data -X = [np.random.random((10 * i, 3)) for i in range(1, 4)] - -# Filter the data with window size 5 and median filtering -X = filtrate(X, n=5, method='median') \ No newline at end of file diff --git a/docs/_includes/examples/preprocessing/preprocess.py b/docs/_includes/examples/preprocessing/preprocess.py deleted file mode 100644 index b0db131d..00000000 --- a/docs/_includes/examples/preprocessing/preprocess.py +++ /dev/null @@ -1,20 +0,0 @@ -import numpy as np -from sequentia.preprocessing import Preprocess - -# Create some sample data -X = [np.random.random((20 * i, 3)) for i in range(1, 4)] - -# Create the Preprocess object -pre = Preprocess() -pre.trim_zeros() -pre.center() -pre.standardize() -pre.filtrate(n=5, method='median') -pre.downsample(n=5, method='decimate') -pre.fft() - -# View a summary of the preprocessing steps -pre.summary() - -# Transform the data applying transformations in order -X = pre.transform(X) \ No newline at end of file diff --git a/docs/_includes/examples/preprocessing/standardize.py b/docs/_includes/examples/preprocessing/standardize.py deleted file mode 100644 index 28fcc900..00000000 --- a/docs/_includes/examples/preprocessing/standardize.py +++ /dev/null @@ -1,8 +0,0 @@ -import numpy as np -from sequentia.preprocessing import standardize - -# Create some sample data -X = [np.random.random((10 * i, 3)) for i in range(1, 4)] - -# Standardize the data -X = standardize(X) \ No newline at end of file diff --git a/docs/_includes/examples/preprocessing/trim_zeros.py b/docs/_includes/examples/preprocessing/trim_zeros.py deleted file mode 100644 index 1823b4b7..00000000 --- a/docs/_includes/examples/preprocessing/trim_zeros.py +++ /dev/null @@ -1,10 +0,0 @@ -import numpy as np -from sequentia.preprocessing import trim_zeros - -# Create some sample data -z = np.zeros((4, 3)) -x = lambda i: np.vstack((z, np.random.random((10 * i, 3)), z)) -X = [x(i) for i in range(1, 4)] - -# Zero-trim the data -X = trim_zeros(X) \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 5ed5736a..05a91265 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -45,12 +45,14 @@ Sequentia offers some appropriate classification algorithms for these kinds of t :maxdepth: 1 :caption: Preprocessing Methods + sections/preprocessing/introduction.rst + sections/preprocessing/equalize.rst sections/preprocessing/trim_zeros.rst + sections/preprocessing/min_max_scale.rst sections/preprocessing/center.rst sections/preprocessing/standardize.rst sections/preprocessing/downsample.rst - sections/preprocessing/filtrate.rst - sections/preprocessing/fft.rst + sections/preprocessing/filter.rst sections/preprocessing/preprocessing.rst Documentation Search and Index diff --git a/docs/sections/preprocessing/center.rst b/docs/sections/preprocessing/center.rst index ac42285a..3b7bc7b2 100644 --- a/docs/sections/preprocessing/center.rst +++ b/docs/sections/preprocessing/center.rst @@ -1,38 +1,10 @@ .. _center: -Centering (``center``) +Centering (``Center``) ====================== -Centers an observation sequence about the mean of its observations – that is, given: - -.. math:: - - O=\begin{pmatrix} - o_1^{(1)} & o_2^{(1)} & \cdots & o_D^{(1)} \\ - o_1^{(2)} & o_2^{(2)} & \cdots & o_D^{(2)} \\ - \vdots & \vdots & \ddots & \vdots \\ - o_1^{(T)} & o_2^{(T)} & \cdots & o_D^{(T)} - \end{pmatrix} - \qquad - \boldsymbol{\mu}=\begin{pmatrix} - \overline{o_1} & \overline{o_2} & \cdots & \overline{o_D} - \end{pmatrix} - -Where :math:`\overline{o_d}` represents the mean of the :math:`d^\text{th}` feature of :math:`O`. - -We subtract :math:`\boldsymbol{\mu}` from each observation, or row in :math:`O`. This centers the observations. - -For further information, please see the `preprocessing tutorial notebook `_. - -Example -------- - -.. literalinclude:: ../../_includes/examples/preprocessing/center.py - :language: python - :linenos: - API reference ------------- -.. automodule:: sequentia.preprocessing -.. autofunction:: center \ No newline at end of file +.. autoclass:: sequentia.preprocessing.Center + :members: fit, fit_transform, transform, __call__ \ No newline at end of file diff --git a/docs/sections/preprocessing/downsample.rst b/docs/sections/preprocessing/downsample.rst index 03d79e01..b72fdd17 100644 --- a/docs/sections/preprocessing/downsample.rst +++ b/docs/sections/preprocessing/downsample.rst @@ -1,6 +1,6 @@ .. _downsample: -Downsampling (``downsample``) +Downsampling (``Downsample``) ============================= Downsampling reduces the number of frames in an observation sequence according @@ -8,18 +8,8 @@ to a specified downsample factor and one of two methods: **averaging** and **dec This is an especially helpful preprocessing method for speeding up classification times. -For further information, please see the `preprocessing tutorial notebook `_. - -Example -------- - -.. literalinclude:: ../../_includes/examples/preprocessing/downsample.py - :language: python - :linenos: - API reference ------------- -.. automodule:: sequentia.preprocessing - :noindex: -.. autofunction:: downsample \ No newline at end of file +.. autoclass:: sequentia.preprocessing.Downsample + :members: fit, fit_transform, transform, __call__ \ No newline at end of file diff --git a/docs/sections/preprocessing/equalize.rst b/docs/sections/preprocessing/equalize.rst new file mode 100644 index 00000000..b67c2e54 --- /dev/null +++ b/docs/sections/preprocessing/equalize.rst @@ -0,0 +1,10 @@ +.. _equalize: + +Length Equalizing (``Equalize``) +================================ + +API reference +------------- + +.. autoclass:: sequentia.preprocessing.Equalize + :members: fit, fit_transform, transform, __call__ \ No newline at end of file diff --git a/docs/sections/preprocessing/fft.rst b/docs/sections/preprocessing/fft.rst deleted file mode 100644 index 65656348..00000000 --- a/docs/sections/preprocessing/fft.rst +++ /dev/null @@ -1,26 +0,0 @@ -.. _fft: - -Discrete Fourier Transform (``fft``) -==================================== - -The Discrete Fourier Transform (DFT) converts the observation sequence into a real-valued, -same-length sequence of equally-spaced samples of the -`discrete-time Fourier transform `_. - -The popular `Fast Fourier Transform `_ (FFT) implementation is used to efficiently compute the DFT. - -For further information, please see the `preprocessing tutorial notebook `_. - -Example -------- - -.. literalinclude:: ../../_includes/examples/preprocessing/fft.py - :language: python - :linenos: - -API reference -------------- - -.. automodule:: sequentia.preprocessing - :noindex: -.. autofunction:: fft \ No newline at end of file diff --git a/docs/sections/preprocessing/filtrate.rst b/docs/sections/preprocessing/filter.rst similarity index 64% rename from docs/sections/preprocessing/filtrate.rst rename to docs/sections/preprocessing/filter.rst index 4ccfc113..dc9c6f4b 100644 --- a/docs/sections/preprocessing/filtrate.rst +++ b/docs/sections/preprocessing/filter.rst @@ -1,7 +1,7 @@ -.. _filtrate: +.. _filter: -Filtering (``filtrate``) -============================= +Filtering (``Filter``) +====================== Filtering removes or reduces some unwanted components (such as noise) from an observation sequence according to some window size and one of two methods: **median** and **mean** filtering. @@ -13,18 +13,8 @@ with either the mean or median of the window of observations of size :math:`n` c - For median filtering: :math:`\mathbf{o}^{(t)\prime}=\mathrm{med}\underbrace{\left[\ldots, \mathbf{o}^{(t-1)}, \mathbf{o}^{(t)}, \mathbf{o}^{(t+1)}, \ldots\right]}_n` - For mean filtering: :math:`\mathbf{o}^{(t)\prime}=\mathrm{mean}\underbrace{\left[\ldots, \mathbf{o}^{(t-1)}, \mathbf{o}^{(t)}, \mathbf{o}^{(t+1)}, \ldots\right]}_n` -For further information, please see the `preprocessing tutorial notebook `_. - -Example -------- - -.. literalinclude:: ../../_includes/examples/preprocessing/filtrate.py - :language: python - :linenos: - API reference ------------- -.. automodule:: sequentia.preprocessing - :noindex: -.. autofunction:: filtrate \ No newline at end of file +.. autoclass:: sequentia.preprocessing.Filter + :members: fit, fit_transform, transform, __call__ \ No newline at end of file diff --git a/docs/sections/preprocessing/introduction.rst b/docs/sections/preprocessing/introduction.rst new file mode 100644 index 00000000..a9f3b5e6 --- /dev/null +++ b/docs/sections/preprocessing/introduction.rst @@ -0,0 +1,21 @@ +.. _preprocessing-introduction: + +Introduction to Preprocessing +============================= + +Sequentia provides a number of useful preprocessing methods for sequential data. + +- :doc:`Length Equalizing ` (``Equalize``) +- :doc:`Zero Trimming ` (``TrimZeros``) +- :doc:`Min-max Scaling ` (``MinMaxScale``) +- :doc:`Centering
` (``Center``) +- :doc:`Standardizing ` (``Standardize``) +- :doc:`Downsampling ` (``Downsample``) +- :doc:`Filtering ` (``Filter``) + +Additionally, the provided ``Preprocess`` class makes it possible to :doc:`apply multiple transformations `. + +Each of the transformations follow a similar interface, based on the abstract :class:`Transform` class: + +.. autoclass:: sequentia.preprocessing.Transform + :members: fit, fit_transform, transform, __call__ \ No newline at end of file diff --git a/docs/sections/preprocessing/min_max_scale.rst b/docs/sections/preprocessing/min_max_scale.rst new file mode 100644 index 00000000..61b14ecd --- /dev/null +++ b/docs/sections/preprocessing/min_max_scale.rst @@ -0,0 +1,10 @@ +.. _min_max_scale: + +Min-max Scaling (``MinMaxScale``) +================================= + +API reference +------------- + +.. autoclass:: sequentia.preprocessing.MinMaxScale + :members: fit, fit_transform, transform, __call__ \ No newline at end of file diff --git a/docs/sections/preprocessing/preprocessing.rst b/docs/sections/preprocessing/preprocessing.rst index 893f898e..1a2e3ad9 100644 --- a/docs/sections/preprocessing/preprocessing.rst +++ b/docs/sections/preprocessing/preprocessing.rst @@ -6,14 +6,7 @@ Combined Preprocessing (``Preprocess``) The :class:`~Preprocess` class provides a way of efficiently applying multiple preprocessing transformations to provided input observation sequences. -For further information, please see the `preprocessing tutorial notebook `_. - -Example -------- - -.. literalinclude:: ../../_includes/examples/preprocessing/preprocess.py - :language: python - :linenos: +For further information, please see the `preprocessing tutorial notebook `_. API reference ------------- diff --git a/docs/sections/preprocessing/standardize.rst b/docs/sections/preprocessing/standardize.rst index 3a20648f..a1588fe8 100644 --- a/docs/sections/preprocessing/standardize.rst +++ b/docs/sections/preprocessing/standardize.rst @@ -1,23 +1,10 @@ .. _standardize: -Standardizing (``standardize``) +Standardizing (``Standardize``) =============================== -Standardizes an observation sequence by transforming observations -so that they have zero mean and unit variance. - -For further information, please see the `preprocessing tutorial notebook `_. - -Example -------- - -.. literalinclude:: ../../_includes/examples/preprocessing/standardize.py - :language: python - :linenos: - API reference ------------- -.. automodule:: sequentia.preprocessing - :noindex: -.. autofunction:: standardize \ No newline at end of file +.. autoclass:: sequentia.preprocessing.Standardize + :members: fit, fit_transform, transform, __call__ \ No newline at end of file diff --git a/docs/sections/preprocessing/trim_zeros.rst b/docs/sections/preprocessing/trim_zeros.rst index 9379ee27..8d342522 100644 --- a/docs/sections/preprocessing/trim_zeros.rst +++ b/docs/sections/preprocessing/trim_zeros.rst @@ -1,9 +1,7 @@ .. _trim_zeros: -Zero-trimming (``trim_zeros``) -============================== - -Removes zero-observations from an observation sequence. +Zero Trimming (``TrimZeros``) +============================= Many datasets consisting of sequential data often pad observation sequences with zeros in order to ensure that the machine learning algorithms receive sequences of equal length. @@ -13,22 +11,12 @@ the added zeros may affect the performance of the machine learning algorithms. As the algorithms implemented by Sequentia focus on supporting variable-length sequences out of the box, zero padding is not necessary, and can be removed with this method. -**NOTE**: This preprocessing method does not only remove trailing zeros from the start +**Note**: This preprocessing method does not only remove trailing zeros from the start or end of a sequence, but will also remove **any** zero-observations that occur anywhere in the sequence. -For further information, please see the `preprocessing tutorial notebook `_. - -Example -------- - -.. literalinclude:: ../../_includes/examples/preprocessing/trim_zeros.py - :language: python - :linenos: - API reference ------------- -.. automodule:: sequentia.preprocessing - :noindex: -.. autofunction:: trim_zeros \ No newline at end of file +.. autoclass:: sequentia.preprocessing.TrimZeros + :members: fit, fit_transform, transform, __call__ \ No newline at end of file diff --git a/lib/sequentia/preprocessing/preprocess.py b/lib/sequentia/preprocessing/preprocess.py index 0b746ea3..6d133b0f 100644 --- a/lib/sequentia/preprocessing/preprocess.py +++ b/lib/sequentia/preprocessing/preprocess.py @@ -13,6 +13,23 @@ class Preprocess: ---------- steps: List[Transform] A list of preprocessing transformations. + + Examples + -------- + >>> # Create some sample data + >>> X = [np.random.random((20 * i, 3)) for i in range(1, 4)] + >>> # Create the Preprocess object + >>> pre = Preprocess([ + >>> TrimZeros(), + >>> Center(), + >>> Standardize(), + >>> Filter(window_size=5, method='median'), + >>> Downsample(factor=5, method='decimate') + >>> ]) + >>> # View a summary of the preprocessing steps + >>> pre.summary() + >>> # Transform the data applying transformations in order + >>> X = pre(X) """ def __init__(self, steps): @@ -44,8 +61,26 @@ def transform(self, X, verbose=False): X_t = step.transform(X_t, verbose=False) return X_t + def __call__(self, X, verbose=False): + """Alias of the :meth:`transform` method. + + See Also + -------- + transform: Applies the transformation. + """ + return self.transform(X, verbose) + def _fit(self, X, verbose): - """TODO""" + """Fit the preprocessing transformations with the provided observation sequence(s). + + Parameters + ---------- + X: numpy.ndarray or List[numpy.ndarray] + An individual observation sequence or a list of multiple observation sequences. + + verbose: bool + Whether or not to display a progress bar when fitting transformations. + """ X = self._val.observation_sequences(X, allow_single=True) X_t = copy(X) pbar = tqdm(self.steps, desc='Fitting transformations', disable=not(verbose and len(self.steps) > 1), leave=True, ncols='100%') diff --git a/lib/sequentia/preprocessing/transforms.py b/lib/sequentia/preprocessing/transforms.py index 7fd70f0d..16ae9f2a 100644 --- a/lib/sequentia/preprocessing/transforms.py +++ b/lib/sequentia/preprocessing/transforms.py @@ -6,6 +6,7 @@ __all__ = ['Transform', 'Equalize', 'TrimZeros', 'MinMaxScale', 'Center', 'Standardize', 'Downsample', 'Filter'] class Transform: + """Base class representing a single transformation.""" def __init__(self): self._val = _Validator() @@ -37,8 +38,26 @@ def transform(self, X, verbose=False): """ raise NotImplementedError + def __call__(self, X, verbose=False): + """Alias of the :meth:`transform` method.""" + return self.transform(X, verbose) + def _apply(self, transform, X, verbose): - """TODO""" + """Applies the transformation to the observation sequence(s). + + Parameters + ---------- + transform: callable + The transformation to apply. + + X: numpy.ndarray or List[numpy.ndarray] + An individual observation sequence or a list of multiple observation sequences. + + Returns + ------- + transformed: numpy.ndarray or List[numpy.ndarray] + The transformed input observation sequence(s). + """ X = self._val.observation_sequences(X, allow_single=True) verbose = self._val.boolean(verbose, 'verbose') @@ -60,15 +79,27 @@ def apply_transform(): self._unfit() def fit(self, X): - """TODO""" + """Fit the transformation on the provided observation sequence(s) (without transforming them). + + Parameters + ---------- + X: numpy.ndarray or List[numpy.ndarray] + An individual observation sequence or a list of multiple observation sequences. + """ self._val.observation_sequences(X, allow_single=True) def _unfit(self): - """TODO""" + """Unfit the transformation by resetting the parameters to their default settings.""" pass def _is_fitted(self): - """TODO""" + """Check whether or not the transformation is fitted on some observation sequence(s). + + Returns + ------- + fitted: bool + Whether or not the transformation is fitted. + """ return False def fit_transform(self, X, verbose=False): @@ -97,13 +128,6 @@ def __init__(self): self.length = None def fit(self, X): - """Fits the transformation with the length of the longest provided sequence. - - Parameters - ---------- - X: numpy.ndarray or List[numpy.ndarray] - An individual observation sequence or a list of multiple observation sequences. - """ X = self._val.observation_sequences(X, allow_single=True) self.length = max(len(x) for x in X) if isinstance(X, list) else len(X) @@ -123,7 +147,18 @@ def equalize(x): return self._apply(equalize, X, verbose) class TrimZeros(Transform): - """Trim zero-observations from the input observation sequence(s).""" + """Trim zero-observations from the input observation sequence(s). + + Examples + -------- + >>> # Create some sample data + >>> z = np.zeros((4, 3)) + >>> x = lambda i: np.vstack((z, np.random.random((10 * i, 3)), z)) + >>> X = [x(i) for i in range(1, 4)] + >>> # Zero-trim the data + >>> X = TrimZeros()(X) + """ + def _describe(self): return 'Remove zero-observations' @@ -139,8 +174,11 @@ class MinMaxScale(Transform): ---------- scale: tuple(int, int) The range of the transformed observation sequence features. + + independent: bool + Whether to independently compute the minimum and maximum to scale each observation sequence. """ - def __init__(self, scale=(0, 1)): + def __init__(self, scale=(0, 1), independent=True): super().__init__() if not isinstance(scale, tuple): raise TypeError('TODO') @@ -149,35 +187,139 @@ def __init__(self, scale=(0, 1)): if not scale[0] < scale[1]: raise ValueError('TODO') self.scale = scale + self.independent = self._val.boolean(independent, 'independent') + if not self.independent: + self.min, self.max = None, None + + def fit(self, X): + X = self._val.observation_sequences(X, allow_single=True) + if not self.independent: + X_concat = np.vstack(X) if isinstance(X, list) else X + self.min, self.max = X_concat.min(axis=0), X_concat.max(axis=0) + + def _unfit(self): + if not self.independent: + self.min, self.max = None, None + + def _is_fitted(self): + return False if self.independent else (self.min is not None) and (self.max is not None) def _describe(self): - return 'Min-max scaling into range {}'.format(self.scale) + if not self.independent: + return 'Min-max scaling into range {}'.format(self.scale) + else: + return 'Min-max scaling into range {} (independent)'.format(self.scale) def transform(self, X, verbose=False): - def min_max_scale(x): - min_, max_ = self.scale - scale = (max_ - min_) / (x.max(axis=0) - x.min(axis=0)) - return scale * x + min_ - x.min(axis=0) * scale + if not self.independent: + def min_max_scale(x): + min_, max_ = self.scale + scale = (max_ - min_) / (self.max - self.min) + return scale * x + min_ - self.min * scale + else: + def min_max_scale(x): + min_, max_ = self.scale + scale = (max_ - min_) / (x.max(axis=0) - x.min(axis=0)) + return scale * x + min_ - x.min(axis=0) * scale return self._apply(min_max_scale, X, verbose) class Center(Transform): - """Centers the observation sequence features around their means. Results in zero-mean features.""" + """Centers the observation sequence features around their means. Results in zero-mean features. + + Parameters + ---------- + independent: bool + Whether to independently compute the mean to scale each observation sequence. + + Examples + -------- + >>> # Create some sample data + >>> X = [np.random.random((10 * i, 3)) for i in range(1, 4)] + >>> # Center the data + >>> X = Center()(X) + """ + def __init__(self, independent=True): + super().__init__() + self.independent = self._val.boolean(independent, 'independent') + if not self.independent: + self.mean = None + + def fit(self, X): + X = self._val.observation_sequences(X, allow_single=True) + if not self.independent: + X_concat = np.vstack(X) if isinstance(X, list) else X + self.mean = X_concat.mean(axis=0) + + def _unfit(self): + if not self.independent: + self.mean = None + + def _is_fitted(self): + return False if self.independent else (self.mean is not None) + def _describe(self): - return 'Centering around mean (zero mean)' + if not self.independent: + return 'Centering around mean (zero mean)' + else: + return 'Centering around mean (zero mean) (independent)' def transform(self, X, verbose=False): - def center(x): - return x - x.mean(axis=0) + if not self.independent: + def center(x): + return x - self.mean + else: + def center(x): + return x - x.mean(axis=0) return self._apply(center, X, verbose) class Standardize(Transform): - """Centers the observation sequence features around their means, then scales them by their deviations. Results in zero-mean, unit-variance features.""" + """Centers the observation sequence features around their means, then scales them by their deviations. + Results in zero-mean, unit-variance features. + + Parameters + ---------- + independent: bool + Whether to independently compute the mean and standard deviation to scale each observation sequence. + + Examples + -------- + >>> # Create some sample data + >>> X = [np.random.random((10 * i, 3)) for i in range(1, 4)] + >>> # Standardize the data + >>> X = Standardize()(X) + """ + def __init__(self, independent=True): + super().__init__() + self.independent = self._val.boolean(independent, 'independent') + if not self.independent: + self.mean, self.std = None, None + + def fit(self, X): + X = self._val.observation_sequences(X, allow_single=True) + if not self.independent: + X_concat = np.vstack(X) if isinstance(X, list) else X + self.mean, self.std = X_concat.mean(axis=0), X_concat.std(axis=0) + + def _unfit(self): + if not self.independent: + self.mean, self.std = None, None + + def _is_fitted(self): + return False if self.independent else (self.mean is not None) and (self.std is not None) + def _describe(self): - return 'Standard scaling (zero mean, unit variance)' + if not self.independent: + return 'Standard scaling (zero mean, unit variance)' + else: + return 'Standard scaling (zero mean, unit variance) (independent)' def transform(self, X, verbose=False): - def standardize(x): - return (x - x.mean(axis=0)) / x.std(axis=0) + if not self.independent: + def standardize(x): + return (x - self.mean) / self.std + else: + def standardize(x): + return (x - x.mean(axis=0)) / x.std(axis=0) return self._apply(standardize, X, verbose) class Downsample(Transform): @@ -193,6 +335,13 @@ class Downsample(Transform): method: {'decimate', 'mean'} The downsampling method. + + Examples + -------- + >>> # Create some sample data + >>> X = [np.random.random((10 * i, 3)) for i in range(1, 4)] + >>> # Downsample the data with downsample factor 5 and decimation + >>> X = Downsample(factor=5, method='decimate')(X) """ def __init__(self, factor, method='decimate'): super().__init__() @@ -235,6 +384,13 @@ class Filter(Transform): method: {'median', 'mean'} The filtering method. + + Examples + -------- + >>> # Create some sample data + >>> X = [np.random.random((10 * i, 3)) for i in range(1, 4)] + >>> # Filter the data with window size 5 and median filtering + >>> X = Filter(window_size=5, method='median')(X) """ def __init__(self, window_size, method='median'): super().__init__() diff --git a/lib/test/lib/preprocessing/test_methods.py b/lib/test/lib/preprocessing/test_methods.py deleted file mode 100644 index 5e2b7434..00000000 --- a/lib/test/lib/preprocessing/test_methods.py +++ /dev/null @@ -1,525 +0,0 @@ -# import pytest -# import numpy as np -# from sequentia.preprocessing import trim_zeros, downsample, center, standardize, fft, filtrate -# from ...support import assert_equal, assert_all_equal - -# # Set seed for reproducible randomness -# seed = 0 -# np.random.seed(seed) -# rng = np.random.RandomState(seed) - -# # Sample data -# X_even = rng.random((6, 2)) -# X_odd = rng.random((7, 2)) -# Xs = [i * rng.random((3 * i, 2)) for i in range(1, 4)] - -# # Zero-padded sample data -# zeros = np.zeros((3, 2)) -# X_padded = np.vstack((zeros, X_even, zeros)) -# Xs_padded = [np.vstack((zeros, x, zeros)) for x in Xs] - -# # ============ # -# # trim_zeros() # -# # ============ # - -# def test_trim_zeros_single(): -# """Trim a single zero-padded observation sequence""" -# assert_equal(trim_zeros(X_padded), np.array([ -# [0.5488135 , 0.71518937], -# [0.60276338, 0.54488318], -# [0.4236548 , 0.64589411], -# [0.43758721, 0.891773 ], -# [0.96366276, 0.38344152], -# [0.79172504, 0.52889492] -# ])) - -# def test_trim_zeros_multiple(): -# """Trim multiple zero-padded observation sequences""" -# assert_all_equal(trim_zeros(Xs_padded), [ -# np.array([ -# [0.14335329, 0.94466892], -# [0.52184832, 0.41466194], -# [0.26455561, 0.77423369] -# ]), -# np.array([ -# [0.91230066, 1.1368679 ], -# [0.0375796 , 1.23527099], -# [1.22419145, 1.23386799], -# [1.88749616, 1.3636406 ], -# [0.7190158 , 0.87406391], -# [1.39526239, 0.12045094] -# ]), -# np.array([ -# [2.00030015, 2.01191361], -# [0.63114768, 0.38677889], -# [0.94628505, 1.09113231], -# [1.71059031, 1.31580454], -# [2.96512151, 0.30613443], -# [0.62663027, 0.48392855], -# [1.95932498, 0.75987481], -# [1.39893232, 0.73327678], -# [0.47690875, 0.33112542] -# ]) -# ]) - -# # ======== # -# # center() # -# # ======== # - -# def test_center_single_even(): -# """Center a single even-length observation sequence""" -# assert_equal(center(X_even), np.array([ -# [-0.07922094, 0.09684335 ], -# [-0.02527107, -0.07346283], -# [-0.20437965, 0.0275481 ], -# [-0.19044724, 0.27342698 ], -# [0.33562831 , -0.2349045 ], -# [0.16369059 , -0.0894511 ] -# ])) - -# def test_center_single_odd(): -# """Center a single odd-length observation sequence""" -# assert_equal(center(X_odd), np.array([ -# [0.14006915 , 0.2206014 ], -# [-0.35693936, -0.61786594], -# [-0.40775702, 0.1276246 ], -# [0.35018134 , 0.16501691 ], -# [0.55064293 , 0.09416332 ], -# [0.03350395 , 0.07553393 ], -# [-0.30970099, -0.06507422] -# ])) - -# def test_center_multiple(): -# """Center multiple observation sequences""" -# assert_all_equal(center(Xs), [ -# np.array([ -# [-0.16656579, 0.23348073 ], -# [0.21192925 , -0.29652624], -# [-0.04536346, 0.06304551 ] -# ]), -# np.array([ -# [-0.11700701, 0.14284084 ], -# [-0.99172808, 0.24124394 ], -# [0.19488377 , 0.23984094 ], -# [0.85818848 , 0.36961354 ], -# [-0.31029188, -0.11996315], -# [0.36595472 , -0.87357611] -# ]), -# np.array([ -# [0.58749559 , 1.18747257 ], -# [-0.78165687, -0.43766215], -# [-0.46651951, 0.26669127 ], -# [0.29778575 , 0.4913635 ], -# [1.55231696 , -0.51830661], -# [-0.78617429, -0.34051249], -# [0.54652042 , -0.06456623], -# [-0.01387224, -0.09116426], -# [-0.93589581, -0.49331562] -# ]) -# ]) - -# # ============= # -# # standardize() # -# # ============= # - -# def test_standardize_single_even(): -# """Standardize a single even-length observation sequence""" -# assert_equal(standardize(X_even), np.array([ -# [-0.40964472, 0.60551094], -# [-0.13067455, -0.45932478], -# [-1.05682966, 0.17224387], -# [-0.98478635, 1.70959629], -# [ 1.73550526, -1.46873528], -# [ 0.84643002, -0.55929105] -# ])) - -# def test_standardize_single_odd(): -# """Standardize a single odd-length observation sequence""" -# assert_equal(standardize(X_odd), np.array([ -# [ 0.40527155, 0.83146609], -# [-1.03275681, -2.32879115], -# [-1.17979099, 0.48102837], -# [ 1.01320338, 0.62196325], -# [ 1.59321247, 0.35490986], -# [ 0.09693924, 0.28469405], -# [-0.89607884, -0.24527047] -# ])) - -# def test_standardize_multiple(): -# """Standardize multiple observation sequences""" -# assert_all_equal(standardize(Xs), [ -# np.array([ -# [-1.05545468, 1.05686059], -# [ 1.34290313, -1.34223879], -# [-0.28744845, 0.2853782 ] -# ]), -# np.array([ -# [-0.20256659, 0.34141162], -# [-1.71691396, 0.57661018], -# [ 0.33738952, 0.57325679], -# [ 1.4857256 , 0.88343331], -# [-0.53718803, -0.28673041], -# [ 0.63355347, -2.08798149] -# ]), -# np.array([ -# [ 0.75393018, 2.22884906], -# [-1.0030964 , -0.82147823], -# [-0.59868217, 0.50057122], -# [ 0.38214698, 0.922274 ], -# [ 1.99208067, -0.97284537], -# [-1.00889357, -0.63913134], -# [ 0.70134695, -0.12118881], -# [-0.01780218, -0.17111248], -# [-1.20103046, -0.92593806] -# ]) -# ]) - -# # ============ # -# # downsample() # -# # ============ # - -# def test_downsample_single_large_factor(): -# """Downsample a single observation sequence with a downsample factor that is too large""" -# with pytest.raises(ValueError) as e: -# downsample(X_even, n=7) -# assert str(e.value) == 'Expected downsample factor to be no greater than the number of frames' - -# def test_downsample_single_decimate_max(): -# """Downsample a single observation sequence with decimation and the maximum downsample factor""" -# assert_equal(downsample(X_even, n=6, method='decimate'), np.array([ -# [0.548814, 0.715189] -# ])) - -# def test_downsample_single_decimate(): -# """Downsample a single observation sequence with decimation""" -# assert_equal(downsample(X_odd, n=3, method='decimate'), np.array([ -# [0.56804456, 0.92559664], -# [0.77815675, 0.87001215], -# [0.11827443, 0.63992102] -# ])) - -# def test_downsample_single_average_max(): -# """Downsample a single observation sequence with averaging and the maximum downsample factor""" -# assert_equal(downsample(X_even, n=6, method='average'), np.array([ -# [0.62803445, 0.61834602] -# ])) - -# def test_downsample_single_average(): -# """Downsample a single observation sequence with averaging""" -# assert_equal(downsample(X_odd, n=3, method='average'), np.array([ -# [0.21976634, 0.61511526], -# [0.73941815, 0.81656663], -# [0.11827443, 0.63992102] -# ])) - -# def test_downsample_multiple_large_factor(): -# """Downsample multiple observation sequences with a downsample factor that is too large""" -# with pytest.raises(ValueError) as e: -# downsample(Xs, n=4) -# assert str(e.value) == 'Expected downsample factor to be no greater than the number of frames in the shortest sequence' - -# def test_downsample_multiple_decimate_max(): -# """Downsample multiple observation sequences with decimation and the maximum downsample factor""" -# assert_all_equal(downsample(Xs, n=3, method='decimate'), [ -# np.array([[0.14335329, 0.94466892]]), -# np.array([ -# [0.91230066, 1.1368679], -# [1.88749616, 1.3636406] -# ]), -# np.array([ -# [2.00030015, 2.01191361], -# [1.71059031, 1.31580454], -# [1.95932498, 0.75987481] -# ]) -# ]) - -# def test_downsample_multiple_decimate(): -# """Downsample multiple observation sequences with decimation""" -# assert_all_equal(downsample(Xs, n=2, method='decimate'), [ -# np.array([ -# [0.14335329, 0.94466892], -# [0.26455561, 0.77423369] -# ]), -# np.array([ -# [0.91230066, 1.1368679 ], -# [1.22419145, 1.23386799], -# [0.7190158 , 0.87406391] -# ]), -# np.array([ -# [2.00030015, 2.01191361], -# [0.94628505, 1.09113231], -# [2.96512151, 0.30613443], -# [1.95932498, 0.75987481], -# [0.47690875, 0.33112542] -# ]) -# ]) - -# def test_downsample_multiple_average_max(): -# """Downsample multiple observation sequences with averaging and the maximum downsample factor""" -# assert_all_equal(downsample(Xs, n=3, method='average'), [ -# np.array([[0.30991907, 0.71118818]]), -# np.array([ -# [0.72469057, 1.2020023 ], -# [1.33392478, 0.78605182] -# ]), -# np.array([ -# [1.19257763, 1.16327494], -# [1.76744736, 0.70195584], -# [1.27838868, 0.60809234] -# ]) -# ]) - -# def test_downsample_multiple_average(): -# """Downsample multiple observation sequences with averaging""" -# assert_all_equal(downsample(Xs, n=2, method='average'), [ -# np.array([ -# [0.3326008 , 0.67966543], -# [0.26455561, 0.77423369] -# ]), -# np.array([ -# [0.47494013, 1.18606945], -# [1.5558438 , 1.2987543 ], -# [1.0571391 , 0.49725743] -# ]), -# np.array([ -# [1.31572391, 1.19934625], -# [1.32843768, 1.20346843], -# [1.79587589, 0.39503149], -# [1.67912865, 0.74657579], -# [0.47690875, 0.33112542] -# ]) -# ]) - -# # ===== # -# # fft() # -# # ===== # - -# def test_fft_single_even(): -# """Fourier-transform a single even-length observation sequence""" -# assert_equal(fft(X_even), np.array([ -# [3.76820669 , 3.7100761 ], -# [0.11481172 , -0.1543624 ], -# [0.63130621 , -0.24113686], -# [-0.40450227, 0.5554055 ], -# [-0.30401501, 0.21344437 ], -# [0.10405544 , -0.22102611] -# ])) - -# def test_fft_single_odd(): -# """Fourier-transform a single odd-length observation sequence""" -# assert_equal(fft(X_odd), np.array([ -# [2.9958279 , 4.93496669 ], -# [-1.00390978, -0.48392518], -# [0.5541071 , 0.35066311 ], -# [1.18725568 , 0.35112659 ], -# [-0.30212914, 0.61692894 ], -# [ 0.30689611, 0.90490347 ], -# [-0.12906015, 0.21149633 ] -# ])) - -# def test_fft_multiple(): -# """Fourier-transform multiple observation sequences""" -# assert_all_equal(fft(Xs), [ -# np.array([ -# [0.92975722 , 2.13356455], -# [-0.24984868, 0.3502211 ], -# [-0.22282202, 0.31139827] -# ]), -# np.array([ -# [6.17584606 , 5.96416233 ], -# [-1.23037812, -0.60287768], -# [0.73829285 , -1.27706196], -# [1.1117722 , 0.76868158 ], -# [1.61328273 , -0.65386301], -# [-0.46483024, 0.52543726 ] -# ]), -# np.array([ -# [1.27152410e+01 , 7.41996935e+00 ], -# [-1.95373695e+00, 1.09840950e+00 ], -# [-2.37772910e-01, -8.08832368e-01], -# [9.05412519e-01 , -1.04236869e-02], -# [1.29066145e+00 , 1.89963643e-01 ], -# [2.14770264e+00 , 2.42140476e+00 ], -# [-2.55077169e+00, 4.15688893e-01 ], -# [1.54435193e+00 , 1.83423599e+00 ], -# [2.17466597e+00 , -4.45551803e-01] -# ]) -# ]) - -# # ========== # -# # filtrate() # -# # ========== # - -# def test_filtrate_single_large_window(): -# """Filter a single observation sequence with a window size that is too large""" -# with pytest.raises(ValueError) as e: -# filtrate(X_even, n=7) -# assert str(e.value) == 'Expected window size to be no greater than the number of frames' - -# def test_filtrate_single_median_max(): -# """Filter a single observation sequence with median filtering and the maximum window size""" -# assert_equal(filtrate(X_even, n=6, method='median'), np.array([ -# [0.49320036, 0.68054174], -# [0.5488135 , 0.64589411], -# [0.57578844, 0.59538865], -# [0.60276338, 0.54488318], -# [0.61465612, 0.58739452], -# [0.79172504, 0.52889492] -# ])) - -# def test_filtrate_single_median(): -# """Filter a single observation sequence with median filtering""" -# assert_equal(filtrate(X_odd, n=3, method='median'), np.array([ -# [0.31954031, 0.50636297], -# [0.07103606, 0.83261985], -# [0.07103606, 0.83261985], -# [0.77815675, 0.83261985], -# [0.77815675, 0.79915856], -# [0.46147936, 0.78052918], -# [0.28987689, 0.7102251 ] -# ])) - -# def test_filtrate_single_mean_max(): -# """Filter a single observation sequence with mean filtering and the maximum window size""" -# assert_equal(filtrate(X_even, n=6, method='mean'), np.array([ -# [0.50320472, 0.69943492], -# [0.59529633, 0.63623624], -# [0.62803445, 0.61834602], -# [0.64387864, 0.59897735], -# [0.65415745, 0.61250089], -# [0.73099167, 0.60136981] -# ])) - -# def test_filtrate_single_mean(): -# """Filter a single observation sequence with mean filtering""" -# assert_equal(filtrate(X_odd, n=3, method='mean'), np.array([ -# [0.31954031, 0.50636297], -# [0.21976634, 0.61511526], -# [0.28980374, 0.5965871 ], -# [0.59233116, 0.83393019], -# [0.73941815, 0.81656663], -# [0.51945738, 0.73986959], -# [0.28987689, 0.7102251 ] -# ])) - -# def test_filtrate_multiple_large_window(): -# """Filter multiple observation sequences with a window size that is too large""" -# with pytest.raises(ValueError) as e: -# filtrate(Xs, n=4) -# assert str(e.value) == 'Expected window size to be no greater than the number of frames in the shortest sequence' - -# def test_filtrate_multiple_median_max(): -# """Filter multiple observation sequences with median filtering and the maximum window size""" -# assert_all_equal(filtrate(Xs, n=3, method='median'), [ -# np.array([ -# [0.3326008 , 0.67966543], -# [0.26455561, 0.77423369], -# [0.39320197, 0.59444781] -# ]), -# np.array([ -# [0.47494013, 1.18606945], -# [0.91230066, 1.23386799], -# [1.22419145, 1.23527099], -# [1.22419145, 1.23386799], -# [1.39526239, 0.87406391], -# [1.0571391 , 0.49725743] -# ]), -# np.array([ -# [1.31572391, 1.19934625], -# [0.94628505, 1.09113231], -# [0.94628505, 1.09113231], -# [1.71059031, 1.09113231], -# [1.71059031, 0.48392855], -# [1.95932498, 0.48392855], -# [1.39893232, 0.73327678], -# [1.39893232, 0.73327678], -# [0.93792053, 0.5322011 ] -# ]) -# ]) - -# def test_filtrate_multiple_median(): -# """Filter multiple observation sequences with median filtering""" -# assert_all_equal(filtrate(Xs, n=2, method='median'), [ -# np.array([ -# [0.3326008 , 0.67966543], -# [0.39320197, 0.59444781], -# [0.26455561, 0.77423369] -# ]), -# np.array([ -# [0.47494013, 1.18606945], -# [0.63088552, 1.23456949], -# [1.5558438 , 1.2987543 ], -# [1.30325598, 1.11885225], -# [1.0571391 , 0.49725743], -# [1.39526239, 0.12045094] -# ]), -# np.array([ -# [1.31572391, 1.19934625], -# [0.78871637, 0.7389556 ], -# [1.32843768, 1.20346843], -# [2.33785591, 0.81096949], -# [1.79587589, 0.39503149], -# [1.29297762, 0.62190168], -# [1.67912865, 0.74657579], -# [0.93792053, 0.5322011 ], -# [0.47690875, 0.33112542] -# ]) -# ]) - -# def test_filtrate_multiple_average_max(): -# """Filter multiple observation sequences with mean filtering and the maximum window size""" -# assert_all_equal(filtrate(Xs, n=3, method='mean'), [ -# np.array([ -# [0.3326008 , 0.67966543], -# [0.30991907, 0.71118818], -# [0.39320197, 0.59444781] -# ]), -# np.array([ -# [0.47494013, 1.18606945], -# [0.72469057, 1.2020023 ], -# [1.04975573, 1.2775932 ], -# [1.27690113, 1.15719083], -# [1.33392478, 0.78605182], -# [1.0571391 , 0.49725743] -# ]), -# np.array([ -# [1.31572391, 1.19934625], -# [1.19257763, 1.16327494], -# [1.09600768, 0.93123858], -# [1.87399896, 0.9043571 ], -# [1.76744736, 0.70195584], -# [1.85035892, 0.51664593], -# [1.32829585, 0.65902671], -# [1.27838868, 0.60809234], -# [0.93792053, 0.5322011 ] -# ]) -# ]) - -# def test_filtrate_multiple_mean(): -# """Filter multiple observation sequences with mean filtering""" -# assert_all_equal(filtrate(Xs, n=2, method='mean'), [ -# np.array([ -# [0.3326008 , 0.67966543], -# [0.39320197, 0.59444781], -# [0.26455561, 0.77423369] -# ]), -# np.array([ -# [0.47494013, 1.18606945], -# [0.63088552, 1.23456949], -# [1.5558438 , 1.2987543 ], -# [1.30325598, 1.11885225], -# [1.0571391 , 0.49725743], -# [1.39526239, 0.12045094] -# ]), -# np.array([ -# [1.31572391, 1.19934625], -# [0.78871637, 0.7389556 ], -# [1.32843768, 1.20346843], -# [2.33785591, 0.81096949], -# [1.79587589, 0.39503149], -# [1.29297762, 0.62190168], -# [1.67912865, 0.74657579], -# [0.93792053, 0.5322011 ], -# [0.47690875, 0.33112542] -# ]) -# ]) \ No newline at end of file diff --git a/lib/test/lib/preprocessing/test_preprocess.py b/lib/test/lib/preprocessing/test_preprocess.py index 248b31b8..f0ec10d3 100644 --- a/lib/test/lib/preprocessing/test_preprocess.py +++ b/lib/test/lib/preprocessing/test_preprocess.py @@ -1,286 +1,282 @@ -# import pytest -# import numpy as np -# from sequentia.preprocessing import ( -# Preprocess, -# trim_zeros, downsample, center, standardize, fft, filtrate, -# _trim_zeros, _downsample, _center, _standardize, _fft, _filtrate -# ) -# from ...support import assert_equal, assert_all_equal - -# # Set seed for reproducible randomness -# seed = 0 -# np.random.seed(seed) -# rng = np.random.RandomState(seed) - -# # Sample data -# X = rng.random((7, 2)) -# Xs = [i * rng.random((3 * i, 2)) for i in range(1, 4)] - -# # Zero-trimming preprocessor -# trim = Preprocess() -# trim.trim_zeros() - -# # Centering preprocessor -# cent = Preprocess() -# cent.center() - -# # Standardizing preprocessor -# standard = Preprocess() -# standard.standardize() - -# # Discrete Fourier Transform preprocessor -# fourier = Preprocess() -# fourier.fft() - -# # Downsampling preprocessor -# down = Preprocess() -# down_kwargs = {'n': 3, 'method': 'decimate'} -# down.downsample(**down_kwargs) - -# # Filtering preprocessor -# filt = Preprocess() -# filt_kwargs = {'n': 3, 'method': 'median'} -# filt.filtrate(**filt_kwargs) - -# # Combined preprocessor -# combined = Preprocess() -# combined.trim_zeros() -# combined.center() -# combined.standardize() -# combined.filtrate(**filt_kwargs) -# combined.downsample(**down_kwargs) -# combined.fft() - -# # ======================= # -# # Preprocess.trim_zeros() # -# # ======================= # - -# def test_trim_zeros_adds_transform(): -# """Applying a single zero-trimming transformation""" -# assert len(trim._transforms) == 1 -# assert trim._transforms[0] == (_trim_zeros, {}) - -# def test_trim_zeros_single(): -# """Applying zero-trimming to a single observation sequence""" -# assert_equal(trim.transform(X), trim_zeros(X)) - -# def test_trim_zeros_multiple(): -# """Applying zero-trimming to multiple observation sequences""" -# assert_all_equal(trim.transform(Xs), trim_zeros(Xs)) - -# def test_trim_zeros_summary(capsys): -# """Summary of a zero-trimming transformation""" -# trim.summary() -# assert capsys.readouterr().out == ( -# 'Preprocessing summary:\n' -# '======================\n' -# '1. Zero-trimming\n' -# '======================\n' -# ) - -# # =================== # -# # Preprocess.center() # -# # =================== # - -# def test_center_adds_transform(): -# """Applying a single centering transformation""" -# assert len(cent._transforms) == 1 -# assert cent._transforms[0] == (_center, {}) - -# def test_center_single(): -# """Applying centering to a single observation sequence""" -# assert_equal(cent.transform(X), center(X)) - -# def test_center_multiple(): -# """Applying centering to multiple observation sequences""" -# assert_all_equal(cent.transform(Xs), center(Xs)) - -# def test_center_summary(capsys): -# """Summary of a centering transformation""" -# cent.summary() -# assert capsys.readouterr().out == ( -# 'Preprocessing summary:\n' -# '======================\n' -# '1. Centering\n' -# '======================\n' -# ) - -# # ======================== # -# # Preprocess.standardize() # -# # ======================== # - -# def test_standardize_adds_transform(): -# """Applying a single standardizing transformation""" -# assert len(standard._transforms) == 1 -# assert standard._transforms[0] == (_standardize, {}) - -# def test_standardize_single(): -# """Applying standardization to a single observation sequence""" -# assert_equal(standard.transform(X), standardize(X)) - -# def test_standardize_multiple(): -# """Applying standardization to multiple observation sequences""" -# assert_all_equal(standard.transform(Xs), standardize(Xs)) - -# def test_standardize_summary(capsys): -# """Summary of a standardizing transformation""" -# standard.summary() -# assert capsys.readouterr().out == ( -# 'Preprocessing summary:\n' -# '======================\n' -# '1. Standardization\n' -# '======================\n' -# ) - -# # ================ # -# # Preprocess.fft() # -# # ================ # - -# def test_fft_adds_transform(): -# """Applying a single discrete fourier transformation""" -# assert len(fourier._transforms) == 1 -# assert fourier._transforms[0] == (_fft, {}) - -# def test_fft_single(): -# """Applying discrete fourier transformation to a single observation sequence""" -# assert_equal(fourier.transform(X), fft(X)) - -# def test_fft_multiple(): -# """Applying discrete fourier transformation to multiple observation sequences""" -# assert_all_equal(fourier.transform(Xs), fft(Xs)) - -# def test_fft_summary(capsys): -# """Summary of a discrete fourier transformation""" -# fourier.summary() -# assert capsys.readouterr().out == ( -# ' Preprocessing summary: \n' -# '=============================\n' -# '1. Discrete Fourier Transform\n' -# '=============================\n' -# ) - -# # ======================= # -# # Preprocess.downsample() # -# # ======================= # - -# def test_downsample_adds_transform(): -# """Applying a single downsampling transformation""" -# assert len(down._transforms) == 1 -# assert down._transforms[0] == (_downsample, down_kwargs) - -# def test_downsample_single(): -# """Applying downsampling to a single observation sequence""" -# assert_equal(down.transform(X), downsample(X, **down_kwargs)) - -# def test_downsample_multiple(): -# """Applying downsampling to multiple observation sequences""" -# assert_all_equal(down.transform(Xs), downsample(Xs, **down_kwargs)) - -# def test_downsample_summary(capsys): -# """Summary of a downsampling transformation""" -# down.summary() -# assert capsys.readouterr().out == ( -# ' Preprocessing summary: \n' -# '==========================================\n' -# '1. Downsampling:\n' -# ' Decimation with downsample factor (n=3)\n' -# '==========================================\n' -# ) - -# # ===================== # -# # Preprocess.filtrate() # -# # ===================== # - -# def test_filtrate_adds_transform(): -# """Applying a single filtering transformation""" -# assert len(filt._transforms) == 1 -# assert filt._transforms[0] == (_filtrate, filt_kwargs) - -# def test_filtrate_single(): -# """Applying filtering to a single observation sequence""" -# assert_equal(filt.transform(X), filtrate(X, **filt_kwargs)) - -# def test_filtrate_multiple(): -# """Applying filtering to multiple observation sequences""" -# assert_all_equal(filt.transform(Xs), filtrate(Xs, **filt_kwargs)) - -# def test_filtrate_summary(capsys): -# """Summary of a filtering transformation""" -# filt.summary() -# assert capsys.readouterr().out == ( -# ' Preprocessing summary: \n' -# '=======================================\n' -# '1. Filtering:\n' -# ' Median filter with window size (n=3)\n' -# '=======================================\n' -# ) - -# # ======================== # -# # Combined transformations # -# # ======================== # - -# def test_combined_adds_transforms(): -# """Applying multiple filtering transformations""" -# assert len(combined._transforms) == 6 -# assert combined._transforms == [ -# (_trim_zeros, {}), -# (_center, {}), -# (_standardize, {}), -# (_filtrate, filt_kwargs), -# (_downsample, down_kwargs), -# (_fft, {}) -# ] - -# def test_combined_single(): -# """Applying combined transformations to a single observation sequence""" -# X_pre = X -# X_pre = trim_zeros(X_pre) -# X_pre = center(X_pre) -# X_pre = standardize(X_pre) -# X_pre = filtrate(X_pre, **filt_kwargs) -# X_pre = downsample(X_pre, **down_kwargs) -# X_pre = fft(X_pre) -# assert_equal(combined.transform(X), X_pre) - -# def test_combined_multiple(): -# """Applying combined transformations to multiple observation sequences""" -# Xs_pre = Xs -# Xs_pre = trim_zeros(Xs_pre) -# Xs_pre = center(Xs_pre) -# Xs_pre = standardize(Xs_pre) -# Xs_pre = filtrate(Xs_pre, **filt_kwargs) -# Xs_pre = downsample(Xs_pre, **down_kwargs) -# Xs_pre = fft(Xs_pre) -# assert_all_equal(combined.transform(Xs), Xs_pre) - -# def test_combined_summary(capsys): -# """Summary with combined transformations applied""" -# combined.summary() -# assert capsys.readouterr().out == ( -# ' Preprocessing summary: \n' -# '==========================================\n' -# '1. Zero-trimming\n' -# '------------------------------------------\n' -# '2. Centering\n' -# '------------------------------------------\n' -# '3. Standardization\n' -# '------------------------------------------\n' -# '4. Filtering:\n' -# ' Median filter with window size (n=3)\n' -# '------------------------------------------\n' -# '5. Downsampling:\n' -# ' Decimation with downsample factor (n=3)\n' -# '------------------------------------------\n' -# '6. Discrete Fourier Transform\n' -# '==========================================\n' -# ) - -# # ==================== # -# # Preprocess.summary() # -# # ==================== # - -# def test_empty_summary(): -# """Summary without any transformations applied""" -# with pytest.raises(RuntimeError) as e: -# Preprocess().summary() -# assert str(e.value) == 'At least one preprocessing transformation is required' \ No newline at end of file +import pytest +import numpy as np +from sequentia.preprocessing import * +from ...support import assert_equal, assert_all_equal + +# Set seed for reproducible randomness +seed = 0 +np.random.seed(seed) +rng = np.random.RandomState(seed) + +# Sample data +X = rng.random((7, 2)) +Xs = [i * rng.random((3 * i, 2)) for i in range(1, 4)] + +# Length equalizing preprocessor +equalize = Preprocess([Equalize()]) + +# Zero-trimming preprocessor +trim = Preprocess([TrimZeros()]) + +# Min-max scaling preprocessor +min_max_scale_kwargs = {'scale': (-5, 5), 'independent': False} +min_max_scale = Preprocess([MinMaxScale(**min_max_scale_kwargs)]) + +# Centering preprocessor +cent = Preprocess([Center()]) + +# Standardizing preprocessor +standard = Preprocess([Standardize()]) + +# Downsampling preprocessor +down_kwargs = {'factor': 3, 'method': 'decimate'} +down = Preprocess([Downsample(**down_kwargs)]) + +# Filtering preprocessor +filt_kwargs = {'window_size': 3, 'method': 'median'} +filt = Preprocess([Filter(**filt_kwargs)]) + +# Combined preprocessor +combined = Preprocess([ + Equalize(), + TrimZeros(), + MinMaxScale(**min_max_scale_kwargs), + Center(), + Standardize(), + Filter(**filt_kwargs), + Downsample(**down_kwargs) +]) + +# ======== # +# Equalize # +# ======== # + +def test_equalize_single(): + """Applying length equalizing to a single observation sequence""" + assert_equal(equalize(X), Equalize()(X)) + +def test_equalize_multiple(): + """Applying length equalizing to multiple observation sequences""" + assert_all_equal(equalize(Xs), Equalize()(Xs)) + +def test_equalize_summary(capsys): + """Summary of a length equalizing transformation""" + equalize.summary() + assert capsys.readouterr().out == ( + ' Preprocessing summary: \n' + '============================\n' + '1. Equalize\n' + ' Equalize sequence lengths\n' + '============================\n' + ) + +# ========= # +# TrimZeros # +# ========= # + +def test_trim_zeros_single(): + """Applying zero-trimming to a single observation sequence""" + assert_equal(trim(X), TrimZeros()(X)) + +def test_trim_zeros_multiple(): + """Applying zero-trimming to multiple observation sequences""" + assert_all_equal(trim(Xs), TrimZeros()(Xs)) + +def test_trim_zeros_summary(capsys): + """Summary of a zero-trimming transformation""" + trim.summary() + assert capsys.readouterr().out == ( + ' Preprocessing summary: \n' + '===========================\n' + '1. TrimZeros\n ' + 'Remove zero-observations\n' + '===========================\n' + ) + +# =========== # +# MinMaxScale # +# =========== # + +def test_min_max_scale_single(): + """Applying min-max scaling to a single observation sequence""" + assert_equal(min_max_scale(X), MinMaxScale(**min_max_scale_kwargs)(X)) + +def test_min_max_scale_multiple(): + """Applying min-max scaling to multiple observation sequences""" + assert_all_equal(min_max_scale(Xs), MinMaxScale(**min_max_scale_kwargs)(Xs)) + +def test_min_max_scale_summary(capsys): + """Summary of a min-max scaling transformation""" + min_max_scale.summary() + assert capsys.readouterr().out == ( + ' Preprocessing summary: \n' + '=====================================\n' + '1. MinMaxScale\n' + ' Min-max scaling into range (-5, 5)\n' + '=====================================\n' + ) + +# ====== # +# Center # +# ====== # + +def test_center_single(): + """Applying centering to a single observation sequence""" + assert_equal(cent(X), Center()(X)) + +def test_center_multiple(): + """Applying centering to multiple observation sequences""" + assert_all_equal(cent(Xs), Center()(Xs)) + +def test_center_summary(capsys): + """Summary of a centering transformation""" + cent.summary() + assert capsys.readouterr().out == ( + ' Preprocessing summary: \n' + '==================================================\n' + '1. Center\n' + ' Centering around mean (zero mean) (independent)\n' + '==================================================\n' + ) + +# =========== # +# Standardize # +# =========== # + +def test_standardize_single(): + """Applying standardization to a single observation sequence""" + assert_equal(standard(X), Standardize()(X)) + +def test_standardize_multiple(): + """Applying standardization to multiple observation sequences""" + assert_all_equal(standard(Xs), Standardize()(Xs)) + +def test_standardize_summary(capsys): + """Summary of a standardizing transformation""" + standard.summary() + assert capsys.readouterr().out == ( + ' Preprocessing summary: \n' + '============================================================\n' + '1. Standardize\n' + ' Standard scaling (zero mean, unit variance) (independent)\n' + '============================================================\n' + ) + +# ========== # +# Downsample # +# ========== # + +def test_downsample_single(): + """Applying downsampling to a single observation sequence""" + assert_equal(down(X), Downsample(**down_kwargs)(X)) + +def test_downsample_multiple(): + """Applying downsampling to multiple observation sequences""" + assert_all_equal(down(Xs), Downsample(**down_kwargs)(Xs)) + +def test_downsample_summary(capsys): + """Summary of a downsampling transformation""" + down.summary() + assert capsys.readouterr().out == ( + ' Preprocessing summary: \n' + '========================================\n' + '1. Downsample\n' + ' Decimation downsampling with factor 3\n' + '========================================\n' + ) + +# ====== # +# Filter # +# ====== # + +def test_filter_single(): + """Applying filtering to a single observation sequence""" + assert_equal(filt(X), Filter(**filt_kwargs)(X)) + +def test_filter_multiple(): + """Applying filtering to multiple observation sequences""" + assert_all_equal(filt(Xs), Filter(**filt_kwargs)(Xs)) + +def test_filter_summary(capsys): + """Summary of a filtering transformation""" + filt.summary() + assert capsys.readouterr().out == ( + ' Preprocessing summary: \n' + '======================================\n' + '1. Filter\n' + ' Median filtering with window-size 3\n' + '======================================\n' + ) + +# ======================== # +# Combined transformations # +# ======================== # + +combined = Preprocess([ + Equalize(), + TrimZeros(), + MinMaxScale(**min_max_scale_kwargs), + Center(), + Standardize(), + Filter(**filt_kwargs), + Downsample(**down_kwargs) +]) + +def test_combined_single(): + """Applying combined transformations to a single observation sequence""" + X_pre = X + X_pre = Equalize()(X_pre) + X_pre = TrimZeros()(X_pre) + X_pre = MinMaxScale(**min_max_scale_kwargs)(X_pre) + X_pre = Center()(X_pre) + X_pre = Standardize()(X_pre) + X_pre = Filter(**filt_kwargs)(X_pre) + X_pre = Downsample(**down_kwargs)(X_pre) + assert_equal(combined(X), X_pre) + +def test_combined_multiple(): + """Applying combined transformations to multiple observation sequences""" + Xs_pre = Xs + Xs_pre = Equalize()(Xs_pre) + Xs_pre = TrimZeros()(Xs_pre) + Xs_pre = MinMaxScale(**min_max_scale_kwargs)(Xs_pre) + Xs_pre = Center()(Xs_pre) + Xs_pre = Standardize()(Xs_pre) + Xs_pre = Filter(**filt_kwargs)(Xs_pre) + Xs_pre = Downsample(**down_kwargs)(Xs_pre) + assert_all_equal(combined(Xs), Xs_pre) + +def test_combined_summary(capsys): + """Summary with combined transformations applied""" + combined.summary() + assert capsys.readouterr().out == ( + ' Preprocessing summary: \n' + '============================================================\n' + '1. Equalize\n' + ' Equalize sequence lengths\n' + '------------------------------------------------------------\n' + '2. TrimZeros\n' + ' Remove zero-observations\n' + '------------------------------------------------------------\n' + '3. MinMaxScale\n' + ' Min-max scaling into range (-5, 5)\n' + '------------------------------------------------------------\n' + '4. Center\n' + ' Centering around mean (zero mean) (independent)\n' + '------------------------------------------------------------\n' + '5. Standardize\n' + ' Standard scaling (zero mean, unit variance) (independent)\n' + '------------------------------------------------------------\n' + '6. Filter\n' + ' Median filtering with window-size 3\n' + '------------------------------------------------------------\n' + '7. Downsample\n' + ' Decimation downsampling with factor 3\n' + '============================================================\n' + ) + +def test_empty_summary(): + """Summary without any transformations applied""" + with pytest.raises(RuntimeError) as e: + Preprocess([]).summary() + assert str(e.value) == 'At least one preprocessing transformation is required' \ No newline at end of file diff --git a/lib/test/lib/preprocessing/test_transforms.py b/lib/test/lib/preprocessing/test_transforms.py new file mode 100644 index 00000000..74096a25 --- /dev/null +++ b/lib/test/lib/preprocessing/test_transforms.py @@ -0,0 +1,869 @@ +import pytest +import numpy as np +from sequentia.preprocessing.transforms import * +from ...support import assert_equal, assert_all_equal + +# Set seed for reproducible randomness +seed = 0 +np.random.seed(seed) +rng = np.random.RandomState(seed) + +# Sample data +X_even = rng.random((6, 2)) +X_odd = rng.random((7, 2)) +Xs = [i * rng.random((3 * i, 2)) for i in range(1, 4)] + +# Zero-padded sample data +zeros = np.zeros((3, 2)) +X_padded = np.vstack((zeros, X_even, zeros)) +Xs_padded = [np.vstack((zeros, x, zeros)) for x in Xs] + +# ======== # +# Equalize # +# ======== # + +def test_equalize_single_odd(): + """Equalize a single odd-length observation sequence""" + assert_equal(Equalize()(X_odd), np.array([ + [0.56804456, 0.92559664], + [0.07103606, 0.0871293 ], + [0.0202184 , 0.83261985], + [0.77815675, 0.87001215], + [0.97861834, 0.79915856], + [0.46147936, 0.78052918], + [0.11827443, 0.63992102] + ])) + +def test_equalize_single_even(): + """Equalize a single even-length observation sequence""" + assert_equal(Equalize()(X_even), np.array([ + [0.5488135 , 0.71518937], + [0.60276338, 0.54488318], + [0.4236548 , 0.64589411], + [0.43758721, 0.891773 ], + [0.96366276, 0.38344152], + [0.79172504, 0.52889492] + ])) + +def test_equalize_multiple(): + """Equalize multiple observation sequences""" + assert_all_equal(Equalize()(Xs), [ + np.array([ + [0.14335329, 0.94466892], + [0.52184832, 0.41466194], + [0.26455561, 0.77423369], + [0. , 0. ], + [0. , 0. ], + [0. , 0. ], + [0. , 0. ], + [0. , 0. ], + [0. , 0. ] + ]), + np.array([ + [0.91230066, 1.1368679 ], + [0.0375796 , 1.23527099], + [1.22419145, 1.23386799], + [1.88749616, 1.3636406 ], + [0.7190158 , 0.87406391], + [1.39526239, 0.12045094], + [0. , 0. ], + [0. , 0. ], + [0. , 0. ] + ]), + np.array([ + [2.00030015, 2.01191361], + [0.63114768, 0.38677889], + [0.94628505, 1.09113231], + [1.71059031, 1.31580454], + [2.96512151, 0.30613443], + [0.62663027, 0.48392855], + [1.95932498, 0.75987481], + [1.39893232, 0.73327678], + [0.47690875, 0.33112542] + ]) + ]) + +def test_equalize_multiple_with_longer(): + """Fit an equalizing transformation and equalize a longer sequence""" + transform = Equalize() + transform.fit(Xs) + assert_equal(transform(rng.random((15, 2))), np.array([ + [0.65632959, 0.13818295], + [0.19658236, 0.36872517], + [0.82099323, 0.09710128], + [0.83794491, 0.09609841], + [0.97645947, 0.4686512 ], + [0.97676109, 0.60484552], + [0.73926358, 0.03918779], + [0.28280696, 0.12019656], + [0.2961402 , 0.11872772] + ])) + +# ========= # +# TrimZeros # +# ========= # + +def test_trim_zeros_single(): + """Trim a single zero-padded observation sequence""" + assert_equal(TrimZeros()(X_padded), np.array([ + [0.5488135 , 0.71518937], + [0.60276338, 0.54488318], + [0.4236548 , 0.64589411], + [0.43758721, 0.891773 ], + [0.96366276, 0.38344152], + [0.79172504, 0.52889492] + ])) + +def test_trim_zeros_multiple(): + """Trim multiple zero-padded observation sequences""" + assert_all_equal(TrimZeros()(Xs_padded), [ + np.array([ + [0.14335329, 0.94466892], + [0.52184832, 0.41466194], + [0.26455561, 0.77423369] + ]), + np.array([ + [0.91230066, 1.1368679 ], + [0.0375796 , 1.23527099], + [1.22419145, 1.23386799], + [1.88749616, 1.3636406 ], + [0.7190158 , 0.87406391], + [1.39526239, 0.12045094] + ]), + np.array([ + [2.00030015, 2.01191361], + [0.63114768, 0.38677889], + [0.94628505, 1.09113231], + [1.71059031, 1.31580454], + [2.96512151, 0.30613443], + [0.62663027, 0.48392855], + [1.95932498, 0.75987481], + [1.39893232, 0.73327678], + [0.47690875, 0.33112542] + ]) + ]) + +# =========== # +# MinMaxScale # +# =========== # + +def test_min_max_scale_single_independent_even_0_1(): + """Min-max scale (independently) a single even-length observation sequence into range [0, 1]""" + assert_equal(MinMaxScale(scale=(0, 1), independent=True)(X_even), np.array([ + [0.23177196, 0.65262109], + [0.33167766, 0.31759132], + [0. , 0.51630207], + [0.02580038, 1. ], + [1. , 0. ], + [0.6816015 , 0.28613888] + ])) + +def test_min_max_scale_single_independent_odd_0_1(): + """Min-max scale (independently) a single odd-length observation sequence into range [0, 1]""" + assert_equal(MinMaxScale(scale=(0, 1), independent=True)(X_odd), np.array([ + [0.57160496, 1. ], + [0.05302344, 0. ], + [0. , 0.88911101], + [0.79083723, 0.93370703], + [1. , 0.84920334], + [0.46041422, 0.82698496], + [0.10231222, 0.65928832] + ])) + +def test_min_max_scale_single_non_independent_even_0_1(): + """Min-max scale (non-independently) a single even-length observation sequence into range [0, 1]""" + assert_equal(MinMaxScale(scale=(0, 1), independent=False)(X_even), np.array([ + [0.23177196, 0.65262109], + [0.33167766, 0.31759132], + [0. , 0.51630207], + [0.02580038, 1. ], + [1. , 0. ], + [0.6816015 , 0.28613888] + ])) + +def test_min_max_scale_single_non_independent_odd_0_1(): + """Min-max scale (non-independently) a single odd-length observation sequence into range [0, 1]""" + assert_equal(MinMaxScale(scale=(0, 1), independent=False)(X_odd), np.array([ + [0.57160496, 1. ], + [0.05302344, 0. ], + [0. , 0.88911101], + [0.79083723, 0.93370703], + [1. , 0.84920334], + [0.46041422, 0.82698496], + [0.10231222, 0.65928832] + ])) + +def test_min_max_scale_multiple_independent_0_1(): + """Min-max scale (independently) multiple observation sequences into range [0, 1]""" + assert_all_equal(MinMaxScale(scale=(0, 1), independent=True)(Xs), [ + np.array([ + [0. , 1. ], + [1. , 0. ], + [0.3202217 , 0.67842833] + ]), + np.array([ + [0.47284352, 0.81758801], + [0. , 0.89674174], + [0.64144074, 0.89561319], + [1. , 1. ], + [0.36836051, 0.60619308], + [0.73391569, 0. ] + ]), + np.array([ + [0.61224322, 1. ], + [0.06198784, 0.0472772 ], + [0.18863994, 0.46019901], + [0.49581032, 0.59191138], + [1. , 0. ], + [0.06017231, 0.10423044], + [0.59577551, 0.26600183], + [0.37055656, 0.25040893], + [0. , 0.01465078] + ]) + ]) + +def test_min_max_scale_multiple_non_independent_0_1(): + """Min-max scale (non-independently) multiple observation sequences into range [0, 1]""" + assert_all_equal(MinMaxScale(scale=(0, 1), independent=False)(Xs), [ + np.array([ + [0.03613055, 0.43575693], + [0.1654182 , 0.15554682], + [0.07753126, 0.3456493 ] + ]), + np.array([ + [0.29879028, 0.53737088], + [0. , 0.58939575], + [0.40532702, 0.58865399], + [0.63190096, 0.65726365], + [0.23276736, 0.39842868], + [0.46376203, 0. ] + ]), + np.array([ + [0.67043294, 1. ], + [0.20275306, 0.14080529], + [0.31039878, 0.51319087], + [0.57147285, 0.63197314], + [1. , 0.09816926], + [0.20120999, 0.19216748], + [0.6564365 , 0.33805788], + [0.46501562, 0.32399573], + [0.15006759, 0.11138178] + ]) + ]) + +def test_min_max_scale_single_independent_even_m5_5(): + """Min-max scale (independently) a single even-length observation sequence into range [-5, 5]""" + assert_equal(MinMaxScale(scale=(-5, 5), independent=True)(X_even), np.array([ + [-2.68228038, 1.52621093], + [-1.6832234 , -1.82408684], + [-5. , 0.16302066], + [-4.74199618, 5. ], + [ 5. , -5. ], + [ 1.81601504, -2.1386112 ] + ])) + +def test_min_max_scale_single_independent_odd_m5_5(): + """Min-max scale (independently) a single odd-length observation sequence into range [-5, 5]""" + assert_equal(MinMaxScale(scale=(-5, 5), independent=True)(X_odd), np.array([ + [ 0.71604962, 5. ], + [-4.46976561, -5. ], + [-5. , 3.89111014], + [ 2.90837226, 4.3370703 ], + [ 5. , 3.4920334 ], + [-0.39585778, 3.26984958], + [-3.97687777, 1.59288318] + ])) + +def test_min_max_scale_single_non_independent_even_m5_5(): + """Min-max scale (non-independently) a single even-length observation sequence into range [-5, 5]""" + assert_equal(MinMaxScale(scale=(-5, 5), independent=False)(X_even), np.array([ + [-2.68228038, 1.52621093], + [-1.6832234 , -1.82408684], + [-5. , 0.16302066], + [-4.74199618, 5. ], + [ 5. , -5. ], + [ 1.81601504, -2.1386112 ] + ])) + +def test_min_max_scale_single_non_independent_odd_m5_5(): + """Min-max scale (non-independently) a single odd-length observation sequence into range [-5, 5]""" + assert_equal(MinMaxScale(scale=(-5, 5), independent=False)(X_odd), np.array([ + [ 0.71604962, 5. ], + [-4.46976561, -5. ], + [-5. , 3.89111014], + [ 2.90837226, 4.3370703 ], + [ 5. , 3.4920334 ], + [-0.39585778, 3.26984958], + [-3.97687777, 1.59288318] + ])) + +def test_min_max_scale_multiple_independent_m5_5(): + """Min-max scale (independently) multiple observation sequences into range [-5, 5]""" + assert_all_equal(MinMaxScale(scale=(-5, 5), independent=True)(Xs), [ + np.array([ + [-5. , 5. ], + [ 5. , -5. ], + [-1.79778296, 1.78428332] + ]), + np.array([ + [-0.27156476, 3.17588009], + [-5. , 3.96741737], + [ 1.4144074 , 3.95613188], + [ 5. , 5. ], + [-1.31639493, 1.06193079], + [ 2.33915693, -5. ] + ]), + np.array([ + [ 1.1224322 , 5. ], + [-4.38012161, -4.52722802], + [-3.11360062, -0.39800995], + [-0.04189682, 0.91911381], + [ 5. , -5. ], + [-4.39827687, -3.95769556], + [ 0.95775509, -2.33998174], + [-1.29443438, -2.49591067], + [-5. , -4.85349222] + ]) + ]) + +def test_min_max_scale_multiple_non_independent_m5_5(): + """Min-max scale (non-independently) multiple observation sequences into range [-5, 5]""" + assert_all_equal(MinMaxScale(scale=(-5, 5), independent=False)(Xs), [ + np.array([ + [-4.63869454, -0.64243065], + [-3.34581798, -3.44453183], + [-4.22468741, -1.543507 ] + ]), + np.array([ + [-2.01209722, 0.37370879], + [-5. , 0.89395747], + [-0.94672978, 0.88653993], + [ 1.31900964, 1.5726365 ], + [-2.67232641, -1.01571325], + [-0.36237966, -5. ] + ]), + np.array([ + [ 1.70432945, 5. ], + [-2.9724694 , -3.5919471 ], + [-1.89601215, 0.13190869], + [ 0.71472846, 1.31973138], + [ 5. , -4.01830741], + [-2.98790014, -3.07832522], + [ 1.56436503, -1.61942117], + [-0.3498438 , -1.76004267], + [-3.49932413, -3.88618219] + ]) + ]) + +# ====== # +# Center # +# ====== # + +def test_center_single_independent_even(): + """Center (independently) a single even-length observation sequence""" + assert_equal(Center(independent=True)(X_even), np.array([ + [-0.07922094, 0.09684335 ], + [-0.02527107, -0.07346283], + [-0.20437965, 0.0275481 ], + [-0.19044724, 0.27342698 ], + [0.33562831 , -0.2349045 ], + [0.16369059 , -0.0894511 ] + ])) + +def test_center_single_independent_odd(): + """Center (independently) a single odd-length observation sequence""" + assert_equal(Center(independent=True)(X_odd), np.array([ + [0.14006915 , 0.2206014 ], + [-0.35693936, -0.61786594], + [-0.40775702, 0.1276246 ], + [0.35018134 , 0.16501691 ], + [0.55064293 , 0.09416332 ], + [0.03350395 , 0.07553393 ], + [-0.30970099, -0.06507422] + ])) + +def test_center_single_non_independent_even(): + """Center (non-independently) a single even-length observation sequence""" + assert_equal(Center(independent=False)(X_even), np.array([ + [-0.07922094, 0.09684335 ], + [-0.02527107, -0.07346283], + [-0.20437965, 0.0275481 ], + [-0.19044724, 0.27342698 ], + [0.33562831 , -0.2349045 ], + [0.16369059 , -0.0894511 ] + ])) + +def test_center_single_non_independent_odd(): + """Center (non-independently) a single odd-length observation sequence""" + assert_equal(Center(independent=False)(X_odd), np.array([ + [0.14006915 , 0.2206014 ], + [-0.35693936, -0.61786594], + [-0.40775702, 0.1276246 ], + [0.35018134 , 0.16501691 ], + [0.55064293 , 0.09416332 ], + [0.03350395 , 0.07553393 ], + [-0.30970099, -0.06507422] + ])) + +def test_center_multiple_independent(): + """Center (independently) multiple observation sequences""" + assert_all_equal(Center(independent=True)(Xs), [ + np.array([ + [-0.16656579, 0.23348073 ], + [0.21192925 , -0.29652624], + [-0.04536346, 0.06304551 ] + ]), + np.array([ + [-0.11700701, 0.14284084 ], + [-0.99172808, 0.24124394 ], + [0.19488377 , 0.23984094 ], + [0.85818848 , 0.36961354 ], + [-0.31029188, -0.11996315], + [0.36595472 , -0.87357611] + ]), + np.array([ + [0.58749559 , 1.18747257 ], + [-0.78165687, -0.43766215], + [-0.46651951, 0.26669127 ], + [0.29778575 , 0.4913635 ], + [1.55231696 , -0.51830661], + [-0.78617429, -0.34051249], + [0.54652042 , -0.06456623], + [-0.01387224, -0.09116426], + [-0.93589581, -0.49331562] + ]) + ]) + +def test_center_multiple_non_independent(): + """Center (non-independently) multiple observation sequences""" + assert_all_equal(Center(independent=False)(Xs), [ + np.array([ + [-0.95780473, 0.08257468], + [-0.5793097 , -0.44743229], + [-0.8366024 , -0.08786055] + ]), + np.array([ + [-0.18885735, 0.27477366], + [-1.06357842, 0.37317676], + [ 0.12303343, 0.37177376], + [ 0.78633814, 0.50154636], + [-0.38214222, 0.01196967], + [ 0.29410437, -0.74164329] + ]), + np.array([ + [ 0.89914213, 1.14981937], + [-0.47001033, -0.47531534], + [-0.15487296, 0.22903808], + [ 0.60943229, 0.45371031], + [ 1.8639635 , -0.5559598 ], + [-0.47452775, -0.37816568], + [ 0.85816696, -0.10221943], + [ 0.2977743 , -0.12881746], + [-0.62424927, -0.53096881] + ]) + ]) + +# =========== # +# Standardize # +# =========== # + +def test_standardize_single_independent_even(): + """Standardize (independently) a single even-length observation sequence""" + assert_equal(Standardize(independent=True)(X_even), np.array([ + [-0.40964472, 0.60551094], + [-0.13067455, -0.45932478], + [-1.05682966, 0.17224387], + [-0.98478635, 1.70959629], + [ 1.73550526, -1.46873528], + [ 0.84643002, -0.55929105] + ])) + +def test_standardize_single_independent_odd(): + """Standardize (independently) a single odd-length observation sequence""" + assert_equal(Standardize(independent=True)(X_odd), np.array([ + [ 0.40527155, 0.83146609], + [-1.03275681, -2.32879115], + [-1.17979099, 0.48102837], + [ 1.01320338, 0.62196325], + [ 1.59321247, 0.35490986], + [ 0.09693924, 0.28469405], + [-0.89607884, -0.24527047] + ])) + +def test_standardize_single_non_independent_even(): + """Standardize (non-independently) a single even-length observation sequence""" + assert_equal(Standardize(independent=False)(X_even), np.array([ + [-0.40964472, 0.60551094], + [-0.13067455, -0.45932478], + [-1.05682966, 0.17224387], + [-0.98478635, 1.70959629], + [ 1.73550526, -1.46873528], + [ 0.84643002, -0.55929105] + ])) + +def test_standardize_single_non_independent_odd(): + """Standardize (non-independently) a single odd-length observation sequence""" + assert_equal(Standardize(independent=False)(X_odd), np.array([ + [ 0.40527155, 0.83146609], + [-1.03275681, -2.32879115], + [-1.17979099, 0.48102837], + [ 1.01320338, 0.62196325], + [ 1.59321247, 0.35490986], + [ 0.09693924, 0.28469405], + [-0.89607884, -0.24527047] + ])) + +def test_standardize_multiple_independent(): + """Standardize (independently) multiple observation sequences""" + assert_all_equal(Standardize(independent=True)(Xs), [ + np.array([ + [-1.05545468, 1.05686059], + [ 1.34290313, -1.34223879], + [-0.28744845, 0.2853782 ] + ]), + np.array([ + [-0.20256659, 0.34141162], + [-1.71691396, 0.57661018], + [ 0.33738952, 0.57325679], + [ 1.4857256 , 0.88343331], + [-0.53718803, -0.28673041], + [ 0.63355347, -2.08798149] + ]), + np.array([ + [ 0.75393018, 2.22884906], + [-1.0030964 , -0.82147823], + [-0.59868217, 0.50057122], + [ 0.38214698, 0.922274 ], + [ 1.99208067, -0.97284537], + [-1.00889357, -0.63913134], + [ 0.70134695, -0.12118881], + [-0.01780218, -0.17111248], + [-1.20103046, -0.92593806] + ]) + ]) + +def test_standardize_multiple_non_independent(): + """Standardize (non-independently) multiple observation sequences""" + assert_all_equal(Standardize(independent=False)(Xs), [ + np.array([ + [-1.26465246, 0.17656713], + [-0.76490062, -0.95673193], + [-1.10462107, -0.18786974] + ]), + np.array([ + [-0.24936076, 0.58754082], + [-1.4043124 , 0.7979534 ], + [ 0.16244911, 0.7949534 ], + [ 1.03825387, 1.07244252], + [-0.50456745, 0.02559442], + [ 0.38832531, -1.58583505]]), + np.array([ + [ 1.18719638, 2.45862652], + [-0.6205855 , -1.01635347], + [-0.20448894, 0.4897457 ], + [ 0.80467346, 0.97015602], + [ 2.46111337, -1.18879326], + [-0.62655014, -0.80862107], + [ 1.13309417, -0.21857294], + [ 0.39317096, -0.27544676], + [-0.82423729, -1.13535572] + ]) + ]) + +# ========== # +# Downsample # +# ========== # + +def test_downsample_single_large_factor(): + """Downsample a single observation sequence with a downsample factor that is too large""" + with pytest.raises(ValueError) as e: + Downsample(factor=7)(X_even) + assert str(e.value) == 'Expected downsample factor to be no greater than the number of frames' + +def test_downsample_single_decimate_max(): + """Downsample a single observation sequence with decimation and the maximum downsample factor""" + assert_equal(Downsample(factor=6, method='decimate')(X_even), np.array([ + [0.548814, 0.715189] + ])) + +def test_downsample_single_decimate(): + """Downsample a single observation sequence with decimation""" + assert_equal(Downsample(factor=3, method='decimate')(X_odd), np.array([ + [0.56804456, 0.92559664], + [0.77815675, 0.87001215], + [0.11827443, 0.63992102] + ])) + +def test_downsample_single_mean_max(): + """Downsample a single observation sequence with mean downsamping and the maximum downsample factor""" + assert_equal(Downsample(factor=6, method='mean')(X_even), np.array([ + [0.62803445, 0.61834602] + ])) + +def test_downsample_single_mean(): + """Downsample a single observation sequence with mean downsampling""" + assert_equal(Downsample(factor=3, method='mean')(X_odd), np.array([ + [0.21976634, 0.61511526], + [0.73941815, 0.81656663], + [0.11827443, 0.63992102] + ])) + +def test_downsample_multiple_large_factor(): + """Downsample multiple observation sequences with a downsample factor that is too large""" + with pytest.raises(ValueError) as e: + Downsample(factor=4)(Xs) + assert str(e.value) == 'Expected downsample factor to be no greater than the number of frames in the shortest sequence' + +def test_downsample_multiple_decimate_max(): + """Downsample multiple observation sequences with decimation and the maximum downsample factor""" + assert_all_equal(Downsample(factor=3, method='decimate')(Xs), [ + np.array([ + [0.14335329, 0.94466892] + ]), + np.array([ + [0.91230066, 1.1368679], + [1.88749616, 1.3636406] + ]), + np.array([ + [2.00030015, 2.01191361], + [1.71059031, 1.31580454], + [1.95932498, 0.75987481] + ]) + ]) + +def test_downsample_multiple_decimate(): + """Downsample multiple observation sequences with decimation""" + assert_all_equal(Downsample(factor=2, method='decimate')(Xs), [ + np.array([ + [0.14335329, 0.94466892], + [0.26455561, 0.77423369] + ]), + np.array([ + [0.91230066, 1.1368679 ], + [1.22419145, 1.23386799], + [0.7190158 , 0.87406391] + ]), + np.array([ + [2.00030015, 2.01191361], + [0.94628505, 1.09113231], + [2.96512151, 0.30613443], + [1.95932498, 0.75987481], + [0.47690875, 0.33112542] + ]) + ]) + +def test_downsample_multiple_mean_max(): + """Downsample multiple observation sequences with mean downsampling and the maximum downsample factor""" + assert_all_equal(Downsample(factor=3, method='mean')(Xs), [ + np.array([ + [0.30991907, 0.71118818] + ]), + np.array([ + [0.72469057, 1.2020023 ], + [1.33392478, 0.78605182] + ]), + np.array([ + [1.19257763, 1.16327494], + [1.76744736, 0.70195584], + [1.27838868, 0.60809234] + ]) + ]) + +def test_downsample_multiple_mean(): + """Downsample multiple observation sequences with mean downsampling""" + assert_all_equal(Downsample(factor=2, method='mean')(Xs), [ + np.array([ + [0.3326008 , 0.67966543], + [0.26455561, 0.77423369] + ]), + np.array([ + [0.47494013, 1.18606945], + [1.5558438 , 1.2987543 ], + [1.0571391 , 0.49725743] + ]), + np.array([ + [1.31572391, 1.19934625], + [1.32843768, 1.20346843], + [1.79587589, 0.39503149], + [1.67912865, 0.74657579], + [0.47690875, 0.33112542] + ]) + ]) + +# ====== # +# Filter # +# ====== # + +def test_filter_single_large_window(): + """Filter a single observation sequence with a window size that is too large""" + with pytest.raises(ValueError) as e: + Filter(window_size=7)(X_even) + assert str(e.value) == 'Expected window size to be no greater than the number of frames' + +def test_filter_single_median_max(): + """Filter a single observation sequence with median filtering and the maximum window size""" + assert_equal(Filter(window_size=6, method='median')(X_even), np.array([ + [0.49320036, 0.68054174], + [0.5488135 , 0.64589411], + [0.57578844, 0.59538865], + [0.60276338, 0.54488318], + [0.61465612, 0.58739452], + [0.79172504, 0.52889492] + ])) + +def test_filter_single_median(): + """Filter a single observation sequence with median filtering""" + assert_equal(Filter(window_size=3, method='median')(X_odd), np.array([ + [0.31954031, 0.50636297], + [0.07103606, 0.83261985], + [0.07103606, 0.83261985], + [0.77815675, 0.83261985], + [0.77815675, 0.79915856], + [0.46147936, 0.78052918], + [0.28987689, 0.7102251 ] + ])) + +def test_filter_single_mean_max(): + """Filter a single observation sequence with mean filtering and the maximum window size""" + assert_equal(Filter(window_size=6, method='mean')(X_even), np.array([ + [0.50320472, 0.69943492], + [0.59529633, 0.63623624], + [0.62803445, 0.61834602], + [0.64387864, 0.59897735], + [0.65415745, 0.61250089], + [0.73099167, 0.60136981] + ])) + +def test_filter_single_mean(): + """Filter a single observation sequence with mean filtering""" + assert_equal(Filter(window_size=3, method='mean')(X_odd), np.array([ + [0.31954031, 0.50636297], + [0.21976634, 0.61511526], + [0.28980374, 0.5965871 ], + [0.59233116, 0.83393019], + [0.73941815, 0.81656663], + [0.51945738, 0.73986959], + [0.28987689, 0.7102251 ] + ])) + +def test_filter_multiple_large_window(): + """Filter multiple observation sequences with a window size that is too large""" + with pytest.raises(ValueError) as e: + Filter(window_size=4)(Xs) + assert str(e.value) == 'Expected window size to be no greater than the number of frames in the shortest sequence' + +def test_filter_multiple_median_max(): + """Filter multiple observation sequences with median filtering and the maximum window size""" + assert_all_equal(Filter(window_size=3, method='median')(Xs), [ + np.array([ + [0.3326008 , 0.67966543], + [0.26455561, 0.77423369], + [0.39320197, 0.59444781] + ]), + np.array([ + [0.47494013, 1.18606945], + [0.91230066, 1.23386799], + [1.22419145, 1.23527099], + [1.22419145, 1.23386799], + [1.39526239, 0.87406391], + [1.0571391 , 0.49725743] + ]), + np.array([ + [1.31572391, 1.19934625], + [0.94628505, 1.09113231], + [0.94628505, 1.09113231], + [1.71059031, 1.09113231], + [1.71059031, 0.48392855], + [1.95932498, 0.48392855], + [1.39893232, 0.73327678], + [1.39893232, 0.73327678], + [0.93792053, 0.5322011 ] + ]) + ]) + +def test_filter_multiple_median(): + """Filter multiple observation sequences with median filtering""" + assert_all_equal(Filter(window_size=2, method='median')(Xs), [ + np.array([ + [0.3326008 , 0.67966543], + [0.39320197, 0.59444781], + [0.26455561, 0.77423369] + ]), + np.array([ + [0.47494013, 1.18606945], + [0.63088552, 1.23456949], + [1.5558438 , 1.2987543 ], + [1.30325598, 1.11885225], + [1.0571391 , 0.49725743], + [1.39526239, 0.12045094] + ]), + np.array([ + [1.31572391, 1.19934625], + [0.78871637, 0.7389556 ], + [1.32843768, 1.20346843], + [2.33785591, 0.81096949], + [1.79587589, 0.39503149], + [1.29297762, 0.62190168], + [1.67912865, 0.74657579], + [0.93792053, 0.5322011 ], + [0.47690875, 0.33112542] + ]) + ]) + +def test_filter_multiple_mean_max(): + """Filter multiple observation sequences with mean filtering and the maximum window size""" + assert_all_equal(Filter(window_size=3, method='mean')(Xs), [ + np.array([ + [0.3326008 , 0.67966543], + [0.30991907, 0.71118818], + [0.39320197, 0.59444781] + ]), + np.array([ + [0.47494013, 1.18606945], + [0.72469057, 1.2020023 ], + [1.04975573, 1.2775932 ], + [1.27690113, 1.15719083], + [1.33392478, 0.78605182], + [1.0571391 , 0.49725743] + ]), + np.array([ + [1.31572391, 1.19934625], + [1.19257763, 1.16327494], + [1.09600768, 0.93123858], + [1.87399896, 0.9043571 ], + [1.76744736, 0.70195584], + [1.85035892, 0.51664593], + [1.32829585, 0.65902671], + [1.27838868, 0.60809234], + [0.93792053, 0.5322011 ] + ]) + ]) + +def test_filter_multiple_mean(): + """Filter multiple observation sequences with mean filtering""" + assert_all_equal(Filter(window_size=2, method='mean')(Xs), [ + np.array([ + [0.3326008 , 0.67966543], + [0.39320197, 0.59444781], + [0.26455561, 0.77423369] + ]), + np.array([ + [0.47494013, 1.18606945], + [0.63088552, 1.23456949], + [1.5558438 , 1.2987543 ], + [1.30325598, 1.11885225], + [1.0571391 , 0.49725743], + [1.39526239, 0.12045094] + ]), + np.array([ + [1.31572391, 1.19934625], + [0.78871637, 0.7389556 ], + [1.32843768, 1.20346843], + [2.33785591, 0.81096949], + [1.79587589, 0.39503149], + [1.29297762, 0.62190168], + [1.67912865, 0.74657579], + [0.93792053, 0.5322011 ], + [0.47690875, 0.33112542] + ]) + ]) \ No newline at end of file diff --git a/notebooks/2 - Preprocessing (Tutorial).ipynb b/notebooks/2 - Preprocessing (Tutorial).ipynb index b161030c..33281e8d 100644 --- a/notebooks/2 - Preprocessing (Tutorial).ipynb +++ b/notebooks/2 - Preprocessing (Tutorial).ipynb @@ -8,7 +8,7 @@ "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", - "from sequentia.preprocessing import Preprocess, trim_zeros, downsample, center, standardize, fft, filtrate\n", + "from sequentia.preprocessing import *\n", "\n", "seed = 1\n", "np.random.seed(seed)\n", @@ -21,23 +21,22 @@ "source": [ "# Preprocessing\n", "\n", - "This tutorial notebook describes the preprocessing methods offered by Sequentia.\n", + "This tutorial notebook describes **some of** the preprocessing methods offered by Sequentia.\n", "\n", "---\n", "\n", "- [Preprocessing methods](#Preprocessing-methods)\n", - " - [Downsampling (`downsample`)](#Downsampling-%28downsample%29)\n", - " - [Averaging](#Averaging)\n", + " - [Downsampling](#Downsampling)\n", + " - [Mean downsampling](#Mean-downsampling)\n", " - [Decimation](#Decimation)\n", - " - [Zero-trimming (`trim_zeros`)](#Zero-trimming-%28trim_zeros%29)\n", - " - [Centering (`center`)](#Centering-%28center%29)\n", - " - [Standardizing (`standardize`)](#Standardizing-%28standardize%29)\n", - " - [Discrete Fourier Transform (`fft`)](#Discrete-Fourier-Transform-%28fft%29)\n", - " - [Filtering (`filtrate`)](#Filtering-%28filtrate%29)\n", + " - [Zero trimming](#Zero-trimming)\n", + " - [Centering](#Centering)\n", + " - [Standardizing](#Standardizing)\n", + " - [Filtering](#Filtering)\n", " - [Median filtering](#Median-filtering)\n", " - [Mean filtering](#Mean-filtering)\n", "- [Accepted input formats](#Accepted-input-formats)\n", - "- [Combining preprocessing methods (`Preprocess`)](#Combining-preprocessing-methods-%28Preprocess%29)" + "- [Combining preprocessing methods](#Combining-preprocessing-methods)" ] }, { @@ -75,7 +74,7 @@ "f1 = lambda x: (np.sin(x) - np.sin(np.exp(-0.7 * x)))\n", "f2 = lambda x: (np.exp(np.cos(2*x)) * np.cos(x - 5))\n", "# Auxilliary function for downsampling the domain (for plotting)\n", - "d = lambda x, n: downsample(x, n=n, method='decimate')\n", + "d = lambda x, n: Downsample(factor=n, method='decimate')(x)\n", "\n", "# Compute function values evaluated on the provided domain (xs)\n", "F1, F2 = f1(xs), f2(xs)\n", @@ -92,9 +91,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Downsampling (`downsample`)\n", + "### Downsampling\n", "\n", - "_Reduces the number of frames in an observation sequence according to a specified downsample factor and one of two methods: **averaging** and **decimation**._\n", + "_Reduces the number of frames in an observation sequence according to a specified downsample factor and one of two methods: **averaging** (mean) and **decimation**._\n", "\n", "---\n", "\n", @@ -117,22 +116,20 @@ ], "source": [ "print('Original shape: {}'.format(F.shape))\n", - "print('Downsampled shape (n=5): {}'.format(downsample(F, n=5).shape))" + "print('Downsampled shape (n=5): {}'.format(Downsample(factor=5)(F).shape))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### Averaging\n", + "#### Mean downsampling\n", "\n", - "_With a downsample factor of $n$, averaging replaces every group of $n$ consequent observations with a new observation given by mean of those observations – reducing the number of frames by approximately $\\frac{1}{n}$._\n", - "\n", - "$$\\texttt{downsample(sequence, n, method='average')}$$\n", + "_With a downsample factor of $n$, mean downsampling replaces every group of $n$ consequent observations with a new observation given by mean of those observations – reducing the number of frames by approximately $\\frac{1}{n}$._\n", "\n", "---\n", "\n", - "The following plots allow us to see the effects of different downsample factors on the `average` downsampling method:" + "The following plots allow us to see the effects of different downsample factors on the `mean` downsampling method:" ] }, { @@ -142,7 +139,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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rLU3uJzrlHlpjnCIV+YKR/PS3OEQD88hjqT5hId4bZ5xNA/MO37jyS0k1tpl1toa1toG1toGOEvKOlb2icnxGGOaHvFhf2CVW1l8yRhzIc5y5suttblu55EzNh9oaoxpaIwJAwYBX7qcScrAOK8C3wJ+tdY+73YeXzHGVD/UwcAYEwH0IUAfb621D1tr65U+hw4Cplam4sWJeG2OcIhX5gpH09whoGk+4RFemWcczUvzjiN5soDhQf80xiw3xizFWRIbqK2FRgExwOTSNnCvux3IV4wxA4wxW4FuwDfGmB/czlReSg9TGwn8gHMI08fW2hXupvINY8w44BeguTFmqzFmmNuZfKQHMBg4r/Rvc3HpnftAUxv4qfSxdj7OXtSAbC8qAckrc4WjeWbucEggzyGO5KX5xJE8NLc4klfmGUfz5LzDBMhKOREREREREREJYFqBISIiIiIiIiJ+TwUMEREREREREfF7KmCIiIiIiIiIiN9TAUNERERERERE/J4KGCIiIiIiIiLi91TAEBERERERERG/pwKGiIiIiIiIiPg9FTBERERERERExO/9f5onmQZs00YvAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] @@ -155,20 +152,20 @@ ], "source": [ "fig, axs = plt.subplots(2, 2, figsize=(15, 7), sharey=True) \n", - "fig.suptitle(\"Downsampling with the 'average' method\", fontsize=16)\n", + "fig.suptitle(\"Downsampling with the 'mean' method\", fontsize=16)\n", "\n", "axs[0, 0].set_title('Original sequence ({} frames)'.format(len(F)))\n", "axs[0, 0].plot(xs, F)\n", "\n", - "down = downsample(F, n=5, method='average')\n", + "down = Downsample(factor=5, method='mean')(F)\n", "axs[0, 1].set_title('Downsample factor $n=5$ ({} frames)'.format(len(down)))\n", "axs[0, 1].plot(d(xs, n=5), down, '--')\n", "\n", - "down = downsample(F, n=15, method='average')\n", + "down = Downsample(factor=15, method='mean')(F)\n", "axs[1, 0].set_title('Downsample factor $n=15$ ({} frames)'.format(len(down)))\n", "axs[1, 0].plot(d(xs, n=15), down, '--')\n", "\n", - "down = downsample(F, n=25, method='average')\n", + "down = Downsample(factor=25, method='mean')(F)\n", "axs[1, 1].set_title('Downsample factor $n=25$ ({} frames)'.format(len(down)))\n", "axs[1, 1].plot(d(xs, n=25), down, '--')\n", "\n", @@ -194,8 +191,6 @@ "\n", "_With a downsample factor $n$, decimation keeps every $n^\\text{th}$ observation and removes (decimates) the subsequent $n-1$ observations._\n", "\n", - "$$\\texttt{downsample(sequence, n, method='decimate')}$$\n", - "\n", "---\n", "\n", "Once again, we can visualize the effects of the downsample factor by plotting the downsampled sequences." @@ -226,15 +221,15 @@ "axs[0, 0].set_title('Original sequence ({} frames)'.format(len(F)))\n", "axs[0, 0].plot(xs, F)\n", "\n", - "down = downsample(F, n=5, method='decimate')\n", + "down = Downsample(factor=5, method='decimate')(F)\n", "axs[0, 1].set_title('Downsample factor $n=5$ ({} frames)'.format(len(down)))\n", "axs[0, 1].plot(d(xs, n=5), down, '--')\n", "\n", - "down = downsample(F, n=15, method='decimate')\n", + "down = Downsample(factor=15, method='decimate')(F)\n", "axs[1, 0].set_title('Downsample factor $n=15$ ({} frames)'.format(len(down)))\n", "axs[1, 0].plot(d(xs, n=15), down, '--')\n", "\n", - "down = downsample(F, n=25, method='decimate')\n", + "down = Downsample(factor=25, method='decimate')(F)\n", "axs[1, 1].set_title('Downsample factor $n=25$ ({} frames)'.format(len(down)))\n", "axs[1, 1].plot(d(xs, n=25), down, '--')\n", "\n", @@ -280,10 +275,10 @@ "axs[0].legend(fontsize=12)\n", "\n", "axs[1].set_title('Downsampled sequence ($n=15$)', fontsize=16)\n", - "axs[1].plot(d(xs, n=15), downsample(F1, n=15, method='average'), 'C0:', label='F1 (average)')\n", - "axs[1].plot(d(xs, n=15), downsample(F1, n=15, method='decimate'), 'C0--', label='F1 (decimate)')\n", - "axs[1].plot(d(xs, n=15), downsample(F2, n=15, method='average'), 'C1:', label='F2 (average)')\n", - "axs[1].plot(d(xs, n=15), downsample(F2, n=15, method='decimate'), 'C1--', label='F2 (decimate)')\n", + "axs[1].plot(d(xs, n=15), Downsample(factor=15, method='mean')(F1), 'C0:', label='F1 (average)')\n", + "axs[1].plot(d(xs, n=15), Downsample(factor=15, method='decimate')(F1), 'C0--', label='F1 (decimate)')\n", + "axs[1].plot(d(xs, n=15), Downsample(factor=15, method='mean')(F2), 'C1:', label='F2 (average)')\n", + "axs[1].plot(d(xs, n=15), Downsample(factor=15, method='decimate')(F2), 'C1--', label='F2 (decimate)')\n", "axs[1].legend(fontsize=12)\n", "\n", "plt.tight_layout()\n", @@ -301,7 +296,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Zero-trimming (`trim_zeros`)\n", + "### Zero trimming\n", "\n", "_Removes zero-observations from an observation sequence._\n", "\n", @@ -309,13 +304,11 @@ "\n", "_As the algorithms implemented by Sequentia focus on supporting variable-length sequences out of the box, zero padding is not necessary, and can be removed with this method._\n", "\n", - "_**NOTE**: This preprocessing method does not only remove trailing zeros from the start or end of a sequence, but will also remove **any** zero-observations that occur anywhere in the sequence._\n", - "\n", - "$$\\texttt{trim-zeros(sequence)}$$\n", + "_**Note**: This preprocessing method does not only remove trailing zeros from the start or end of a sequence, but will also remove **any** zero-observations that occur anywhere in the sequence._\n", "\n", "---\n", "\n", - "It is clear from the description what zero-trimming does, but lets look at an example:" + "It is clear from the description what zero trimming does, but lets look at an example:" ] }, { @@ -346,7 +339,7 @@ "axs[0].plot(padded_F)\n", "\n", "axs[1].set_title('Zero-trimmed sequence', fontsize=16)\n", - "axs[1].plot(trim_zeros(padded_F))\n", + "axs[1].plot(TrimZeros()(padded_F))\n", "\n", "plt.tight_layout()\n", "plt.show()" @@ -356,11 +349,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Centering (`center`)\n", + "### Centering\n", "\n", - "_Centers an observation sequence by independently centering each feature or dimension separately so that they each have zero mean. This is done by subtracting the mean observation of the sequence from each observation._\n", + "*Centers an observation sequence by either*:\n", "\n", - "$$\\texttt{center(sequence)}$$\n", + "- _(default) centering each feature or dimension **independently** for each observation, so that they all have zero mean,_\n", + "- _centering each feature or dimension **collectively** (using a single mean for all observation sequences)_.\n", "\n", "---\n", "\n", @@ -384,7 +378,7 @@ } ], "source": [ - "np.mean(center(F), axis=0)" + "np.mean(Center()(F), axis=0)" ] }, { @@ -416,9 +410,9 @@ "plt.figure(figsize=(20, 5))\n", "plt.title('Observation sequence centering', fontsize=16)\n", "plt.plot(xs, F1, label='F1')\n", - "plt.plot(xs, center(F1), 'C0--', label='F1 (centered)')\n", + "plt.plot(xs, Center()(F1), 'C0--', label='F1 (centered)')\n", "plt.plot(xs, F2, label='F2')\n", - "plt.plot(xs, center(F2), 'C1--', label='F2 (centered)')\n", + "plt.plot(xs, Center()(F2), 'C1--', label='F2 (centered)')\n", "plt.legend(fontsize=12)\n", "plt.show()" ] @@ -427,11 +421,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Standardizing (`standardize`)\n", + "### Standardizing\n", "\n", - "_Standardizes an observation sequence by independently transforming each feature or dimension separately so that they each have zero mean and unit variance._\n", + "*Standardizes an observation sequence by either*:\n", "\n", - "$$\\texttt{standardize(sequence)}$$\n", + "- _(default) transforming each feature or dimension **individually** for each observation sequence so that they each have zero mean and unit variance,_\n", + "- _transforming each feature or dimension **collectively** (using a single mean and standard deviation)._\n", "\n", "---\n", "\n", @@ -453,8 +448,8 @@ } ], "source": [ - "print('Mean: {}'.format(standardize(F).mean(axis=0)))\n", - "print('Deviation: {}'.format(standardize(F).std(axis=0)))" + "print('Mean: {}'.format(Standardize()(F).mean(axis=0)))\n", + "print('Deviation: {}'.format(Standardize()(F).std(axis=0)))" ] }, { @@ -488,9 +483,9 @@ "plt.figure(figsize=(20, 5))\n", "plt.title('Observation sequence standardizing', fontsize=16)\n", "plt.plot(xs, F1, label='F1')\n", - "plt.plot(xs, standardize(F1), 'C0:', label='F1 (standardized)')\n", + "plt.plot(xs, Standardize()(F1), 'C0:', label='F1 (standardized)')\n", "plt.plot(xs, F2, label='F2')\n", - "plt.plot(xs, standardize(F2), 'C1:', label='F2 (standardized)')\n", + "plt.plot(xs, Standardize()(F2), 'C1:', label='F2 (standardized)')\n", "plt.legend(fontsize=12)\n", "plt.show()" ] @@ -499,46 +494,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Discrete Fourier Transform (`fft`)\n", - "\n", - "_Converts the observation sequence into a real-valued, same-length sequence of equally-spaced samples of the discrete-time Fourier transform._\n", - "\n", - "$$\\texttt{fft(sequence)}$$" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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NmAVkGaMGXwwB3u4qmpSwCwiIiIiIiIiIiKRpz96MA+01pYHf64ABgZ/HgqUdFmvNLgsjDHmJmNMjjEmp7q6uh8O56unqjnQIsOlgFlEREREREREREQiSL+e5M9aawH7Ga/zpLV2mrV2WlZWVn8ezldGqEWGejCLiIiIiIiIiIhIBOmPgLmys/VF8P+q4PK9wPAu6w0LLpPPwFqrHswiIiIiIiIiIiISkfojYH4P+H7w5+8D73ZZfq0JOAlo7NJKQz6lpnZvKFhWwCwiIiIiIiIiIiKRJOqzrGyMeQU4E8g0xpQCfwb+BrxmjLkeKAYuD64+C7gQyAfagB/00zEfVjr7LwN41CJDREREREREREREIshnCpittVftZ2hmL+ta4Kd9OSjZp7M9BqiCWURERERERERERCJLv57kT/pf1wpmneRPREREREREREREIokC5ghX2bSvgtmlCmYRERERERERERGJIJ+pRYZ88aqaXCTEOPH6rFpkiIiIiIiIiIiISERRBXOEq2ruIDs5lpgohwJmERERERERERERiSgKmCNcVbOL7OS4QMDs8x3qwxEREREREREREREJUcAc4aqbXWSlxBLjdODx2kN9OCIiIiIiIiIiIiIhCpgjXFVTlxYZPrXIEBERERERERERkcihgDmCtbq8tLp9+1pkqAeziIiIiIiIiIiIRBAFzBGsqtkFQHZyLNFOBy4FzCIiIiIiIiIiIhJBFDBHsKqmDgCyU9QiQ0RERERERERERCKPAuYItq+COY5YpwO313eIj0hERERERERERERkHwXMEayys4K58yR/apEhIiIiIiIiIiIiEUQBcwSrbnYR43SQlhBNTJQDj88e6kMSERERERERERERCVHAHMGqml1kJcdijCHGqQpmERERERERERERiSwKmCNYVXMH2SmxADrJn4iIiIiIiIiIiEScqIPdgDFmIvBql0VjgD8BacCNQHVw+e+ttbMOdn+Hk6omF2OyEgGIVgWziIiIiIiIiIiIRJiDrmC21u601h5rrT0WOB5oA94ODj/YOaZw+bOranaRnRwHBCqYXQqYRUREREREREREJIL0d4uMmUCBtba4n7d72Onw+Ghs95CdHGiRERvlwO31HeKjEhEREREREREREdmnvwPmK4FXulz+mTFmszHmWWNMem9XMMbcZIzJMcbkVFdX97bKYam62QWgHswiIiIiIiIiIiISsfotYDbGxACXAK8HFz0OjAWOBcqBv/d2PWvtk9baadbaaVlZWf11OF96VZ0Bc2eLDKcDj88eykMSERERERERERERCdOfFcwXAOuttZUA1tpKa63PWusHngKm9+O+vvKqmzsAyEreV8Hs81t8foXMIiIiIiIiIiIiEhn6M2C+ii7tMYwxg7uMXQZs7cd9feVVNvVskQHg1on+REREREREREREJEJE9cdGjDGJwLnAj7osvtcYcyxggaJuY/IJqpo7cBgYkBgImKOd+wLm+BjnoTw0EREREREREREREaCfAmZrbSswoNuya/pj24erqiYXWcmxOB0G2FfB7PL5gOhDeGQiIiIiIiIiIiIiAf3ZIkP6UVWzK3SCP4BYp1pkiIiIiIiIiIiISGRRwByhAgFzbOiyejCLiIiIiIiIiIhIpFHAHKGqmztCJ/iDfQGzx2cP1SGJiIiIiIiIiIiIhFHAHIG8Pj+1rW6yurTIiFGLDBEREREREREREYkwCpgjUE2LG2vpvUWGz3eoDktEREREREREREQkjALmCFTV3AGEB8zRwQpmlyqYRUREREREREREJEIoYI5A9W0eADISY0LLdJI/ERERERERERERiTQKmCOQyxNogxEb5Qwti1XALCIiIiIiIiIiIhFGAXMEcvsCIXJn1XLXnzvHRERERERERERERA41BcwRyNNbwBzswexRwCwiIiIiIiIiIiIRQgFzBOpsg9FrBbNaZIiIiIiIiIiIiEiEUMAcgUIBs1MBs4iIiIiIiIiIiEQuBcwRyNVLBXN0MGx2KWAWERERERERERGRCKGAOQKFTvLXpYI5Vif5ExERERERERERkQijgDkC9dqD2akWGSIiIiIiIiIiIhJZFDBHILfXj9NhcDpMaJnDYYhyGAXMIiIiIiIiIiIiEjGi+mtDxpgioBnwAV5r7TRjTAbwKjAKKAIut9bW99c+v6o8Pn9Ye4xOMVEOPGqRISIiIiIiIiIiIhGivyuYz7LWHmutnRa8/DtggbV2PLAgeFk+gdvrD2uP0SkmyqEKZhEREREREREREYkYn3eLjEuB54M/Pw9843Pe31eC27efgNnp0En+REREREREREREJGL0Z8BsgY+MMeuMMTcFlw201pYHf64ABna/kjHmJmNMjjEmp7q6uh8P58vL5e29RUa004FLFcwiIiIiIiIiIiISIfqtBzMww1q71xiTDcwzxuR2HbTWWmOM7X4la+2TwJMA06ZN6zF+ONpfi4xYtcgQERERERERERGRCNJvFczW2r3B/6uAt4HpQKUxZjBA8P+q/trfV5l7PxXM6sEsIiIiIiIiIiIikaRfAmZjTKIxJrnzZ+A8YCvwHvD94GrfB97tj/191Xn214M5Sj2YRUREREREREREJHL0V4uMgcDbxpjObf7HWjvHGLMWeM0Ycz1QDFzeT/v7SjvQSf48CphFREREREREREQkQvRLwGytLQSO6WV5LTCzP/ZxOFGLDBEREREREREREfky6LcezNJ/3F4/0ftrkaGAWURERERERERERCKEAuYI5NpPBXO004FLAbOIiIiIiIiIiIhECAXMEcjt8xOrk/yJiIiIiIiIiIhIhFPAHIE8+znJX6xTLTJEREREREREREQkcihgjkAHOsmfRxXMIiIiIiIiIiIiEiEUMEcgt7f3Cmad5E9EREREREREREQiiQLmCOT2+onurYJZLTJEREREREREREQkgihgjkDu/fRg1kn+REREREREREREJJIoYI4wfr/F47O9BszRTgcen8Xvt4fgyERERERERERERETCKWCOMB5/oEI5dj8VzICqmEVERERERERERCQiKGCOMJ09lmN66cEcq4BZREREREREREREIogC5ggTCpgPUMHsOcgT/c3eUs7l/1qJtWq1ISIiIiIiIiIiIn2ngDnCdFYn9xowO/ungnn+jirWFNXR6vYd1HZERERERERERETk8KaAOcJ0VjBH99IiI9SD+SArmPOrWwBoaHMf1HZERERERERERETk8KaAOcJ8mhYZBxMwW2spqOoMmD193o6IiIiIiIiIiIjIQQfMxpjhxphFxpjtxphtxphfBpffbozZa4zZGPx34cEf7ldfqEVGLxXMnVXNroMImCuaOmhxeQFobFfALCIiIiIiIiIiIn0X1Q/b8AK3WmvXG2OSgXXGmHnBsQettff3wz4OG53VybEHqmA+iB7MeZUtoZ9VwSwiIiIiIiIiIiIH46ADZmttOVAe/LnZGLMDGHqw2z1cHahFRqzz4Ftk5FftC5hVwSwiIiIiIiIiIiIHo197MBtjRgHHAauDi35mjNlsjHnWGJPen/v6qgq1yDhABbPnICqY86tbSIxxAtDQrpP8iYiIiIiI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I+oUmMt/pEn+RERERERERERERII5ZDXTGDPbGLM2yNd5wL+BbsAgYC/w1OEegLX2RWvtMGvtsOTk5MN+AT8X/gJzeAM6mAFSE6KCRGS4iYlQgVlERERERERERESOjENWI621pzRkQ8aYl4CpvofZQKdqw2m+ZVIPf4E5ogEdzOCNydixr6zG851uD3GKyBAREREREREREZEjpEkRGcaYDtUeXgCs9f39M+AyY0ykMaYL0ANY3JR9/dxVHUYGM3gn+sveX4G1FvDGYwDqYBYREREREREREZEjpqnVyCeMMYMAC+wAbgaw1q4zxrwPrAdcwO3WWncT9/WzdjiT/AF0TIimzOmmuNJF6+hwypze0xurDmYRERERERERERE5QppUYLbWXn2QsUeAR5qy/WOJ43AjMhKiAdhTVOEtMDu8HcyxmuRPREREREREREREjpAmRWRI8/FnMEcexiR/QGCiv0CBWREZIiIiIiIiIiIicoSowNxCBCb5O4yIDKheYPZHZKjALCIiIiIiIiIiIkeGCswthD+DObyBERlJcZGEhxqyiyoBKAtM8qcMZhERERERERERETkyVGBuIaoOs4M5JMTQoXV0oIO53FdgjlMHs4iIiIiIiIiIiBwhKjC3EE63B2MgLMQ0+DmpCVGBAnOpLyIjJlIdzCIiIiIiIiIiInJkqMDcQjhdHiJCQzDmcArM1TqYHepgFhERERERERERkSNLBeYWwuHyNDgew69jQjQ5xZW43B7KHC6MgagwdTCLiIiIiIiIiIjIkaECcwvhdHuIbESB2WMht8RBmdNNTHgoIYcRsSEiIiIiIiIiIiLSFCowtxBOl4fw0MN7O1ITogHYU1RBmcNFrOIxRERERERERERE5AhSgbmFqHIffkSGv8Ccvb+CMqdbBWYRERERERERERE5olRgbiH8k/wdjtSEKACyAx3Myl8WERERERERERGRI0cF5hbC2YhJ/mIiwmgTEx6IyIiJUAeziIiIiIiIiIiIHDkqMLcQzkZEZIA3JmNPUQVlThdxisgQERERERERERGRI0gF5hbC0YiIDPAXmCspd7iJiVBEhoiIiIiIiIiIiBw5KjC3EI2JyADoqA5mEREREREREREROUpUkWwhqtyN7WCOosThoqLKrQxmEREREREREREROaKaVJE0xrwH9PI9TACKrLWDjDEZwAZgk29sobX2lqbs6+eusR3MqQnRALg8lthIRWSIiIiIiIiIiIjIkdOkArO19lL/340xTwEHqg1nWmsHNWX7x5KmTPLnF6uIDBERERERERERETmCmqUiaYwxwCXAyc2xvWORs5GT/HWsXmDWJH8iIiIiIiIiIiJyBDXXJH9jgVxr7ZZqy7oYY1YYY+YZY8bW90RjzE3GmKXGmKX5+fnNdDg/PY2NyEiOiyQ81ADqYBYREREREREREZEj65AVTWPMbGPM2iBf51Vb7XLg3WqP9wKdrbWDgbuBd4wxrYJt31r7orV2mLV2WHJyclNey0+a0+UhvBEdzCEhhpTWUQCa5E9ERERERERERESOqENWJK21pxxs3BgTBkwChlZ7jgNw+P6+zBiTCfQEljbpaH/GnG4PkY3oYAZIbR1NVmEFcepgFhERERERERERkSOoOSIyTgE2Wmt3+xcYY5KNMaG+v3cFegDbmmFfP0vW2kZP8gc/5DDHRCqDWURERERERERERI6c5mh5vYya8RgA44A/G2OqAA9wi7W2sBn29bPk8lispVGT/AGk+grM6mAWERERERERERGRI6nJFUlr7eQgyz4EPmzqto8VTpcHoNEdzF2TYwkxkBAT3pyHJSIiIiIiIiIiInJQanltAZpaYD53YCq9U1rRLj6qOQ9LRERERERERERE5KCaI4NZmsjpblqBOSw0hL6prZrzkEREREREREREREQOSQXmFsDfwRzeyAxmERERERERERERkaNBFc0WwN/BHNnIDmYRERERERERERGRo0EVzRYgkMGsDmYRERERERERERH5CVFFswVo6iR/IiIiIiIiIiIiIkeDKpotQFMn+RMRERERERERERE5GsKO9gEI9Gwfz1vXj6BfaqujfSgiIiIiIiIiIiIiDaYCcwvQOjqcMT2SjvZhiIiIiIiIiIiIiBwWZTKIiIiIiIiIiIiISKOowCwiIiIiIiIiIiIijaICs4iIiIiIiIiIiIg0igrMIiIiIiIiIiIiItIoKjCLiIiIiIiIiIiISKOowCwiIiIiIiIiIiIijaICs4iIiIiIiIiIiIg0irHWHu1jCDDG5AM7j/ZxHEVJQMHRPgg55ui6k6NB150cLbr25GjQdSdHi649ORp03cnRomtPjoZj7bpLt9Ym117YogrMxzpjzFJr7bCjfRxybNF1J0eDrjs5WnTtydGg606OFl17cjToupOjRdeeHA267rwUkSEiIiIiIiIiIiIijaICs4iIiIiIiIiIiIg0igrMLcuLR/sA5Jik606OBl13crTo2pOjQdedHC269uRo0HUnR4uuPTkadN2hDGYRERERERERERERaSR1MIuIiIiIiIiIiIhIo6jALCIiIiIiIiIiIiKNogKziIiIiIiIiIiIiDSKCswiIiIiIiIiIiIi0igqMIuIiIiIiIiIiIhIo6jALCIiIiIiIiIiIiKNogKziIiIiIiIiIiIiDSKCswiIiIiIiIiIiIi0igqMIuIiIiIiIiIiIhIo6jALCIiIvIzZ4yZbIyx9XydchSO50/GGHsE9jPIt6/EH3tfTWGMiTXGvGmMyfO9J3872sd0NBlj5tZzre6uts6NxphpxphsY0yZMWatMeZ3xpiIo3nsIiIiIseisKN9ACIiIiJyxFwM7K61bP1ROI7/ADOOwH4GAX8E3gIKj8D+Gut24HLgOmAzsPfoHk6LsBq4udYyR7W/PwB8CbwC7APGAA8Bw/Fe5yIiIiJyhKjALCIiInLsWGmt3Xq0dm6MibTWOqy1u6lb6G7sNsMBl7W2SR3RxphQwFhrXc1xXIepD7DHWvtGc2zMf56bY1tHUYm1duFBxodYa/OrPf7aGGOAB40xXa21237k4xMRERERH0VkiIiIiAgAxphexpiPjTFFxpgKY8xCY8wZtdZ5zRizI8hz5xpj5lZ7fKIv1mCSMeYlY0w+kOsbqxORYYwJM8bcY4zZaIxxGGP2GGOeMsZEVVsnw7fN24wxTxhj9uDtak0IcjyTgVd9D7dUi1nI8I1bY8wjxpg/GGO2A07gOGNMlDHmGV/kQqkxJscY87kxpnft7fu2MdIY87Yxpth3zM/VOuYwY8xDxphMY0ylMabAGDPfGDPGfxzAZKBTtWM88TDejz/5ntPfGDPTGFMKvF/tPZlvjDnDGLPSt40VxpgRvuP6izFmrzGm0Pe+xtY+j0HOaytjzD98r9VhjNlkjPm1r7hb+70/17duge/rLWNMnfeqMWoVl/2W+P7s2Bz7EBEREZGGUQeziIiIyLEj1BhT/d9/1lrrBjDGpALzgRLgDuAA3uiGL4wx51hrpzdyn38HpgNXA1EHWe8tYCLwOPA93q7eh4AM4MJa696Ht5h4ExAKVAbZ3hfAw8D91IwGqR4/MRnYBvwWKAP2AJFAvO+5e4FE4DZggTGmj7U2p9Z+3gTeBSYBo4A/AfvxRnMATAF+7TvmlUArYJhvu1R7zkDgAt+y9Y14Pz4FXsZ7/jzVlncH/go8ApQCTwCf+b7CfOegj2+dPOD31MMYE4L3vA7BG1GxBjgbeBpIBu6t9ZRnganAFUAv377dwLX17aPW/mr/X8V9iE718Xhf++aGbF9EREREmocKzCIiIiLHjo21Hn+HN7sW4G6gDTDKH6NhjJmGN6P5EbxF4sZYbK294WArGGPGApcC11aLiZhtjCkE3jLGDLLWrqz2lFzggoMVG621+caYTN/D+qJBDHCatbai1vLA8fqiM2b69nk58Eytdd+x1vqLybONMSN86/mXjQJmWWufrfacz6sd50JjTAHgqB4JYYx5gMN7P56rtQ+/tsBof2SEr0j8KdDFWuuf4HGmMWYc3kJ8vQVm4Cy818svrLWv+ZbN8nU+/8YY87S1tqDa+t9Ya39Zbb1ewA3GmMkNiDQ5AaiqtexGvPnddRhjBgB3Aq9Ya3MPsW0RERERaUaKyBARERE5dlwAHF/t6/pqY+OAhdULsb7u5neBQcaYVo3c58cNWOcMvBEV//NFN4T5uldnVTu26j5pauayz4wgxWWMMZcYYxYZY4oAF97u5ji8Xbi1fVHr8Rqgc7XHS4CzfHEcY4wxEQ08tsN9P+o7z5tr5RH7P2SYWWu9jUBa9aiLeo7JA7xTa/lbQATeYnp1wc5NJND+IPvwW0XNa/V44JNgKxpjOuAtmmfi/aBERERERI4gdTCLiIiIHDvWHmSSv0RgRZDlOXg7fdsAxY3Y595Dr0I7vAXKsnrG2zZimw1RZzvGmInAe8DrwINAAd6i6jSCR3wU1nrswFtE9fsL3giPq/BGSJQaY/4H/K5Wt29th/t+1HdO9td67DzI8jC8kSP1TXSYCBRaa521ludUG68u2LmBg0el+JVaa5ceaiVjTFvgS7zn5HRrbUkDti0iIiIizUgFZhEREREBbzEwJcjyFMDyQ0GyEm8xuLa2wL4gyxvSabzPt92x9YzvacQ2GyLYdi4DtlprJ/sXGGPCqVs8bdgOrK3Cm4v8uDEmBTgHb2ZxDN5YkPo09P0I7Koxx3eYCoFEY0xErSJzSrXxI8bXxT0T77U31lqbfST3LyIiIiJeisgQEREREYB5wEhjTIZ/gS9/+FJghbXW3y27E2hvjEmutl43gsdHNNQMvF2tra21S4N81S4wN5S/Yzb6MJ4TQ90O3qvxdvY2ibU2x1r7H2A20P8Qqzf0/TiS5uH9/8PFtZZfibcDesGROhBjTAzeCI4ueHO06+vMFxEREZEfmTqYRURERAS8k9dNBr40xvwRb/zCbUBP4Oxq630APIR38r2ngSTgHrxREo1irZ1rjHkXbwbz08BivLEUGXgnlptird3ciE2v9/15uzHmdbyTxq0OEvFQ3QzgfGPMM8BUYBjwS6CoEfvHGPMp3jzh5Xi7jgfjzZx+4RBPbej7cSRNB+YDz/s+YFiH9/25AXj0EJEfze1DvBMB3gnEGmNGVhvLtNbmH8FjERERETmmqcAsIiIiIlhr9xhjxuCNc/g33hzhlcDZ1toZ1dbbaoy5CHgY76Rrm/FOrHZvEw/hKryF3OuA+/B2H+/AG4GQ25gNWmtXGWP+BNwE3Ii3+7aLb7v1eQno5DuOm/FO0jeRhk1WGMw3eDt+b8fbHb0LeAJ45BDH3qD340iy1nqMMWfjzZWegjeaYgfe9/9vR/hwzvD9+VyQsV8Arx25QxERERE5tpnmmYBbRERE/p+9+46P66rTP/4cq1mucrfcSxw7tmM7sdMbpEBIAoTQEsqGpYSyLGxnWX6wgV2WBULZXSAQICRASIHESUgjPXF6bMc9jnuXLctdttpI5/fHM5OZkUa2bCnRKPq8Xy+9ZjRn7syde8+9c+e5Z74DAAAAAEB3Qw1mAAAAAAAAAMAxIWAGAAAAAAAAABwTAmYAAAAAAAAAwDEhYAYAAAAAAAAAHJPCzp6BTIMHD47jxo3r7NkAAAAAAAAAAGRYsGBBVYxxSPPb8ypgHjdunObPn9/ZswEAAAAAAAAAyBBC2JjrdkpkAAAAAAAAAACOCQEzAAAAAAAAAOCYEDADAAAAAAAAAI4JATMAAAAAAAAA4JgQMAMAAAAAAAAAjgkBMwAAAAAAAADgmBAwAwAAAAAAAACOCQEzpJd/Lf3sjM6eCwAAAAAAAABdDAEzpIrFUuUKqamxs+cEAAAAAAAAQBdCwAypZrcvGw517nwAAAAAAAAA6FIK2/sAIYTJkm7PuGmCpG9IKpP0GUk7k7f/W4zxgfY+H94Ah/b4sv6gVNK3c+cFAAAAAAAAQJfR7oA5xviapFmSFEIokLRV0lxJfy3pRzHG69r7HHiDpUYw11VL5MsAAAAAAAAA2qijS2RcIGltjHFjBz8u3kiHkgFzfXXnzgcAAAAAAACALqWjA+YrJd2a8f8XQwhLQgg3hhAG5JoghHBNCGF+CGH+zp07c90Fb6QY0yOY6w927rwAAAAAAAAA6FI6LGAOIRRLeo+kPyZvul7SRLl8RoWkH+SaLsZ4Q4xxToxxzpAhQzpqdtBW9Qelxvr0dQAAAAAAAABoo44cwfwuSQtjjDskKca4I8bYGGNskvRLSad24HOho6RGL0uUyAAAAAAAAABwVDoyYL5KGeUxQgjlGW3vk7SsA58LHeUQATMAAAAAAACAY1PYEQ8SQugt6SJJn824+XshhFmSoqQNzdqQL7JGMFMiAwAAAAAAAEDbdUjAHGM8KGlQs9s+3hGPjTcYI5gBAAAAAAAAHKOOLJGBrugQI5gBAAAAAAAAHBsC5u4uVSKjpB8BMwAAAAAAAICj0iElMtCFHdotlfSXevaT6iiRAQAAAAAAAKDtCJi7u5rdUq8BUmFPajADAAAAAAAAOCoEzN3dod1S6UApBEpkAAAAAAAAADgqBMzdXc1uqdcgqbGBgBkAAAAAAADAUeFH/rq71Ajm4j6UyAAAAAAAAABwVBjB3N3V7JF6DfR1AmYAAAAAAAAAR4GAuTtrbJDq9rtERqKOEhkAAAAAAAAAjgolMrqzmj2+LB0gFfcmYAYAAAAAAABwVAiYu7NDu3zZa9L+ShIAACAASURBVKBU0ldqOCQ1NXbuPAEAAAAAAADoMgiYu7NDu31ZOtAjmCVGMQMAAAAAAABoMwLm7qwmGTD3ImAGAAAAAAAAcPQImLuzrBHMfXydgBkAAAAAAABAGxEwd2dZI5hTAXN1580PAAAAAAAAgC6FgLk7O7RbKiiRinpRIgMAAAAAAADAUSNg7s5qdnv0cgiMYAYAAAAAAABw1AiYu7NDe1x/WcoYwUzADAAAAAAAAKBtCJi7s9QIZokSGQAAAAAAAACOGgFzd3Zot1Q6wNdLUiUyCJgBAAAAAAAAtE1hRz1QCGGDpAOSGiUlYoxzQggDJd0uaZykDZI+FGPc01HPiXaq2S31GuTrRZTIAAAAAAAAAHB0OnoE89tjjLNijHOS//+rpMdijJMkPZb8H/kgRo9gTpXIKCyWCoqlOgJmAAAAAAAAAG3zRpfIeK+km5PXb5Z0+Rv8fGir2n1SbEz/yJ/kOsyUyAAAAAAAAADQRh0ZMEdJD4cQFoQQrkneNizGWJG8vl3SsOYThRCuCSHMDyHM37lzZwfODg6rZrcve2UGzH0ImAEAAAAAAAC0WYfVYJZ0doxxawhhqKRHQggrMxtjjDGEEJtPFGO8QdINkjRnzpwW7XiDHEqWwi5tHjBTIgMAAAAAAABA23TYCOYY49bkZaWkuZJOlbQjhFAuScnLyo56PrRTzhHMlMgAAAAAAAAA0HYdEjCHEHqHEPqmrkt6h6Rlku6VdHXybldLuqcjng8d4FAyYG5Rg5kRzAAAAAAAAADapqNKZAyTNDeEkHrMP8QYHwohvCzpjhDCpyRtlPShDno+tFdrNZgP7eqc+QEAAAAAAADQ5XRIwBxjXCdpZo7bd0m6oCOeAx3s0G5JQerZP30bI5gBAAAAAAAAHIUOq8GMLqZmt1RaJvUoSN9W0ocazAAAAAAAAADajIC5uzq0O7v+ssSP/AEAAAAAAAA4KgTM3VXN7uz6y5JrMDcckpoaO2eeAAAAAAAAAHQpBMzd1aFdUq9B2bcV9/Ylo5gBAAAAAAAAtAEB81tBU5O0Z8PRTXNoT44SGX18ScAMAAAAAAAAoA0ImN8Klt0p/d9sqbqy7dO0ViJDImAGAAAAAAAA0CYEzG8FFYukpoS0b0vb7t9Q61rLpQOyb3+9RMaBjp0/AAAAAAAAAG9JBMxvBVWrfHmwqm33r9ntyxYjmKnBDAAAAAAAAKDtCJjfCl4PmHe27f6HkgEzNZgBAAAAAAAAtAMBc1fXUCvt2ejrbQ2YWxvBXJIKmKs7Zt4AAAAAAAAAvKURMHd1u9dKir7e7hHMlMgAAAAAAAAA0HYEzF1d1erkldD+EcypgLmOEcwAAAAAAAAAjoyAuatLBcxDTziKEcy7fNl8BHMRI5gBAAAAAAAAtB0Bc1dXtUrqP0YqG9P2gHnvJqn3EKmoZ/bthcVSQTE1mAEAAAAAAAC0CQFzV1e1Shp8nNR7sHSwqm3T7ForDZyYu624DyOYAQAAAAAAALQJAXNXFqNLZAw+3iOSD+70bUeya4006LjcbQTMAAAAAAAAANqIgLkr279NajgoDZ4k9R4qNSWk2r2Hn6Z2v1S9QxrU2gjm3lL9gY6fVwAAAAAAAABvOQTMXVnVKl+mRjBLRy6TsXudL1sdwdz76Ecwr58nvXrf0U0DAAAAAAAAoMsr7OwZQDtUrfbl4OOlpkZfP7jTI5pbs2uNL1sbwVxyDCUynvi2dGC7dMJlRzcdAAAAAAAAgC6t3SOYQwijQwhPhBBWhBCWhxC+nLz92hDC1hDCouTfJe2fXWTZtVoq6Sf1GZYewVxdeYRp1vpy4ITc7UdbgzlGqXKFy3W0pf4zAAAAAAAAgLeMjhjBnJD0jzHGhSGEvpIWhBAeSbb9KMZ4XQc8B3KpWuXRyiFklMjYefhpdq2R+o+Wikpztxf3luqr2z4PByqk2n3J566S+gxp+7QAAAAAAAAAurR2j2COMVbEGBcmrx+Q9Kqkke19XLRB1WqXx5CkXoN8ecQazGtbL48hOWCuaxYw79kgbXw+9/0rV6Sv79t8+OcGAAAAAAAA8JbSoT/yF0IYJ+kkSS8mb/piCGFJCOHGEMKAjnyubq/ugLR/a/rH+goKpdKBhx/BHKNHMA88QsDcvETGo9dKf/iw1NTU8v6Vr6av79/a5tkHAAAAAAAA0PV1WMAcQugj6U5Jfxdj3C/pekkTJc2SVCHpB61Md00IYX4IYf7OnUco74C01I/1pUYwSy6TcbiA+dAul7NIhdK5FPeVEjXpHw2UpG2LpLp96efMVPmqVNTL1/cRMAMAAAAAAADdSYcEzCGEIjlcviXGeJckxRh3xBgbY4xNkn4p6dRc08YYb4gxzokxzhkyhPq9bVa12pctAubDlMhIBcSHDZh7+zI1irl2n7Rnva9vXdDy/pUrpNGnSoU9KZEBAAAAAAAAdDPtDphDCEHSryW9GmP8Ycbt5Rl3e5+kZe19LmSoWiWFAmng+PRtvQcffgTzrrW+PFINZikdMG9fmm5rHjA3NUmVK6Wh06R+IymRAQAAAAAAAHQzhR3wGGdJ+rikpSGERcnb/k3SVSGEWZKipA2SPtsBz4WUqlXSgHFSYUn6tj5DpXVPtj7NrjVSj0KpbGzr9ynu48v65A/9VSz25eDJLQPmPetdTmPoCdKOpZTIAAAAAAAAALqZdgfMMcZnJIUcTQ+097FxGFVrsstjSC6RUbtXStRLhcUtp9m1xqF0wWFW++sjmFMB8xKpb7l0/DulF38uJerSoXbqB/6GTpX6j5bWPtGulwQAAAAAAACga+mwH/nDm6ip0WHx4EnZt/ce7MtDu3JPt2vt4esvS1JJagRzskRGxWKpfKY0crbUWC/tyKh0kgqYh0x2iYzq7VJj4uheCwAAAAAAAIAui4C5K9q7SWqsyz2CWZIOVracpqlJ2r1OGniY+stSdg3m+kNS1WvS8BkOmCVp68L0fStXuNxGSR+p/0gpNkkHKo7tNQEAAAAAAADocgiYu6Kq1b5sMYI5FTDn+KG/A9tcL/lwP/AnZddgrlzh0Lh8ptR/lNR7aHYd5spXXR5Dcrsk7dtydK8FAAAAAAAAQJdFwNwVpUpg9BmaffvrAXNVy2l2rfHlkUpkpEYw11Wnf+CvfIYUgjTy5PQI5kS9tGu1f+BPkvolA+b9/NAfAAAAAAAA0F0QMHdFiRpfFpZm356qwZxrBHObA+aMGswVi6XSAf4BP8llMqpWSbX7/HhNiYwRzCN9yQhmAAAAAAAAoNso7OwZwDFI1PmyqGf27SX9pILiVgLmdQ6k+5Yf/rEzazBXLHb95RB828iTJUVp26L0c6RGMJf0lXr2J2AGAAAAAAAAuhFGMHdFDakRzM0C5hBcJqO1EhmDJko9jrDKC4qkghKpdq9rMJfPTLeNONmX2xa6/nIoyK4D3W8UJTIAAAAAAACAboQRzF1RotaXzQNmyWUyWiuRMXx62x6/uLd/zK+xPjtg7jVQGjjBbU1NLrdRWJJu7z+SEcwAAAAAAABAN8II5q4oUetwOVW6IlPvoS0D5sYGac+GI9dfTinu4xBZyg6YJY9i3rrQo5uHTc1u6z+KgBkAAAAAAADoRgiYu6KG2uyRw5lylcjYu0mKjdLAiW17/JI+Hr1c1LvlNCNnuwzGnvXpH/hL6TdSqtkt1R9q2/MAAAAAAAAA6NIImLuiRI1/sC+X3oOl6kopxvRtu9b4ss0jmJM/9Df8xJY1m0fOTl9P/cBfSv9Rvty/rW3PAwAAAAAAAKBLI2DuihJ1UlGO+suSRzA31kl1B9K3Va7w5dEGzOUzWraVz/CP+0ktRzCnAuZ9m9v2PAAAAAAAAAC6NALmrqihJvcP/EkOmKXsOswr7/do5N6D2vb4xX182bz+siQVlUrDpvn5B4zLbus30pf7t7bteQAAAAAAAAB0aQTMXVHqR/5yeT1gTtZh3rtJ2vKyNO19bX/810tk5BjBLEmzPiLNvFLqUZB9e78RvtxHwAwAAAAAAAB0B4WdPQM4BolajyTOpfdgX6ZGMC+/25fTrmj745f0kwqKpSFTcref/vnctxeWSH2GHX2JjHk/kMrGSid+4OimAwAAAAAAANCpCJi7ooZaqbhX7rbmJTKWz5VGnCQNHN/2xz/989JxF0qFxUc/b/1GHl2JjB0rpMe+5fk+4d0OqY/W9mV+famR1wAAAAAAAADeFJTI6IoSNVLhkUYwV0m710vbFh5deQxJGjRRmnzxsc1b/5FHVyJj3nVS6OFAfMW9R/9825dJvzhHuuua3O2JOumBf5G2LcrdXr1Tuu2j0rZXWn8OSn4AAAAAAAAAOREwd0WJOqmolRrMhSVSSf9kYJsqj3GUAXN79B8t7dsixZi+rf6Q57m5naukZXdJZ35JGjhReumGo3uuGKWH/lWKTdLK+6T181re55kfSS/9QrrzUx753dzDX/O0d39Bamxo2b74NulHU6UXf5F7HrYukG66TKpanbv90G5pyR+lpsbWX0PNntxtAAAAAAAAQJ4jYO6KGg7zI3+SRzEf3OnwduQcqWzMmzdv/UZKDQel2r3+P1En/epC6fqzHLZmmneda0mf+bfSqZ+RtrzUciRxY4N052dyB7wr75M2zJPe8Z9Sv1HSX/4tO8itWuP6zuUzpV3J65nWPiEtuV0ad45UuUJ64frs9n1bPfo59JAe+Xdp19rs9tr90p8+6Xm489NSoj67valR+uMnpLs+LT39/ZbzH6N0399J1x0vbXqhZbvk133TZS2XXcqqh6Wnr8sO9DPtWC5teDZ3m+QR3KkfhMylMSE1NbXeDgAAAAAAgG6NgLkrStQcPmDuM1TaMl/avkSafhQ/7tcR+o/yZaqsxNPXSZXLpT0bpFuvlBpqfPuutdLSP0qnfMqB+MyrpKLe0ku/yn68J78jLb1DevBfpIW/S9+eqJMe/n/S0KnSaZ+XLrzWr3fxrW6PUbr/711K5CN/lGZc6dHMla+6vaFGuv8fpIETpI/+STr+XdKT/y3t3Zye/t6/lZoapKvv848e3v2F7AD7wX+R9m6Szv57qWKR5zXTU9+T1j8lDZ3mx173ZHb7/BulBTdJoUC646+k/RXZ7Svu9XNsmOf25iOs18+TbvuI9Ph/SI//Z8t1sW2R9Ot3Sje/W3rtwZbtVaul68+QfnZGy/Bc8kj0n54q3XSJVHegZXv1Tuk3l0oPfTV3CF2z16VLFt/Wsk2S6qod3G+Zn7u9oVZ68YbWS5Qk6r2M6g/mbm9M+LFbC8ibmtLrO5cYPfr+cFoL9gEAAAAAALqJNzxgDiFcHEJ4LYSwJoTwr2/083ULiTqP/G1N78HSvk2+PvW9b848pbweMG/x6NlnfijN+LD0/l9Km19y4NjUKM37oUPbM7/k+5eWSTM/7ND54C7ftv5p32/mR6SJF0h//rL02kNue+FnDq3f+W2poFA68QMerf3Yfzi4XHKHp7/w36W+w3y/kr7SvV9ysDjvB9LuddJlP3K5kXd916U2Hkp20YU3S2sfky76ljTuLLdvfkF68eduX/onh9nn/rPD7ZM+5gA7NVp4zWPSU9/1vH/6EWnw8R7lfGC72ze9ID34Fem4i6RPP+p5vuOv0qOgty2S5n7Wr+myHztkfuCf04Fm5auuHT1wgp9j3nXS/N+k10PVGun37/dyHX6iR1JvfC7dvmeDdPN7/Hixydf3bkq379si3XSpVF3p9fb7D2SHzPsrHDxvet7r4t6/zQ7fqys98nrJ7X4dz/0ku58crHLw/eyPfb/mAfih3dJv3ys9+M8eAb99acv2318h3fFx6TeXtAzna/ZIf/ig9KsLpD9e3TKErtkr3XaV9OPpDrmblzCp3Sfd/jHpu+N8EqB5kJwavf6DyV7XzdUdkOZ+XvrFea4Tnqv93i9Jf7hS2r8td/sD/yzd9/d+rhbt1dJfvuaR8blKu9RV+8czF/4udwheVy099X1p9aMt21Ltz/1f67XL66qll3/lftRa+6I/pLflXO0r7m09wK+r9jbSWmmZumrvX1oL+OsPSns25m6T/LyHG7nfUOvnaE1jQ8tvLGRqamLkPwAAAACg2yi49tpr37AHDyEUSHpI0jslfUfS/37zm998+tprr92Z6/433HDDtddc08qPtSHtif+Sxp4pTXhb7vYN81xqYvTp0hl/82bOmaQgPf8TafRpDr8StdJVt0sjT5aK+0gvXu8fH1x6h3TKp6VpGQF4/zGul9xrgDR4svS79zkcvupW15Fe+5hDrSGTXQ5j4gXSef+cfNogDT3Bj19f7XkYNk269IduK+4l9R3ux6/d53IYMz4snflFT19aJvUocB3o0kHSI9+Qxpwuvet7nn7YdI9SXnizNHK2w8PymdLl10s9ekjjz5OW3yW9eq808e0erV02VrryFqm4tzTubM/7lvkuyfHby6U+Q6SP3SUNGCMNmiC98FPp0C5p+EyHr0W9pavvlcaf7ZMKL14v9RroMiQ3Xebn/cR9fh0Vixx+jzjJJx9uukxqqpc+cb80+2rp1T9LC26WJl3kcOymy7ycrv6zNPNKacFvpOV3+4RE7b50WY6/usev54XrHVBPfW8yPL5Uqt4hfXyuS7C88DMH9pMvkfYnw+l9m6UP/15qSri9qcmvfe9GP/7uddK7/9cnQ1643j8QWT7Dt990mVS1yuH9lvke7V0+04H6rrVePpUr3L/XPOoge/w5XsdVq6XfvkeqWOKR68vvklb9RZp0odSzv1S50u3bXpEmni8t/oO05WVp0ju87HYsd7i9Zb40bKoD5n1bfN+CIofdv73cAWivgdJLv3QQOvYsl1PZtkj63eXSxme83l7+le834iT3pa0LPP2Gp/24C2+WBh0nDTnefXHzS+77ax+XKhZLy/4klZ8klY12+8bnHa6vftgnUVb/RRpzRvoHPjc84/ZVD0qvPeDXNu4sqWc/t697Urrl/dLKP3s73LPR+5PUSas1j0q3fFBaMVda+FuHtaNP92uXvCz/8CGfDFpws08UjZzt/ihJK++X/vBhn4B55XdS7yE+yRGCA+FX7/X2sfBmP8aA8dLgSZ42Rq+vW69yf3/tAX9LIXXiKkZPc9tV0rP/I216Tiqf5W1Jch9b9Ae3z7tO2vma9z09+yfbG6VXfu+R/09913145GzvHySPel94k6d/+jrvv0ac5Nr2kred+Td6/p/7X6lHoftlj0K3J+rcH2690pc9y7wfCsll01Dj7fTWj0iLbnV/HTzJy0Zy8P38T32y6dX7pAHjpAFj0/vIumo/752f9rofNMmPkVK7T3rmf6S7P+9+OHSq+15KzR6fCPvzl102aNh0n3hLObjLy+3Br0jV292eeTKzeqe/mfHotd5/DJ0mFRan2w9s93J96ns+cTXkBO9XU/Zt9bc5nv+J+83g49PLRvJJrie+4/1RSX9p4Pj0spG8b3jiOz6B2GdYul+kVK3xN0lW3u/9Up+h2e2VK9PfJhk4XiodkN2+Y7nftza/7Hkr6ZPdXrHYJycrX3V78xO9WxZIz/zY+7jBx2cvmxi9bT/3E+/nB09K95tU+8bnXBYpUevfJchcNjF6nb/8a99eNjZ72TQ1eZ/xSvI9p295s/ZGn1Ba+kepdGB6m0lpTHhfsvI+qc/wlsumscHb49rHXZIqs99I7vuv3udtsmxsy2XTUOttf9sib/OZy0Zy319xj1T1mtsLCrPb66o9/b7NUtm49P4mpXa/T1od2u3fgsh87ZJPKq68z9tg82UjebqV9/t682Uj+YTUqgf9rajmy0aSDuyQ1jzibb75spF8EnTdk94f5hogsHez9+19h6X3N5n2bPR7R98RLZeN5G1j+zKp34jsbS6lao23+VyvXfK+cv9Wb1fN22N0n6/ZnX6fadG+wu8VuZZNjNKOZe6DuZZNU5PbQ2F6X5yrvbBn7m/vNTVKO1b4GDP1PpWpMSHtXOn3gVzLJlHvZVM6IHube729zsu/dEDuZddQ6+Oenv1zt9cf8nFT6j24RftBqWaft9tc6qpdeq61gSV1B6TG+tz9RvK20dSYe9mk2qXs/VHz9lDQcpvLbO9RlPu1p+avoLj19vqDbm9NQ03r8y55/bQ27zH6GDTXen+9vbH11xaj/1qb99RJ7mNtBwCgi/rmN79Zce2117b4EbUQ38CveIcQzpB0bYzxncn/vypJMcbv5Lr/nDlz4vz5rXxdHtbUKH1roPS2f5Pe9pXc93niv/wh/+LvSqd/7k2evybpP4f6g/3+rdL7f+3RxVL6R/le/LlUUCJ9ebHUrzx7+psu86jI4TMcoH36UWnELLdV75RufIc/SPUokv7mRWnQxOzp//RJadmdPhj+7NPS8Onpthgd3K17wh8Uvjg/+8NSol76xTn+IFLcV/rCc9n1q/dXSD873fWli/tKn3/GAVDKlvnSr9/hA92CIukzT6RDQ8nB192f94eQpka/tqEnpNsf+XeP6O07QqrbL33yL+n5b2ryaN3XHvCH94M7pb9+wOGW5A8gN13iD5H9yh30fOI+h2OSP7z++h1STH7AO7BDuvoeh2upef/tex1eN9Y7APn43dKoZPvyudKfPiWNmuPlULtP+tid0uhT3D7vBx4xe/zFDnYbDrr0yOhT/Vr//GWHjTOu9PJP1Ekfud0hft0B6faP+/ZTr3Ht8NgoXXWb2/dtdaC5c6VHvM+/0R8WPnyLNPYMP9+tVzpAOPvvHOAUFEkf/p2D09WPul8UFPmEwtPXSUW9pA/91tMvuEm6/5/8wfyUTzmAKukrffAmnyh58r+lp7/nPnniB12OpHSA9IEbvXwf+Cdp0S0Oz4+7UHri2w4R3v8rB4BzP+uTI1Pf66D1yf92gHPFDf4wf+cnHVzN+aTUa7ADvn6jpCt+4X5812ccqpz9Dy7Z8uz/ul++7+cOPe77O6//C77u9fzSLxzEv/enDswe+Yb75EXf8omIBTc50L70hz4ZNe+HUq9BHuW/5jFpyW2e74u/4xMTC2924HPRtxz+Lp8rDZkinf91v+7XHvDrOv/rfuxUKHzOPzpk3fyCw/ez/8EnGtY+5uDytM86TN250iVqTv1M8lsA89yvZ37Eo6j3b3EJnRkf8rLb/KKX+5RLva7rDni9Hf9Or5ttr7hfjzvbJVYUXed99GnSo9+Udiz19aFTHaAX95bO/Se/5kevdcA15gwHMcvv8rp821cd1D72Le9/xp3j/rT2cZ8Yu+DrDlSf+LZD0vHnep1sW+iQ9YKve109+d/SgW0+IbV/m7Rrtb+lcP7XkjXjr3PoPf48n2A5UOETied9xdvosz/2tjn+XPf72r3SlMtcpmfdE14etXu9vLculBrrvM2d9lmHZy/+3PuWUad63kIP6eSrpZP/ysHjy7+WGg55+VcscmBzyqe9D3/l9z6hkKj1sqtc7qDy9C9Iky/2dvnKLe6jA8Z5OfUbKZ3xRa+Ll34hLb7dy6lvudfrwAnSWV/28z3/s+S+O3j7OrjT/eSsL7v/Pf8TB4yhwCFU7T6vxzO/5HXz3E/c9wqKvX9oOOSTQmf+rXzi86cOAAt7ep/UlHAfOuOLyZOOP3NJo8Ke6cBi+vu97PZt8UmwTc/5vauxzkHjzCu9fCpf9bLdOt/vTU0NDshP/riX75aX/forFnv+Y6P71exPuG+vf8rloSqXe14VHZLO+aQ07XJp9SM+UVW1Kv1+MWhSst9f7O10/o3SnvXp9uEz3D7+PC/XBTenv9kk+aTRnE96n77kDu+f92eUI5p4vjT7r72uF93iv+odbgsF0uR3+bWVjfG0i29135S8jE54t09ulg7wNymW3J7+bYbiPj5pfPLVDnZe+b2/FVSXDLp6lvnE6Ukfc/i06Pc+AVqf/FZBn2Fe9rM+6nl65Rb3jYbkNyLKxnj/MeNDPqG96Bb3/8bkjw0PnizNukqadoWDy8W3+ttRTclvg6T2Pye82+tu8W3uO00Jt485w/N3/Dv9raUlt3lfEJu8/iac5+1uwtt8+5LbfXJA0f1j0kWet9GnS6se8ra3Mfntp8KeXrYnfsjHPivvd/vmF91e0s/zdeIHfBJjxT1edtsWur10oPvM9A/4pO3yu32SMvUtoL7lft3Tk99wWn6X33MrV7h9wLhk+xWe11T7ruQPGQ+Z4vZp7/O+YPlc/6X6XvlMt0293KH9irnS8nvSfW/06Z6/E97t7Wr53V53+7e6X40/x++Vky9xf19xj09cVG/3tj3xfLcfd5G0fbH7/sr7vb8o6uVle8J7vOy3zHf7aw84HC/p733VCe+WxpzpZb7yPq+D2n1+/51yiacfcbK3y5X3+bcu6g/42GzKpdIJl3nftPZxt69+1Mc8A8a7fcplPjZd/bC0MnlSJlHj94Ipl0iTL/XxxqqH/O2tdU+6b5bP8uuecom3gVT7hnk+wTP6NPeNyZf4/WfVQ35tqW+njT3Tbcdf7L762oM+Ibzped9//Hnus8df7Ne76iG3b3nJy27i29123EV+71n9sNu3LvBx63EXevqJ5/s4fdVffJ+KRVLvoT5JP+kivz9VrUq2P+L33P6j3TbpHd5+ti/1tGsedd8bODE5/YXSqFP8nKsf8d+u1d4PHXehH6N8prTpRW+Tax71Nj5iltuPu8iDUDY+6+OZNY+6n406Jdl+gfv4+qd9LLLmcelgpY81J17g9r7lXidrH/df7T6/h0083/cpLfNvuKx93O+7DTV+zRPPTw5EKPbta5/w48Qm98eJ53sZNzW6fd2T0rqnfGJgwtukCW/3ZX11un3DM97mJ7zNf+PPc19f/5TbNz7r/eH489w+7iwfM6faN7/oZZ+adsxpfm9e/7Sfe+t8L/sJ5/k1jDrFJ5vWP+X7bFvkzynjk+3lM73PXP+0/3Ys9/Hf+HP9N3Sqj8E2zHMZv6pVPl4bf6637UHHebvcMM+vsc0znQAAIABJREFUbc9GvweNO8fLuGyMT8Sm2g9s9+eIcWf7Pn2GenDHhnl+7Yd2uz+NO8v36Vnm2zc+5+kbarxux53t46LCErdtfNYn9GJjevqxZ3ldbXzOf5te8Mm8MWd62xp7pt9jNj7vY4FNL/ok9NgzfZ8xp/kk/qYXPP2Wl31sPeYMf9YYdapPNG1KPvbWBe5rqfYRJ/tYf9ML/qtY5M97Y073fcpnSrvXum3ziz6hOGii28ac7sEMO1d6vja/4PU4ZLLbR5/m6zuWe9pNL7gfDJvu5TvmdO+/ti91++YXfSxbPtPTjj7N7yfbFrlty8teNyNO8vSjTvG62brQ+5PNL3tZjDzZbaNP9T5ky/zk38teliNP9nIZdYrXzdYFbtvysreTUXPcNir5WTM17db5PkYbmWwfebI/u26Z77atC71PGzXHfyNO9vHF1gW+T8Ui95VRc/wY5TN9/LJ1gf+2L/E+bdQcf54YfqKP2bcu9Hvt9qUe4DBytp976DQvr20LfZ+dr3o/M+Jktw+Z4uWdmn7XGm93I0/2fQZN9OCobQu9/ezZ4OOUkSd7GZeN8XHmtlc87/u2ersccZL3fX3LfZK14hWvo+pK94dUe6/B3m63LfL0NXv9mkbM8msv6efXVLHYfw0H3V4+y3+FxRntS/z+Uj7D0w6f4eP2iiVebhVL/H/5zGT7iT7Juz057Y5lXtfDZ/oxhk13X0hNv2O5P4OXz/B9hk31/G5f6vbKV71dDT/Rf0OmSIeqku1LvQ30LffjDj/Rx0kHtnl72bHMy7n/KLcNm+5lv3eT27Yv87IfMNbLb9iJvr5ng9t3LPfn7IETku3TvI22doKyGwghLIgxzmlx+xscMH9A0sUxxk8n//+4pNNijF/MuM81kq6RpDFjxszeuPEwX2uGP2z91wiHPWd9Ofd9lv7JX7//0sLs0W1vlh+f6I110jsdIjYfRfXQV73B5hpdveJeB6mS9I5vp0cYp6RKO8z6iPS2HBVX9m6Srj9bOvXT0gXfaNm+e71Hl57/9XTwnWnjcy4tccl10kkfbdm+9E8u8/G+n/sDYnNPfc8hU2awnumev/GH6Q/9Tpr6nuy2pkbplg/4oPSqW/1BIlNdtXTjxT4Y/+gdPljOdGC7y0lU73D4O/7c7PbKldKN7/Sb8Mfu8gFNpg3P+LUXFGeHyynL7vLIyZ793J4K/lOe/6lHlvce6pHNzcP9h/+fQ6J+I/38Q6ek2xP10j1fSI5oHSd99E5p8HHp9tr9HtW57gm/WXzkDo9AzHztt17pN99h0738Mk8OVK32qNrda31A8KHf+WApZfNLDrmrt/tA8YO/yd52XntImnuNP2hMeLt0xS+zR7m98nuH1Ikah6WX/yw9crSpyaNOH/uWD2anvld69/+kR3ol6qXHv+UwVXLg9K7vpkfd1h2QHvxXhyySQ6l3/Gd6JFh1ZbJ8zAP+/7TPue+nRkPtXu9+t/FZB4pn/q0D09RoqIrFbt++1AdsZ/+9dM4/uXSM5A8Rf/6yD44KSlwW5qwv+4AjRn+Af/Bf/IG0qJe3y9O/4A+0TU0Onx75RvrEzPlfk075jA/cE/Ueqfzkd31A07PM8z77Ew4J6w/6hMBz/+fwp/cQ6YJ/d7DUo4c/XDz+nx7xGpscAFx4rU8E9OjhD5aPXut+JblPXPQthx8hSDtXuV+u/ovbB050+5RL3b5lgds3JT/ADznB7ZMucvvaJ/zati9x+/AZfv6J5/v/Ffe4RvquNf5/1Cme//Hn+IBr8R8cOqeCvbFnS+f/P2+bDTUOfJ/5YTq4m3i+9Pav+aA39U2M53+aDuaOf5eX/4hZPon07P9I83/tIEhycHLeV7xt7tngkwuLbvHBYujh0Omcf/K2uWO5l/3yuXIwVuhQ7ey/9+jbzS87EF+VLFtUUOz9cioQXvu4H3/jM24v7Okg+4wv+uBu5X1ur0iWYSnu4/V++ue9D1l6h+c/FaqW9Jfm/LX7d89+3uae/0m6tE/pAPerUz/jeV3wG48GToWivYf6BNacT3of+NINDmVToWffEdJp1zj0rNnj9ld+nw41y8b4uU/6mA8wX7xeWvLHdGg5cKLbZ12VDpxX3JMOJYec4Hmb8SHvb166wQGMksdgw0/0/E293MHAy79MhpJJI+c4zJ78Li/zl37pD1IpY86Q5nzKfWTFXOnlG5OBddL4c/3aR5+e/PbBb7xNS5KCg5XZn3AfXnyrT76k+mXo4ffz2Z/wgfWi3ydL4CS/jNaj0MHWyVf7Q+YrqUB5X7pvnPBu6aSPex/xym/9fpIKhAtLvV886WNeXq/8zvuVxvp035h2ubf7mj1eL6v+4v2p5A9H09/v0HnvZs/fuqfSy7Z0gAPXEz/gDx+LbvUH8JTeQxzoTn2PP4At/oP3iyl9y71Pmfwuh3WLb8sO+/uP9nqdeL6fd8ntHsWeMmCct52xZzkUW/on7y9TBk3y9CNPdii47C4HoilDp3neh071cnn13vQ2L/lD3PQP+HlW3O3HSC3bVN+Z/n6/zuVzPQ+pZZvqO9Ou8HvC8rnJUCxVnig4nJl2efIbJnOTgWZqZGaB+9a0y/1etXyuP6Cn9ChyuDX1Pd4nLZ+b3S8LStz3Jl/ikHr53X6fTiksTQeTla+mR7GnFPdx28Tz/f6/8r70Ni+lQ+WxZ3m7e+1+96GU0gHeb44+xcdAqTA5JRU6D5/h5bLmMb/Pp/QZ7vbBkx1mrn8qe9n2G+n3k/6jHahufC5j2cofTqdc6sEOrz3k8EQZn8sGTnS/K+7j9/jUe03K4Ml+fZKnr3otu33YdIfC9Yc8Ar95WavyWV5+h6q8TWWeZFJwn5x4gd9LVz/s+73e3MPh0ITz/B635tH0Ni+5b4w5wwFc5Qq/XzZklCvrUeS20ad6u9swL/1eJblvjDvb72dbXnawlzoJJLlvjD/H28WmFxxsxYzSVEW9PW+DJnrdNv8R8ZJ+7rv9R3u9pU6ypPQsc9/tPdjrPvU+nlI60IFxcW+/tsx+Kfk9Z+LbvRzXPZHdLyXvVya8za953VPZ27zk+Rp/nt+j1j+dvc1L3t7Hne3tauOz2du85DB3zBneF216Mf1elTJkio9Jqlb7vST1XpUydJo08qRkcLUoe9kqpAOeisUOXzKFHt4vDZni/UHm/lJy3xh5so8VtrzUsl/2KPKxer8RXrcHmpWSKyj2vPca6H6R2S8lH2+MOsXbzabn0+/zKUW93O9CgQPT1Pt8SnEfh6qN9e57mf1S8n5l9Kne521dkN0vJfed0af6PbJiSfY2LzkgGznH29uO5cra5iX3nREneZ/YfNlJ7jvDT3RbrlJ1/Ub5OK7y1WbbdFLZWPeP7UvS7+OZBk7wMU/F4uz9Zcqg4zwP2xZl7y9TBk/2utm2KHt/KUlKfuO4qJefP3N/KbnvDJ3qzwDbl7VcdqHAwV5To4PcrH4pH48Mm+7PD6kTo5kKij19zZ7cy66gxKFmdWXuZVdY6mW7b0vuZVfU24PLdq9v2e8kfw4aNNHfxs217Er6eduuWp1j2cmfDfuP9rpvvuyk5DfUhvm1N9+mJb+n9Rro/VnzZSe57xX3zh6wkKlvuZdx8/1dSr+RftzMY5ys9lF+XanPNc31H+3P/HX7Wmkf42kz30teFzz9wcqW2+zr7aOcGTTfZiX3vb4jPO/N+53kvtdnWPK1JbfZ4r7Spx52n+mG8jZgzsQI5jY4uEv6/gSXbjjts7nvE6MPRFIB1Zvtpsv8pvI3L7T8CvORNCb8w3MDJ0hX3pr7rNDhvq4m+U2lta8atmX6htp0uJZL7f7Wv+oYo3c8/Ubkbm9q9Bta85HXrz93jQOTIZNzt9fs9VnU1nZkB3Z4x9ta++71fkNq7fF3LPeBWWvztyU56jtz5Ham9U973eVa7zH6A0r5zNwnPpqaXLZh7NlS70Et2xsbHNgcd6FHkDRXf8gfPqdc1vKr7ZIPJl57yKOrcq3fAzv8IWD6+3N/HXPPBn9Anf7+3F+3rFzpD87Trsjdv7a94vDjhHfnbt/wrPvu8e9o2SZ5JE9BsT8wNZcqPdFnmEciNNfU5FBp8CQf1DfX2OBQaeRsH3g111DjIHL827KD/5TafR6dOvni7GA/5WCVn3/a+3Kv+31b/MF9ymW5133VGn+AmnZ57v3a9mVevtOvyL3tb5nvg7XW1v36p33AMe19Ldd9jF729dUOwZqv+6Ymhxqhh0OS5vusVL8t6ZcOpjM11HqEaf+R/jDZvL3ugNsHT255UkhyyL7sTq/XkbNbth/Y7tBm/Dm51+3eTR4BeNxFudftzlUODqZcml2uI6VicbJ8zuUtv5EiJUfiLPZ20bz0QIz+YF+12gFa86/XNzU5/D+w3e3Nv17fmPCyr6/24zf/en2izq9dct9p/hXy+oNedsV9vF02X/c1e93eZ5hDnubr/mCV2weM936p+brfv82B2vATPfqq+brdvc6jM0eflvyw26y9cqVf//hz099GybRtkYOPSRe1XLcxpkciTb4kXYYmpanJZXq2L/Vrb75Pb0w4iNy93v0+84Sc5JNDrz3gD2HTLm9ZjqShxmFo3QFvV5mlWqRkSYt7/EEk13Z9aLfD0sJSz1/zffqBHZ6+10D3zeblA/Zu9j6x/yiPymy+7netdd8ZPNkBZ/N1v2OFl335TG+Xmes+Ru9v1j3hdTfmzOx1H2NyFNuznnbUnJYn2jfMczAx8QI/R2Z7Y4MDqx3LHA42X7cNtX4v3bM+97qtq/ZJiOodbs88GSsly4Xc7+1myqUt368PVnndNSW87Jvvs/dv8/QFRcl9drOyGXs2eORuz/4OX5tv11WrHYL3LffryzyeSpXbWP2wjyWOuzB7nx6jR3mtfcIhxMTzs/fpTY3JEZDPpEdOZpZjaWzwetn8sre5sWdllxxJ1Dnsq1jsUY2jT8te9/WHfPJs50qHgyNOzl73tfu9v9yzPve6PbTbQW71Dm+3Q6dmtx/Y4XVXd8DLpvm63bfF7Y0JHysMnJDdvnudQ/KCQp8USpXWSi27qlV+Pyvp4/bMfXaqlMmax3wyYtJF2dt1U5OX/bonHVAdd0H2dt2YcFi44Vm/l0x4e/axWqLOYd+mF32Sc/y52fv0hhqvt60Lve7GnZ29T6874Pfq7ct8QmDMmdnrvmaP561qdXrUZua6P1jlfrN3g48zR83J3u73b/O6TX2LaMRJ2et+z0aPeq474PbhM9LrPkbvU9Y+7mPsCW9LlscK6fbKFZ6/UOD2IZPT7U1NDtvWP+3XPOHtXrep9sZEemRwr4GePnOfnah3SLzxWQc848/L3mc31CTfD17ydOPPzd6u6w6kR9UOPj45Wjjj/bpmrx+7YonX3dizstf9wSqvu8pXfUJgzBnZ6/7AdrfvWuNgdcxp2et+7yb3m32b0yNeU9t9jN6eNjzjdTP6dK+71D4/1a83zPP2N+YMHw+l9vlNTT423/Cs183YM71dptZ9Y8LLPvObAMNnpPcLiXov+03PORQdc4bXbapvNNR4uW16wa95zJkO1lN9o67a28WW+clj9DOyS6PV7PV62bbQ4diY07PX/cEqr7uKJb59zGnZJbIObPdzV67wuhtzevY+fe9mT1+1yvub0aelt/vUst38kt/ry2f4pFFm2bldazz/+7Z4m0gF+1Iy5F3pxz9Y5f3hqNnpfX5jgz9XbnnZYevI2f5Lvd8n6vy6trzk66Pm+DlSfaP+kE9ubJkvKfq5y2el9wt1B7xutsz3+h45x68h1Tdq9qRHDZf0c/vw6em+cbDK627bIn/2GDk7u/Tb/gpPW7HEy2zkbA8WKCj0stu3xdNXrvBnnxEne7vuUZBetlsXejT5oIl+bYMmuW+klu22hd53DD4+fdKlRw/3y6rXkp8dN7lPjTjJ228I7peVyZM/+yv8uX/ESekSYQ21XvYVrzg7Gj7dy67fCLfXH/Tx37ZFzoxSI5ZTfaN2n193xSKHteWzvF30Heb2Q7vTI55jU3rEcup4oLoyPX1BcXJE8gz3nRi9v92+xPNQ3Nttw0/0NhSjT4xtX+rXUDogOeJ4WvJb4E1etqkRzX2GevqhU/3e1pjwiertS73s+43w9ENP8HMl6r097FjmdVA2xiclhkxx32qo9cmLHcuTI5rH+7mHTPF7Tv1BP29qVPMF38hd/qsb6KyAmRIZHW3fFulH01y7dvbVnT03uVUs8c5o9KnHNn1DjUNOapYBAAAAAAAAeaG1gLmVX0XoMC9LmhRCGC9pq6QrJX3kDX7Ot7ZE8itOrf3YRz4on9G+6fP5tQEAAAAAAAB43RsaMMcYEyGEL0r6i6QCSTfGGJcfYTIcTkOyHk9rvxYNAAAAAAAAAG+SN3oEs2KMD0h64I1+nm4jVbS8kFG+AAAAAAAAADpXjl9QQ15LBcyH+xE6AAAAAAAAAHgTEDB3NQ2pEcwEzAAAAAAAAAA6FwFzV5NI1WAmYAYAAAAAAADQuQiYu5pEnS+LqMEMAAAAAAAAoHMRMHc1DakRzCWdOx8AAAAAAAAAuj0C5q4m9SN/hYxgBgAAAAAAANC5CJi7mlTAXEQNZgAAAAAAAACdi4C5q2lIjWAmYAYAAAAAAADQuQiYu5pEjRQKpIKizp4TAAAAAAAAAN0cAXNXk6iTiqi/DAAAAAAAAKDzETB3NQ01UmFJZ88FAAAAAAAAABAwdzmJWqmQEcwAAAAAAAAAOh8Bc1eTqJWK+IE/AAAAAAAAAJ2PgLmraaiVCgmYAQAAAAAAAHQ+AuauJlFDwAwAAAAAAAAgLxAwdzWJOqmIGswAAAAAAAAAOh8Bc1fTUCMVlnT2XAAAAAAAAAAAAXOXk6AGMwAAAAAAAID8QMDc1SRqKZEBAAAAAAAAIC+0K2AOIXw/hLAyhLAkhDA3hFCWvH1cCKEmhLAo+ffzjpldqKGWEhkAAAAAAAAA8kJ7RzA/Iml6jHGGpFWSvprRtjbGOCv597l2Pg9SEjVSISOYAQAAAAAAAHS+dgXMMcaHY4yJ5L8vSBrV/lnCYSXqpCJqMAMAAAAAAADofB1Zg/mTkh7M+H98COGVEMJTIYRzOvB5uq8YpYYafuQPAAAAAAAAQF4oPNIdQgiPShqeo+lrMcZ7kvf5mqSEpFuSbRWSxsQYd4UQZku6O4QwLca4P8fjXyPpGkkaM2bMsb2K7qKxXlIkYAYAAAAAAACQF44YMMcYLzxcewjhE5Iuk3RBjDEmp6mTVJe8viCEsFbS8ZLm53j8GyTdIElz5syJRzn/3Uui1pdF1GAGAAAAAAAA0PnaVSIjhHCxpH+R9J4Y46GM24eEEAqS1ydImiRpXXueC5IakgFzYUnnzgcAAAAAAAAAqA0jmI/gJ5JKJD0SQpCkF2KMn5N0rqRvhRAaJDVJ+lyMcXc7nwupEcyFjGAGAAAAAAAA0PnaFTDHGI9r5fY7Jd3ZnsdGDglGMAMAAAAAAADIH+0qkYE3WUONL6nBDAAAAAAAACAPEDB3JYk6Xxb27Nz5AAAAAAAAAAARMHctieQIZgJmAAAAAAAAAHmAgLkraUjWYC4iYAYAAAAAAADQ+QiY88GejdIT35H2bDj8/V7/kT9qMAMAAAAAAADofATM+aC6Unrqv6Wq1Ye/3+sBc8kbP08AAAAAAAAAcAQEzPmgtMyXNXsOf7+GZA3mIkYwAwAAAAAAAOh8BMz5oHSAL2v2Hv5+iTpf8iN/AAAAAAAAAPIAAXM+6Nnfl7VHCpiTI5gJmAEAAAAAAADkAQLmfFBQJBX3bUOJjFQNZgJmAAAAAAAAAJ2PgDlflJa1oURGrVRQIvVgtQEAAAAAAADofCSV+aK07MgjmBO1jF4GAAAAAAAAkDcImPNFz7Ij12BuqJGKCJgBAAAAAAAA5AcC5nzRphHMdYxgBgAAAAAAAJA3CJjzRemANtRgriFgBgAAAAAAAJA3CJjzRc82jGBuqKVEBgAAAAAAAIC8QcCcL0oHSI11rrPcmkStVFj65s0TAAAAAAAAABwGAXO+KC3z5eFGMSdqpcKSN2d+AAAAAAAAAOAICJjzRekAXx6uDnNDjVTECGYAAAAAAAAA+YGAOV/0bMsI5jp+5A8AAAAAAABA3mhXwBxCuDaEsDWEsCj5d0lG21dDCGtCCK+FEN7Z/ll9i0uNYK49zAjmRA0BMwAAAAAAAIC8UdgBj/GjGON1mTeEEKZKulLSNEkjJD0aQjg+xtjYAc/31tSWGswNtVIRATMAAAAAAACA/PBGlch4r6TbYox1Mcb1ktZIOvUNeq63hrbUYE7USYXUYAYAAAAAAACQHzoiYP5iCGFJCOHGEEIyJdVISZsz7rMleVsLIYRrQgjzQwjzd+7c2QGz00UV95VCjzaUyCh58+YJAAAAAAAAAA7jiAFzCOHREMKyHH/vlXS9pImSZkmqkPSDo52BGOMNMcY5McY5Q4YMOeoX8JbRo4d/6K+1EhlNjVJjvVTECGYAAAAAAAAA+eGINZhjjBe25YFCCL+UdF/y362SRmc0j0rehsMpLWu9REaizpf8yB8AAAAAAACAPNGuEhkhhPKMf98naVny+r2SrgwhlIQQxkuaJOml9jxXt3C4EcyJWl8SMAMAAAAAAADIE0ccwXwE3wshzJIUJW2Q9FlJijEuDyHcIWmFpISkv4kxNrbzud76Sge0XoO5ocaXRQTMAAAAAAAAAPJDuwLmGOPHD9P2bUnfbs/jdzulZdKe9bnbXh/BTA1mAAAAAAAAAPmhXSUy0MFKBxymBnMqYC558+YHAAAAAAAAAA6DgDmf9CxziYymppZtDcmAuYgRzAAAAAAAAADyAwFzPikdIMUmqf5AyzZ+5A8AAAAAAABAniFgzielZb6s2dOyLZH8kT8CZgAAAAAAAAB5goA5n5QO8GWuOsyvl8ggYAYAAAAAAACQHwiY80nPw41gTpXIoAYzAAAAAAAAgPxAwJxPUiOYa3OMYH49YC558+YHAAAAAAAAAA6DgDmfHK4Gc0OyBnMRI5gBAAAAAAAA5AcC5nxyuBrMiTpf8iN/AAAAAAAAAPIEAXM+KSqVCkpaqcGcHMFMwAwAAAAAAAAgTxAw55vSAblrMDfUSqGHVFD05s8TAAAAAAAAAORAwJxvSstaKZFRKxWWSiG8+fMEAAAAAAAAADkQMOebnmWtlMiolQpL3vz5AQAAAAAAAIBWEDDnm8OVyCgqffPnBwAAAAAAAABaQcCcbw5bIoMf+AMAAAAAAACQPwiY803pAAJmAAAAAAAAAF0CAXO+6Vkm1R+QGhuyb2+okYoImAEAAAAAAADkDwLmfFM6wJe1+7JvT9RJhdRgBgAAAAAAAJA/CJjzTWmZL2v2ZN+eqJEKS978+QEAAAAAAACAVhAw55vUCObmdZgbaqUiRjADAAAAAAAAyB+F7Zk4hHC7pMnJf8sk7Y0xzgohjJP0qqTXkm0vxBg/157n6jZ6tjaCuZYRzAAAAAAAAADySrsC5hjjh1PXQwg/kJRZOHhtjHFWex6/W3q9BnOzEcyJWmowAwAAAAAAAMgr7QqYU0IIQdKHJJ3fEY/XrbVWg7mhRirq+ebPDwAAAAAAAAC0oqNqMJ8jaUeMcXXGbeNDCK+EEJ4KIZzT2oQhhGtCCPNDCPN37tzZQbPThb1eIqP5COY6qZCAGQAAAAAAAED+OOII5hDCo5KG52j6WozxnuT1qyTdmtFWIWlMjHFXCGG2pLtDCNNijPubP0iM8QZJN0jSnDlz4tG+gLecgkKpuG/2COYYpUQNATMAAAAAAACAvHLEgDnGeOHh2kMIhZKukDQ7Y5o6SXXJ6wtCCGslHS9pfrvmtrsoLcuuwdzYIMUmSmQAAAAAAAAAyCsdUSLjQkkrY4xbUjeEEIaEEAqS1ydImiRpXQc8V/dQWpZdIiNR60tGMAMAAAAAAADIIx3xI39XKrs8hiSdK+lbIYQGSU2SPhdj3N0Bz9U99CzLLpFBwAwAAAAAAAAgD7U7YI4xfiLHbXdKurO9j91tlQ6Qqlal/2+o8WVRaefMDwAAAAAAAADk0BElMtDRSpuPYK7zJSOYAQAAAAAAAOQRAuZ8VDrANZhj9P+J5AhmAmYAAAAAAAAAeYSAOR/1LJMa69KlMRqSNZiLCJgBAAAAAAAA5A8C5nxUOsCXtXt9yY/8AQAAAAAAAMhD7f6RP7wBSst8+dz/ST0KpB0r/H8hP/IHAAAAAAAAIH8QMOejgRN8+cLPPGq51yBpzBnSoImdO18AAAAAAAAAkIGAOR+Vz5S+skEqKJGKe3X23AAAAAAAAABATgTM+SpVhxkAAAAAAAAA8hQ/8gcAAAAAAAAAOCYEzAAAAAAAAACAY0LADAAAAAAAAAA4JgTMAAAAAAAAAIBjQsAMAAAAAAAAADgmBMwAAAAAAAAAgGNCwAwAAAAAAAAAOCYhxtjZ8/C6EMJOSRs7ez460WBJVZ09E+h26HfoDPQ7dBb6HjoD/Q6dhb6HzkC/Q2eh76EzdLd+NzbGOKT5jXkVMHd3IYT5McY5nT0f6F7od+gM9Dt0FvoeOgP9Dp2FvofOQL9DZ6HvoTPQ74wSGQAAAAAAAACAY0LADAAAAAAAAAA4JgTM+eWGzp4BdEv0O3QG+h06C30PnYF+h85C30NnoN+hs9D30Bnod6IGMwAAAAAAAADgGDGCGQAAAAAAAABwTAiYAQAAAAAAAADHhIA5D4UQ/jGEEEMIgzt7XtA9hBD+I4SwJISwKITwcAhhRGfPE976QgjfDyGsTPa9uSGEss6eJ3QPIYQPhhCWhxCaQghzOnt+8NYWQrg4hPBaCGFNCOFfO3t+0D2EEG4MIVSGEJZ19ryg+wghjA4hPBFCWJF8n/1yZ88T3vpCCD1DCC+FEBYn+903O3ue0L2EEApCCK+EEO7r7HnpTATMeSaEMFrSOyRt6ux5Qbfy/RjjjBjjLEmdw+d4AAADnklEQVT3SfpGZ88QuoVHJE2PMc6QtErSVzt5ftB9LJN0haSnO3tG8NYWQiiQ9FNJ75I0VdJVIYSpnTtX6CZuknRxZ88Eup2E9P/bu3sQuao4DOPPC0YUPzpFyQqbIgiiGC1CJI1EhaAhi11ABdHSQARBiFtYCak0hYWFdi6KoKL4QYwYsFEJho0frILYZIOSQkRFUNS/xb3FImuiw849y9znBwNzZqZ4i8Nl7ss55/JYVd0A7AIe8ZqnAfwG7Kmqm4EdwN4kuxpn0rgcAlZah2jNgnnzeQZ4HPDpixpMVf20ZngZzj8NoKreq6o/+uHHwFzLPBqPqlqpqq9b59Ao7AS+qapvq+p34GVgoXEmjUBVfQj80DqHxqWqvquqU/37n+kKl61tU2nWVeeXfrilf3k/q0EkmQPuAZ5vnaU1C+ZNJMkCcLaqTrfOovFJ8lSSM8B9uIJZw3sIeLd1CEnaYFuBM2vGq1i2SBqBJPPALcAnbZNoDPojCpaBc8DxqnLeaShH6RaJ/tU6SGsXtQ4wNkneB65Z56tF4Am64zGkDXe+uVdVb1TVIrCY5DBwEHhy0ICaSRead/1vFum2VC4NmU2z7b/MPUmStPGSXA68Cjz6j52S0lRU1Z/Ajv6ZLq8nubGqPINeU5VkH3Cuqj5NcnvrPK1ZMA+squ5c7/MkNwHbgNNJoNsqfirJzqr6fsCImlH/NvfWsQS8gwWzNsCF5l2SB4F9wB1V5VY2bZj/cc2TpukscN2a8Vz/mSTNpCRb6Mrlpap6rXUejUtV/ZjkBN0Z9BbMmrbdwP4kdwOXAFcmebGq7m+cqwmPyNgkqurzqrq6quarap5uC+WtlssaQpLta4YLwFetsmg8kuyl2060v6p+bZ1HkqbgJLA9ybYkFwMHgDcbZ5KkqUi3UuoFYKWqnm6dR+OQ5Kp+5TJJLgXuwvtZDaCqDlfVXN/hHQA+GGu5DBbMkjpHknyR5DO6Y1oOtQ6kUXgWuAI4nmQ5yXOtA2kcktybZBW4DXg7ybHWmTSb+geZHgSO0T3s6pWq+rJtKo1BkpeAj4Drk6wmebh1Jo3CbuABYE//3265X9knTdO1wIn+XvYk3RnMbzXOJI1O3JEsSZIkSZIkSZqEK5glSZIkSZIkSROxYJYkSZIkSZIkTcSCWZIkSZIkSZI0EQtmSZIkSZIkSdJELJglSZIkSZIkSROxYJYkSZIkSZIkTcSCWZIkSZIkSZI0kb8B3qVVsS97opIAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fig, axs = plt.subplots(2, 1, figsize=(20, 7), sharex=True)\n", - "axs[0].plot(xs, fft(F1), 'C0')\n", - "axs[0].set_title('Fourier transform on F1', fontsize=16)\n", - "axs[1].plot(xs, fft(F2), 'C1')\n", - "axs[1].set_title('Fourier transform on F2', fontsize=16)\n", - "plt.tight_layout()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Filtering (`filtrate`)\n", + "### Filtering\n", "\n", "_Removes some unwanted components (such as noise) from an observation sequence according to some window size and one of two methods: **median** and **mean** filtering._\n", "\n", @@ -549,7 +505,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -564,9 +520,9 @@ "source": [ "#### Median filtering\n", "\n", - "_With a window size of $n$, median filtering replaces every observation $\\mathbf{o}^{(t)}$ with the median of the window of observations of size $n$ containing $\\mathbf{o}^{(t)}$ in its centre – that is, $\\mathbf{o}^{(t)\\prime}=\\mathrm{med}\\underbrace{\\left[\\ldots, \\mathbf{o}^{(t-1)}, \\mathbf{o}^{(t)}, \\mathbf{o}^{(t+1)}, \\ldots\\right]}_n$_\n", + "*With a window size of $n$, median filtering replaces every observation $\\mathbf{o}^{(t)}$ with the median of the window of observations of size $n$ containing $\\mathbf{o}^{(t)}$ in its centre:* \n", "\n", - "$$\\texttt{filtrate(sequence, n, method='median')}$$\n", + "$$\\mathbf{o}^{(t)\\prime}=\\mathrm{med}\\underbrace{\\left[\\ldots, \\mathbf{o}^{(t-1)}, \\mathbf{o}^{(t)}, \\mathbf{o}^{(t+1)}, \\ldots\\right]}_n$$\n", "\n", "---\n", "\n", @@ -575,7 +531,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -601,11 +557,11 @@ "axs[0, 1].set_title('Original sequence with noise ({} frames)'.format(len(F_noisy)))\n", "axs[0, 1].plot(F_noisy)\n", "\n", - "filtered = filtrate(F_noisy, n=5, method='median')\n", + "filtered = Filter(window_size=5, method='median')(F_noisy)\n", "axs[1, 0].set_title('Filtered noisy sequence with window size $n=5$ ({} frames)'.format(len(filtered)))\n", "axs[1, 0].plot(filtered, '--')\n", "\n", - "filtered = filtrate(F_noisy, n=20, method='median')\n", + "filtered = Filter(window_size=20, method='median')(F_noisy)\n", "axs[1, 1].set_title('Filtered noisy sequence with window size $n=20$ ({} frames)'.format(len(filtered)))\n", "axs[1, 1].plot(filtered, '--')\n", "\n", @@ -627,9 +583,9 @@ "source": [ "#### Mean filtering\n", "\n", - "_With a window size of $n$, mean filtering replaces every observation $\\mathbf{o}^{(t)}$ with the mean of the window of observations of size $n$ containing $\\mathbf{o}^{(t)}$ in its centre – that is, $\\mathbf{o}^{(t)\\prime}=\\mathrm{mean}\\underbrace{\\left[\\ldots, \\mathbf{o}^{(t-1)}, \\mathbf{o}^{(t)}, \\mathbf{o}^{(t+1)}, \\ldots\\right]}_n$_\n", + "*With a window size of $n$, mean filtering replaces every observation $\\mathbf{o}^{(t)}$ with the mean of the window of observations of size $n$ containing $\\mathbf{o}^{(t)}$ in its centre:* \n", "\n", - "$$\\texttt{filtrate(sequence, n, method='mean')}$$\n", + "$$\\mathbf{o}^{(t)\\prime}=\\mathrm{mean}\\underbrace{\\left[\\ldots, \\mathbf{o}^{(t-1)}, \\mathbf{o}^{(t)}, \\mathbf{o}^{(t+1)}, \\ldots\\right]}_n$$\n", "\n", "---\n", "\n", @@ -638,7 +594,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -664,11 +620,11 @@ "axs[0, 1].set_title('Original sequence with noise ({} frames)'.format(len(F_noisy)))\n", "axs[0, 1].plot(F_noisy)\n", "\n", - "filtered = filtrate(F_noisy, n=5, method='mean')\n", + "filtered = Filter(window_size=5, method='mean')(F_noisy)\n", "axs[1, 0].set_title('Filtered noisy sequence with window size $n=5$ ({} frames)'.format(len(filtered)))\n", "axs[1, 0].plot(filtered, '--')\n", "\n", - "filtered = filtrate(F_noisy, n=20, method='mean')\n", + "filtered = Filter(window_size=20, method='mean')(F_noisy)\n", "axs[1, 1].set_title('Filtered noisy sequence with window size $n=20$ ({} frames)'.format(len(filtered)))\n", "axs[1, 1].plot(filtered, '--')\n", "\n", @@ -704,7 +660,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -713,20 +669,20 @@ "(64, 2)" ] }, - "execution_count": 16, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Single multivariate observation sequences\n", - "down = downsample(F, n=5, method='average')\n", + "down = Downsample(factor=5, method='mean')(F)\n", "down.shape" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -735,7 +691,7 @@ "[(64, 2), (64, 2), (64, 2), (64, 2), (64, 2)]" ] }, - "execution_count": 17, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -743,7 +699,7 @@ "source": [ "# Multiple multivariate observation sequences\n", "Fs = [F]*5\n", - "down = downsample(Fs, n=5, method='average')\n", + "down = Downsample(factor=5, method='mean')(Fs)\n", "[f.shape for f in down]" ] }, @@ -751,121 +707,48 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Combining preprocessing methods (`Preprocess`)\n", + "## Combining preprocessing methods\n", "\n", - "It is possible to combine preprocessing methods by simply making repeated function calls, as shown below:" + "The `Preprocess` class can be used to chain preprocessing method calls:" ] }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "F_pre = F_noisy\n", - "F_pre = trim_zeros(F_pre)\n", - "F_pre = center(F_pre)\n", - "F_pre = standardize(F_pre)\n", - "F_pre = filtrate(F_pre, n=10, method='median')\n", - "F_pre = downsample(F_pre, n=10, method='decimate')\n", - "F_pre = fft(F_pre)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is fine if we are working with a single observation sequence. However, this **may** be slightly slower when applied to multiple observation sequences. This is due to each preprocessing method call requiring a separate loop through the observation sequences. This way is also a lot less readable.\n", - "\n", - "---\n", - "\n", - "The `Preprocess` class can be used to chain preprocessing method calls in a more efficient manner. To see the difference, lets duplicate the observation sequence `F` that we were using before:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "Fs = [F]*10000" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Chaining preprocessing method calls:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4min 16s, sys: 3.23 s, total: 4min 19s\n", - "Wall time: 4min 51s\n" - ] - } - ], - "source": [ - "%%time\n", - "F_pre = Fs\n", - "F_pre = trim_zeros(F_pre)\n", - "F_pre = center(F_pre)\n", - "F_pre = standardize(F_pre)\n", - "F_pre = filtrate(F_pre, n=10, method='median')\n", - "F_pre = downsample(F_pre, n=15, method='decimate');\n", - "F_pre = fft(F_pre)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the `Preprocess` class:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " Preprocessing summary: \n", - "===========================================\n", - "1. Zero-trimming\n", - "-------------------------------------------\n", - "2. Centering\n", - "-------------------------------------------\n", - "3. Standardization\n", - "-------------------------------------------\n", - "4. Filtering:\n", - " Median filter with window size (n=10)\n", - "-------------------------------------------\n", - "5. Downsampling:\n", - " Decimation with downsample factor (n=15)\n", - "-------------------------------------------\n", - "6. Discrete Fourier Transform\n", - "===========================================\n" + " Preprocessing summary: \n", + "============================================================\n", + "1. TrimZeros\n", + " Remove zero-observations\n", + "------------------------------------------------------------\n", + "2. Center\n", + " Centering around mean (zero mean) (independent)\n", + "------------------------------------------------------------\n", + "3. Standardize\n", + " Standard scaling (zero mean, unit variance) (independent)\n", + "------------------------------------------------------------\n", + "4. Filter\n", + " Median filtering with window-size 10\n", + "------------------------------------------------------------\n", + "5. Downsample\n", + " Decimation downsampling with factor 15\n", + "============================================================\n" ] } ], "source": [ - "pre = Preprocess()\n", - "pre.trim_zeros()\n", - "pre.center()\n", - "pre.standardize()\n", - "pre.filtrate(n=10, method='median')\n", - "pre.downsample(n=15, method='decimate')\n", - "pre.fft()\n", + "pre = Preprocess([\n", + " TrimZeros(),\n", + " Center(),\n", + " Standardize(),\n", + " Filter(window_size=10, method='median'),\n", + " Downsample(factor=15, method='decimate')\n", + "])\n", "\n", "# Summarize the preprocessing steps\n", "pre.summary()" @@ -873,28 +756,12 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 4min 14s, sys: 3.32 s, total: 4min 17s\n", - "Wall time: 4min 56s\n" - ] - } - ], - "source": [ - "%%time\n", - "F_pre = pre.transform(Fs)" - ] - }, - { - "cell_type": "markdown", + "execution_count": 18, "metadata": {}, + "outputs": [], "source": [ - "Not much testing has been done to confirm whether one method is actually better than the other, but you can still rely on them giving the same results!" + "F_pre = pre.transform(Fs)\n", + "# Can also call as pre(Fs)" ] } ], @@ -914,7 +781,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.4" } }, "nbformat": 4, diff --git a/notebooks/Pen-Tip Trajectories (Example).ipynb b/notebooks/Pen-Tip Trajectories (Example).ipynb index 169aec4a..f0244919 100644 --- a/notebooks/Pen-Tip Trajectories (Example).ipynb +++ b/notebooks/Pen-Tip Trajectories (Example).ipynb @@ -147,7 +147,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -191,24 +191,27 @@ "name": "stdout", "output_type": "stream", "text": [ - " Preprocessing summary: \n", - "==========================================\n", - "1. Zero-trimming\n", - "------------------------------------------\n", - "2. Downsampling:\n", - " Averaging with downsample factor (n=15)\n", - "==========================================\n" + " Preprocessing summary: \n", + "===================================\n", + "1. TrimZeros\n", + " Remove zero-observations\n", + "-----------------------------------\n", + "2. Downsample\n", + " Mean downsampling with factor 15\n", + "===================================\n" ] } ], "source": [ - "from sequentia.preprocessing import Preprocess, trim_zeros\n", + "from sequentia.preprocessing import *\n", + "\n", + "pre = Preprocess([\n", + " # Trim zero-observations\n", + " TrimZeros(), \n", + " # Downsample with averaging and a downsample factor of n=15\n", + " Downsample(factor=15, method='mean')\n", + "])\n", "\n", - "pre = Preprocess()\n", - "# Trim zero-observations\n", - "pre.trim_zeros()\n", - "# Downsample with averaging and a downsample factor of n=15\n", - "pre.downsample(n=15, method='average')\n", "# Display a summary of the preprocessing transformations\n", "pre.summary()" ] @@ -220,7 +223,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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ZG644QbghzOM999/Pzt37qR379789re/Zfr06RWeO23aNJ566ikPHAGRuosJialydseMnAxCA0NpFdHKy6lE6sYYs8IYs6mSr1GnrTMNKAZeruJlLrbW9gFGAncYYy6tYluTjTFpxpi0rKwsj++LJ6h9FBFPGNx+MF2bd+X5Dc9TUvrj3wP19df0v5JzMofpF073q3uiVSbI6QCVevd+OLjRs6/ZqheMfKzaVXr27MmuXbsoKSkhMDCQe++9lyeeeKLCOuPGjeOee+7hjjvuAOC1117j/fffZ+vWrSxatIjPP/8cl8vF7bffzssvv8yNN9546rnp6em88MILfPHFF1hr6d+/P4MGDSI4OJiZM2eycuVKWrZsyeHDhyts87HHHmPTpk2sX78egIyMDMaMGcM999xDaWkpCxcuZM2aNZ44SiJ1Fh0SXXWRlptBfHS83//ClKbDWjusuu8bYyYCVwFDrbW2itfY5/430xizFOgHfFLJenOBuQCpqamVvtYpah8rbFPto4h/McYwOWkyv/nPb/hg9weM7DTSY6+dfiidf27/Jzcl3ES3Ft089rpO8c0izSEBAQEkJCSwefNmtm/fTocOHejTp0+FdVJSUsjMzGT//v1kZWXRvHlz2rdvz+zZs0lPT6dv374A5Ofnc84551R47meffcbo0aOJiIgAYMyYMXz66acYYxg7diwtW7YEoEWLFtXm7NixI7Gxsaxbt45Dhw6RkpJCbGyspw6DSJ1EB0dTWFpIQXEBoUGhFb6XkZNB9xbdHUom4lnGmBHAfcAga21eFetEAAHW2mPu/18OzPBiTI9S+yginjK8w3DOizmPuRvmckXHKzxyAreopIhHVz1Km4g23JZ8mwdSOs83i7SznNFrSAMGDODzzz/n2Wef5b333qt0nbFjx7JkyRIOHjzIuHHjgLKZZCZMmMAf//hHr+ScNGkSCxYs4ODBg9x8881e2aZIdWJCfrih9elFWlFJEfuO72NEpxFORRPxtNlACLDcGAOw2lp7mzGmDTDPWnslcC6w1P39IOAVa23ljUptqH08K7WPIr4twARwa9KtPPDpA3y852OGdhh69iedxYLNC9iZs5PZQ2YT7gr3QErnaezRGQYMGMCDDz7I6NGjadu2baXrjBs3joULF7JkyRLGji27KHHo0KEsWbKEzMxMAA4fPszu3bsrPO+S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\n", "text/plain": [ "
" ] @@ -265,7 +268,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -281,7 +284,7 @@ "plt.title('Histogram of observation sequence lengths')\n", "plt.xlabel('Number of time frames')\n", "plt.ylabel('Count')\n", - "plt.hist([len(x) for x in trim_zeros(X)], bins=n_labels)\n", + "plt.hist([len(x) for x in TrimZeros()(X)], bins=n_labels)\n", "plt.show()\n", "\n", "# Transform the entire dataset\n", @@ -295,7 +298,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAed0lEQVR4nO3debwcZZ3v8c+XsIedRGSLBzCooJcoR0QWb1RUYEBkVBYVwS0yirgyoo5DBuUOXkH0jiMalAsIYtgXdRBlizggJCGQsMkWbhJDEgIIIYgk+d0/nqeLSqfPOd2ddNc5Od/369WvU/VUPVW/ru7Tv3qeqn5aEYGZmRnAOlUHYGZmg4eTgpmZFZwUzMys4KRgZmYFJwUzMys4KZiZWcFJYYiSdK+k8VXHUSVJh0uaI2mJpDc2sf54SXM7FEuPpJC0bie23ymSzpP07SbXvVnSJ9vcT9t1rbucFAYhSbMlHVBXdpykW2vzEbF7RNw8wHaG5AdVC84AToiITSLirvqF+bm/uoK4+tXJ5FTFfoYiSRMlXVh1HIORk4K1bRAkm1cB91Ycg9laxUlhiCq3JiTtJWmqpGclLZD0vbzalPz3mdzF8lZJ60j6F0mPS1oo6QJJm5e2+9G8bLGkb9btZ6KkyyRdKOlZ4Li879skPSNpvqQfSlq/tL2Q9BlJD0l6TtK3JO0i6b9zvJeU1697jg1jlbSBpCXACOBuSY80qFt77nfn535kadmX8/bmS/pYqXwDSWdI+n/5OP5Y0kZ9xDYir/ukpEeBf6hb/jFJ9+fn/KikT+fykcB/AdvluJZI2q6/46jkrBzzs5JmSnp9fzH3tZ9Gz6UU85aSfiVpkaSn8/QOdavtIumOHMfVkrYq1d87v67PSLpbTXZv5mP5dUmP5OM1TdKOedk+ku6U9Nf8d59SvZVa1Cqd/evlVvKx+dg8KekbedmBwNeBI/NxuTuXH5dfq+ckPSbpw83Ev9aJCD8G2QOYDRxQV3YccGujdYDbgGPy9CbA3nm6Bwhg3VK9jwMPAzvnda8Afp6X7QYsAfYD1id1z7xU2s/EPP8+0gnFRsCewN7Aunl/9wNfKO0vgKuBzYDdgReBG/L+NwfuA47t4zj0GWtp26/u5ziutBwYDywDTgXWAw4GlgJb5uVnAdcAWwGbAtcC/97Hto8HHgB2zOvfVD7WpCSxCyDgf+b9vKkUx9y67fV5HIH3ANOALfL2XgdsO1DMjfbT4HmcB3w7T28NvB/YOG/rUuCq0ro3A/OA1wMjgcuBC/Oy7YHF+ZiuA7wrz48u1f1kHzGcBMwEXpOf3x45lq2Ap4Fj8nE5Os9v3ej/hPT+rMXTk1+Pc0jv0z1I773X1a+b50cCzwKvyfPbArtX/VlQxaPyAPxo8KKkN/sS4JnSYyl9J4UpwL8Bo+q2U/vHKCeFG4DPlOZfQ/qgXxf4V+Di0rKNgb+zclKYMkDsXwCuLM0HsG9pfhrw1dL8mcD3+9hWn7GWtt1qUnih7ngsJH0YC3ge2KW07K3AY31s+0bg+NL8u+uPdd36VwGfL8Ux0Id1cRyBdwB/znGuU1qn35ib3M955KTQYNk44OnS/M3A6aX53fL7YwTwVUoJOy//LTnh039SeBA4rEH5McAddWW3AcfV/w+U3p/1SWGH0vI7gKPq183zI0n/Z+8HNmr1f3Zterj7aPB6X0RsUXsAn+ln3U8AuwIP5Cb2If2sux3weGn+cVJC2CYvm1NbEBFLSWd7ZXPKM5J2zd0MT+Qupf8FjKqrs6A0/UKD+U3aiLVdiyNiWWl+ad7/aFISnJa7P54BrsvlfcVWPhblOJF0kKTbJT2Vt3Uwqx6X8vp9HseIuBH4IfCfwEJJkyRt1kbM/ZK0saSf5O66Z0knG1tIGlFarf45r5fjfBXwwVocOZb9SGfcA9kRWKULkFVf/9o+t2/uGQHwRGm69lqvIiKeB44ktQDnS/q1pNe2sJ+1hpPCWiAiHoqIo4FXAN8BLst9yo2GwP0L6R+4ZgypS2UBMB8o+pBzf/rW9burmz+b1I0yNiI2I/XVqv1n03Ssa9qTpAS1eykZbx4RfSWs+aQPs3JsQOrnJ3WtnAFsk5P6b3j5uDR6Xfo9jhHxfyJiT9LZ+a6kLpeBYm51COQvk1pjb8kxvK32lErr1D/nl3Icc0gthS1Kj5ERcXoT+51D6mqrV//61/Y5L08/T0qKNa9sYl81qxybiPhtRLyLlMgeIHU9DTtOCmsBSR+RNDoiVpCawAArgEX5786l1S8GvihpJ0mbkM5IJ+ez58uAQ/PFvfVJTeyBPuA3JfXFLslnVv+0pp7XALE2YwErP/c+5WN3DnCWpFcASNpe0nv6qHIJcKKkHSRtCZxcWrY+sAHp+C+TdBCpe6kc19YqXeCnn+Mo6c2S3iJpPdIH4d+AFU3E3Gg//dmUlGSeyReQT2mwzkck7SZpY9K1mcsiYjlwIem985584XhDpVti6y9UN/JT4FuSxir5H5K2JiXSXSV9SNK6SjcL7Ab8KtebARwlaT1JvcAHmnyekI5Nj6R1ACRtI+mwfDL1Iqn7dkUL21trOCmsHQ4E7lW6I+cHpH7TF3L3z2nAH3OTfm/gXODnpK6Bx0gfMJ8DiIh78/QvSWfCS0h97i/2s++vAB8CniN9QE1eg8+rz1ibNBE4Pz/3I5pY/6ukC9u35+6T35POnBs5h9RnfjcwnXQRHICIeA44kZQ4niYdn2tKyx8gJbxHc2zb0f9x3CyXPU3qPlkMfHegmPvYT3++T7oo+yRwO6krqt7PSdchngA2zM+TiJgDHEZq4Swinf2fRHOfMd8jHavrSYnxZ6R+/cXAIaQWzGLgn4FDIuLJXO+bpBbG06Rrar9oYl81l+a/iyVNz3F+idQ6eYp0c8CaPMEZMpQvspitIp+dP0Pq0nis6njMrPPcUrCVSDo0X3AcSeoTn0m6y8PMhgEnBat3GKkJ/RdgLKkrys1Js2HC3UdmZlZwS8HMzApVD2i2WkaNGhU9PT1Vh2FmNqRMmzbtyYho+CXHIZ0Uenp6mDp1atVhmJkNKZLqvylecPeRmZkVnBTMzKzgpGBmZgUnBTMzKzgpmJlZwUnBzMwKTgpmZlZwUjAzs4KTgpmZFYb0N5qtNT0n/3q16s8+/R/WUCRmNli5pWBmZgUnBTMzKzgpmJlZwUnBzMwKTgpmZlZwUjAzs4KTgpmZFZwUzMys0LGkIOlcSQslzSqVTZY0Iz9mS5qRy3skvVBa9uNOxWVmZn3r5DeazwN+CFxQK4iII2vTks4E/lpa/5GIGNfBeMzMbAAdSwoRMUVST6NlkgQcAbyjU/s3M7PWVXVNYX9gQUQ8VCrbSdJdkm6RtH9fFSVNkDRV0tRFixZ1PlIzs2GkqgHxjgYuLs3PB8ZExGJJewJXSdo9Ip6trxgRk4BJAL29vdGVaK1SqzOQnwfxM2tN11sKktYF/hGYXCuLiBcjYnGengY8Auza7djMzIa7KrqPDgAeiIi5tQJJoyWNyNM7A2OBRyuIzcxsWOtY95Gki4HxwChJc4FTIuJnwFGs3HUE8DbgVEkvASuA4yPiqU7FVuNuCTOr0mD8DOrk3UdH91F+XIOyy4HLOxWLmZk1x99oNjOzgpOCmZkVnBTMzKzgpGBmZgUnBTMzKzgpmJlZwUnBzMwKTgpmZlZwUjAzs4KTgpmZFZwUzMys4KRgZmYFJwUzMys4KZiZWaGqn+O0Nq3O+OtmZgNxS8HMzApuKZjZkDcYf8FsqHJLwczMCk4KZmZW6FhSkHSupIWSZpXKJkqaJ2lGfhxcWvY1SQ9LelDSezoVl5mZ9a2TLYXzgAMblJ8VEePy4zcAknYDjgJ2z3V+JGlEB2MzM7MGOpYUImIK8FSTqx8G/DIiXoyIx4CHgb06FZuZmTVWxTWFEyTdk7uXtsxl2wNzSuvMzWWrkDRB0lRJUxctWtTpWM3MhpVuJ4WzgV2AccB84MxWNxARkyKiNyJ6R48evabjMzMb1rqaFCJiQUQsj4gVwDm83EU0D9ixtOoOuczMzLqoq0lB0ral2cOB2p1J1wBHSdpA0k7AWOCObsZmZmYd/EazpIuB8cAoSXOBU4DxksYBAcwGPg0QEfdKugS4D1gGfDYilncqNjMza6xjSSEijm5Q/LN+1j8NOK1T8ZiZ2cD8jWYzMys4KZiZWcFJwczMCh46uwL+oRwzG6ycFNrkD3YbiMf4t6HI3UdmZlZwUjAzs4K7j6xp7g4xW/s5KZiZtWltvLbo7iMzMys4KZiZWcFJwczMCk4KZmZW8IVmM1tjfIfa0OeWgpmZFdxSMBuEhuMZ99p4e+dQ5KRg1g9/UNlw4+4jMzMrdCwpSDpX0kJJs0pl35X0gKR7JF0paYtc3iPpBUkz8uPHnYrLzMz61snuo/OAHwIXlMp+B3wtIpZJ+g7wNeCredkjETGug/FYhdwNYzY0dKylEBFTgKfqyq6PiGV59nZgh07t38zMWlflNYWPA/9Vmt9J0l2SbpG0f1VBmZkNZ5XcfSTpG8Ay4KJcNB8YExGLJe0JXCVp94h4tkHdCcAEgDFjxnQrZBui3G1lA/F7ZGVdTwqSjgMOAd4ZEQEQES8CL+bpaZIeAXYFptbXj4hJwCSA3t7e6FLYZkPGcPyOg605Xe0+knQg8M/AeyNiaal8tKQReXpnYCzwaDdjMzOzDrYUJF0MjAdGSZoLnEK622gD4HeSAG6PiOOBtwGnSnoJWAEcHxFPNdywmZl1TMeSQkQc3aD4Z32sezlweadiMTOz5vgbzWZmVvDYR2ZW8J045paCmZkVnBTMzKzgpGBmZgUnBTMzKzgpmJlZwUnBzMwKTgpmZlZwUjAzs4KTgpmZFZwUzMys4KRgZmaFppKCpH2bKTMzs6Gt2ZbCfzRZZmZmQ1i/o6RKeiuwDzBa0pdKizYDRnQyMDMz676Bhs5eH9gkr7dpqfxZ4AOdCsrMzKrRb1KIiFuAWySdFxGPdykmMzOrSLM/srOBpElAT7lORLyjE0GZmVk1mk0KlwI/Bn4KLG9245LOBQ4BFkbE63PZVsBkUoKZDRwREU9LEvAD4GBgKXBcRExvdl9mZrb6mr37aFlEnB0Rd0TEtNqjiXrnAQfWlZ0M3BARY4Eb8jzAQcDY/JgAnN1kbGZmtoY0mxSulfQZSdtK2qr2GKhSREwBnqorPgw4P0+fD7yvVH5BJLcDW0jatsn4zMxsDWi2++jY/PekUlkAO7exz20iYn6efgLYJk9vD8wprTc3l80vlSFpAqklwZgxY9rYvZmZ9aWppBARO3Vi5xERkqLFOpOASQC9vb0t1TUzs/41lRQkfbRReURc0MY+F0jaNiLm5+6hhbl8HrBjab0dcpmZmXVJs9cU3lx67A9MBN7b5j6v4eXuqGOBq0vlH1WyN/DXUjeTmZl1QbPdR58rz0vaAvjlQPUkXQyMB0ZJmgucApwOXCLpE8DjwBF59d+Qbkd9mHRL6seaewpmZramNHuhud7zwIDXGSLi6D4WvbPBugF8ts14zMxsDWj2msK1pLuNIA2E9zrgkk4FZWZm1Wi2pXBGaXoZ8HhEzO1APGZmVqGmLjTngfEeII2UuiXw904GZWZm1Wj2l9eOAO4APki6MPwnSR4628xsLdNs99E3gDdHxEIASaOB3wOXdSowMzPrvma/p7BOLSFki1uoa2ZmQ0SzLYXrJP0WuDjPH0n6XoGZma1FBvqN5leTBrA7SdI/AvvlRbcBF3U6ODMz666BWgrfB74GEBFXAFcASHpDXnZoR6MzM7OuGui6wDYRMbO+MJf1dCQiMzOrzEBJYYt+lm20JgMxM7PqDZQUpkr6VH2hpE8Czfwcp5mZDSEDXVP4AnClpA/zchLoBdYHDu9kYGZm1n39JoWIWADsI+ntwOtz8a8j4saOR2ZmZl3X7O8p3ATc1OFYzMysYv5WspmZFZwUzMys4KRgZmYFJwUzMyu0+xvNbZP0GmByqWhn4F9JX5T7FLAol389IjzonplZF3U9KUTEg8A4AEkjgHnAlcDHgLMi4ox+qpuZWQdV3X30TuCRiHi84jjMzIzqk8JRvPwbDQAnSLpH0rmStmxUQdIESVMlTV20aFGjVczMrE2VJQVJ6wPvBS7NRWcDu5C6luYDZzaqFxGTIqI3InpHjx7dlVjNzIaLKlsKBwHT81AaRMSCiFgeESuAc4C9KozNzGxYqjIpHE2p60jStqVlhwOzuh6Rmdkw1/W7jwAkjQTeBXy6VPy/JY0DAphdt8zMzLqgkqQQEc8DW9eVHVNFLGZm9rKq7z4yM7NBxEnBzMwKTgpmZlZwUjAzs4KTgpmZFZwUzMys4KRgZmYFJwUzMys4KZiZWcFJwczMCk4KZmZWcFIwM7OCk4KZmRWcFMzMrOCkYGZmBScFMzMrOCmYmVnBScHMzApOCmZmVqjkN5oBJM0GngOWA8siolfSVsBkoAeYDRwREU9XFaOZ2XBTdUvh7RExLiJ68/zJwA0RMRa4Ic+bmVmXVJ0U6h0GnJ+nzwfeV2EsZmbDTpVJIYDrJU2TNCGXbRMR8/P0E8A29ZUkTZA0VdLURYsWdStWM7NhobJrCsB+ETFP0iuA30l6oLwwIkJS1FeKiEnAJIDe3t5VlpuZWfsqaylExLz8dyFwJbAXsEDStgD578Kq4jMzG44qSQqSRkratDYNvBuYBVwDHJtXOxa4uor4zMyGq6q6j7YBrpRUi+EXEXGdpDuBSyR9AngcOKKi+MzMhqVKkkJEPArs0aB8MfDO7kdkZmYw+G5JNTOzCjkpmJlZwUnBzMwKTgpmZlZwUjAzs4KTgpmZFZwUzMys4KRgZmYFJwUzMys4KZiZWcFJwczMCk4KZmZWcFIwM7OCk4KZmRWcFMzMrOCkYGZmBScFMzMrOCmYmVnBScHMzApdTwqSdpR0k6T7JN0r6fO5fKKkeZJm5MfB3Y7NzGy4W7eCfS4DvhwR0yVtCkyT9Lu87KyIOKOCmMzMjAqSQkTMB+bn6eck3Q9s3+04zMxsVZVeU5DUA7wR+FMuOkHSPZLOlbRlH3UmSJoqaeqiRYu6FKmZ2fBQWVKQtAlwOfCFiHgWOBvYBRhHakmc2aheREyKiN6I6B09enTX4jUzGw4qSQqS1iMlhIsi4gqAiFgQEcsjYgVwDrBXFbGZmQ1nVdx9JOBnwP0R8b1S+bal1Q4HZnU7NjOz4a6Ku4/2BY4BZkqakcu+DhwtaRwQwGzg0xXEZmY2rFVx99GtgBos+k23YzEzs5X5G81mZlZwUjAzs4KTgpmZFZwUzMys4KRgZmYFJwUzMys4KZiZWcFJwczMCk4KZmZWcFIwM7OCk4KZmRWcFMzMrOCkYGZmBScFMzMrOCmYmVnBScHMzApOCmZmVnBSMDOzgpOCmZkVBl1SkHSgpAclPSzp5KrjMTMbTgZVUpA0AvhP4CBgN+BoSbtVG5WZ2fAxqJICsBfwcEQ8GhF/B34JHFZxTGZmw8a6VQdQZ3tgTml+LvCW8gqSJgAT8uwSSQ+uxv5GAU+6vuu7vusPtfr6zmrVf1VfCwZbUhhQREwCJq2JbUmaGhG9ru/6ru/6w61+XwZb99E8YMfS/A65zMzMumCwJYU7gbGSdpK0PnAUcE3FMZmZDRuDqvsoIpZJOgH4LTACODci7u3gLle3G8r1Xd/1XX+o1m9IEdGJ7ZqZ2RA02LqPzMysQk4KZmZWcFJokaQeSbOqjqNG0kRJX6k6jmatqeMnacmaiMfMVuakYGarRYk/S9YSw/KFlHSVpGmS7s3fkG7VupIuknS/pMskbdzi/j8q6R5Jd0v6eas7l/QNSX+WdCvwmjbqf0TSHZJmSPpJHnOqlfrfzIMW3irp4jZaKiMknZOP//WSNmqxfltyK+UBSefl43eRpAMk/VHSQ5L2anIb969O/JK+JGlWfnxhNZ5HW+/B8vunzdevFsODki4AZrHy94sGqjtS0q/z+3+WpCPb2Pes0vxXJE1ssu7pkj5bmm+6pS3pJEkn5umzJN2Yp98h6aImt3Fq+TWXdJqkzzdTt1Tn+Py/O0PSY5JuaqX+gCJi2D2ArfLfjUhv6K1bqNsDBLBvnj8X+EoL9XcH/gyMKsfSQv09gZnAxsBmwMMt7v91wLXAenn+R8BHW6j/ZmAGsCGwKfBQi/vvAZYB4/L8JcBH2ngNl7RRp7bvN5BOiKbl10+kMbau6nT8pddvJLAJcC/wxjaeR1vvwdV9/9TFsALYu4267wfOKc1v3sa+Z5XmvwJMbLLuG4FbSvP3ATs2WXdv4NI8/QfgDmA94BTg0y3EPj1PrwM80srnT9221stxHNpO/b4ew7KlAJwo6W7gdtIZztgW68+JiD/m6QuB/Vqo+w7SG+tJgIh4qsV97w9cGRFLI+JZWv9y3ztJHwx3SpqR53duof6+wNUR8beIeI6UYFr1WETMyNPTSP8o3fJYRMyMiBWkD+QbIv2HzWwhjtWJfz/S6/d8RCwBriC9pq1q9z24uu+fsscj4vY26s0E3iXpO5L2j4i/rkYMLYmIu4BXSNpO0h7A0xExZ6B62TRgT0mbAS8CtwG9pGP6hyb3PxtYLOmNwLuBuyJicYtPo+YHwI0R0c7/YJ8G1ZfXukHSeOAA4K0RsVTSzaSz3lbUf7ljKH3ZQ8D5EfG1CmN4sTS9nNRiq2LfK0rzK2j+/6HK+GsGw3vw+XYqRcSfJb0JOBj4tqQbIuLUFjaxjJW7vlv9/70U+ADwSmBys5Ui4iVJjwHHAf8N3AO8HXg1cH8L+/9p3sYrSa28lkk6jjSo3Qnt1O/PcGwpbE46O1gq6bWkJmGrxkh6a57+EHBrC3VvBD4oaWsASVu1uO8pwPskbSRpU+DQFuvfAHxA0itq+5fU54iJDfwROFTShpI2AQ5pcf/D3R9Ir9/GkkYCh9PkWWaddt+Dq/v+WW2StgOWRsSFwHeBN7W4iQWks/2tJW1A6+/ByaQhdD5AShCt+AOpu2pKnj6edLbfSlK+EjiQ1BX72xb3j6Q9cwwfyS3eNWrYtRSA64DjJd0PPEjqQmrVg8BnJZ1L6pM8u9mKEXGvpNOAWyQtB+4inTU0W3+6pMnA3cBC0nhRTYuI+yT9C3C90h0jLwGfBR5vsv6dkq4hnSUtIHUFdK35P9Tl1+88Un80wE9zl0ar2noPru77Zw15A/BdSStI779/aqVyPmM/lXQM5wEPtFj/3pwQ50XE/FbqkhLBN4DbIuJ5SX+jxaQeEX/PF4efiYjlLe4fUutgK+AmSQBTI+KTbWynIQ9zYS2TtElELMl3vEwBJkTE9KrjGi4k9QC/iojXr4FtTSRdtD9jdbdlzcknY9OBD0bEQ1XHU284dh/Z6puUL1JPBy53QjBrjtLPCz9MusFh0CUEcEvBzMxK3FIwM7OCk4KZmRWcFMzMrOCkYEOOWhghtZWxbQbafr63/xb1M1aUpJslrfEfU+9nf+Ml7dNGvTfkW2PNVuKkYNa8jwNXtHlv+YAktfO9ofFAS0lB0roRMRPYQdKYNvZpazEnBVsrSDpU0p8k3SXp95K2KS3eQ9JtSiOhfqpU5yRJdyqNWPtvTezmw8DVpfpflTQzj/Z5emm9DyqNQvtnSfvndXsk/UHS9PzYJ5ePz+XXkL6E1ucovpIOzHXvlnRD/r7C8cAX84iZ+0saLeny/LzulLRvrjtR0s8l/RGojcx7LembvWYvW5Oj6/nhRzceNBghFdiSl2+x/iRwZp6eSPr27kbAKGAOsB1pMLJJpLGg1gF+Bbytn+2vDzxRmj+INP7Nxnm+NvLuzaV9Hwz8Pk9vDGyYp8eSvoUK6Uz/eWCn0rZXGcUXGJ1j36lunYmURjkFfgHsl6fHAPeX1psGbFRad1/g2qpfTz8G12M4DnNha6cdgMmStiV9gD9WWnZ1RLwAvJCHF9iLNKrou0nDjEAaxnos6RvajYwCninNHwD834hYCquMdntF/lseQXU94IeSxpEG0du1tP4dEVGO90RJh+fp2ii+o4EptfWi79F1DwB2y8MfAGyWx6gCuCYfh5qFpARpVnBSsLXFfwDfi4hr8ki4E0vLGo0oKuDfI+InTW7/BZofjbM2iupyXv4f+yJprKg9SC2Tv5XWL0YbXQOj+K5D+o2D8vbJSaJ+VNMNSc/LrOBrCra22Jw0OBrAsXXLDsujum5N6q65kzQ65cdrZ9GStq+NHNtIRDxN+sW42gf074CP5fGfmhntdnNgfqRRLY8B+rqDqa9RfG8H3iZpp7r9PUf6saOa64HP1WZyy6Qvu5K6p8wKTgo2FG0saW7p8SVSy+BSSdOAJ+vWvwe4ifTB+q2I+EtEXE/qf79N0kzgMlb+cG3kevKP2UTEdaQfqJmax4Ea6LbXHwHHKv2402vp+7cIriP93Ov9wOk5ZiJiETABuCJvo/Y7ANcCh9cuNAMnAr354vl9pAvRfXk78OsB4rZhxmMfmTVJ6YdhvhgRx1Qdy+rKv0NwC+mi9LKq47HBwy0FsyZFGg32pv6+vDaEjAFOdkKwem4pmJlZwS0FMzMrOCmYmVnBScHMzApOCmZmVnBSMDOzwv8HQFJDhOVjf+AAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] @@ -406,12 +409,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d7129787d7374f0c86cd69bcd025ae06", + "model_id": "dd1ff153b33d4a29965e97a3f91043b3", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HBox(children=(IntProgress(value=0, description='Calculating distances', max=2286, style=ProgressStyle(descrip…" + "HBox(children=(FloatProgress(value=0.0, description='Calculating distances', max=2286.0, style=ProgressStyle(d…" ] }, "metadata": {}, @@ -448,12 +451,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "22a01020548342138848d269ed00358a", + "model_id": "e4a3c1c251664324967f368f875641e6", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HBox(children=(IntProgress(value=0, description='Classifying examples', max=20, style=ProgressStyle(descriptio…" + "HBox(children=(FloatProgress(value=0.0, description='Classifying examples', max=20.0, style=ProgressStyle(desc…" ] }, "metadata": {}, @@ -466,8 +469,8 @@ "\n", "w c d e a e b h s v c y w e v v w v v p\n", "\n", - "CPU times: user 1min 12s, sys: 1.57 s, total: 1min 14s\n", - "Wall time: 1min 13s\n" + "CPU times: user 55.6 s, sys: 2.14 s, total: 57.7 s\n", + "Wall time: 57.1 s\n" ] } ], @@ -496,8 +499,8 @@ "text": [ "w c d e a e b h s v c y w e v v w v v p\n", "\n", - "CPU times: user 501 ms, sys: 78.4 ms, total: 579 ms\n", - "Wall time: 38.4 s\n" + "CPU times: user 545 ms, sys: 71.7 ms, total: 616 ms\n", + "Wall time: 29.6 s\n" ] } ], @@ -526,8 +529,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 534 ms, sys: 196 ms, total: 730 ms\n", - "Wall time: 22min 36s\n" + "CPU times: user 442 ms, sys: 19.2 ms, total: 461 ms\n", + "Wall time: 12min 45s\n" ] } ], @@ -543,7 +546,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -571,7 +574,7 @@ "source": [ "As you can see, Dynamic Time Warping $k$-NN classification often works with near perfect performance, but suffers due to the fact that $k$-NN is a non-parametric machine learning algorithm. \n", "\n", - "This means that we have to look through every training example when we make a single prediction. Even with FastDTW, downsampling and multi-processing, the example classification on the test set consisting of 572 examples **took over 20 minutes**!\n", + "This means that we have to look through every training example when we make a single prediction. Even with FastDTW, downsampling and multi-processing, the example classification on the test set consisting of 572 examples **took over 10 minutes**!\n", "\n", "---\n", "\n", @@ -612,12 +615,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "32667796594d4a99b1aaec881433d6d1", + "model_id": "dc89b7b75ce849778f694160d16346ba", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HBox(children=(IntProgress(value=0, description='Training HMMs', max=20, style=ProgressStyle(description_width…" + "HBox(children=(FloatProgress(value=0.0, description='Training HMMs', max=20.0, style=ProgressStyle(description…" ] }, "metadata": {}, @@ -667,7 +670,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -707,7 +710,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.4" } }, "nbformat": 4, From eb53f57d96a71628ab317056d68734d9a9201734 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Fri, 15 May 2020 13:13:33 +0100 Subject: [PATCH 08/20] [patch:lib] Simplify package imports (#82) --- lib/sequentia/classifiers/dtwknn/dtwknn.py | 6 +----- lib/sequentia/classifiers/hmm/hmm.py | 4 +--- lib/sequentia/classifiers/hmm/hmm_classifier.py | 3 +-- lib/test/lib/classifiers/dtwknn/test_dtwknn.py | 6 +----- lib/test/lib/classifiers/hmm/test_hmm.py | 6 +----- lib/test/lib/classifiers/hmm/test_hmm_classifier.py | 6 +----- lib/test/lib/classifiers/hmm/test_topologies.py | 4 +--- lib/test/lib/internals/test_validator.py | 3 +-- lib/test/lib/preprocessing/test_preprocess.py | 3 +-- lib/test/lib/preprocessing/test_transforms.py | 3 +-- 10 files changed, 10 insertions(+), 34 deletions(-) diff --git a/lib/sequentia/classifiers/dtwknn/dtwknn.py b/lib/sequentia/classifiers/dtwknn/dtwknn.py index 8cc52305..f90222d8 100644 --- a/lib/sequentia/classifiers/dtwknn/dtwknn.py +++ b/lib/sequentia/classifiers/dtwknn/dtwknn.py @@ -1,8 +1,4 @@ -import tqdm -import tqdm.auto -import random -import numpy as np -import h5py +import tqdm, tqdm.auto, random, numpy as np, h5py from joblib import Parallel, delayed from multiprocessing import cpu_count from fastdtw import fastdtw diff --git a/lib/sequentia/classifiers/hmm/hmm.py b/lib/sequentia/classifiers/hmm/hmm.py index f2e6af50..979b1dd1 100644 --- a/lib/sequentia/classifiers/hmm/hmm.py +++ b/lib/sequentia/classifiers/hmm/hmm.py @@ -1,6 +1,4 @@ -import json -import numpy as np -import pomegranate as pg +import numpy as np, pomegranate as pg, json from .topologies.ergodic import _ErgodicTopology from .topologies.left_right import _LeftRightTopology from ...internals import _Validator diff --git a/lib/sequentia/classifiers/hmm/hmm_classifier.py b/lib/sequentia/classifiers/hmm/hmm_classifier.py index 601e6ebd..249b0ff5 100644 --- a/lib/sequentia/classifiers/hmm/hmm_classifier.py +++ b/lib/sequentia/classifiers/hmm/hmm_classifier.py @@ -1,5 +1,4 @@ -import json -import numpy as np +import numpy as np, json from .hmm import HMM from sklearn.metrics import confusion_matrix from ...internals import _Validator diff --git a/lib/test/lib/classifiers/dtwknn/test_dtwknn.py b/lib/test/lib/classifiers/dtwknn/test_dtwknn.py index f833e5f8..1aa2edd1 100644 --- a/lib/test/lib/classifiers/dtwknn/test_dtwknn.py +++ b/lib/test/lib/classifiers/dtwknn/test_dtwknn.py @@ -1,8 +1,4 @@ -import pytest -import warnings -import os -import h5py -import numpy as np +import pytest, warnings, os, h5py, numpy as np from copy import deepcopy with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) diff --git a/lib/test/lib/classifiers/hmm/test_hmm.py b/lib/test/lib/classifiers/hmm/test_hmm.py index ab3da229..6dafb20d 100644 --- a/lib/test/lib/classifiers/hmm/test_hmm.py +++ b/lib/test/lib/classifiers/hmm/test_hmm.py @@ -1,8 +1,4 @@ -import pytest -import warnings -import os -import json -import numpy as np +import pytest, warnings, os, json, numpy as np from copy import deepcopy with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) diff --git a/lib/test/lib/classifiers/hmm/test_hmm_classifier.py b/lib/test/lib/classifiers/hmm/test_hmm_classifier.py index 00284cc4..e9972ebc 100644 --- a/lib/test/lib/classifiers/hmm/test_hmm_classifier.py +++ b/lib/test/lib/classifiers/hmm/test_hmm_classifier.py @@ -1,8 +1,4 @@ -import pytest -import warnings -import os -import json -import numpy as np +import pytest, warnings, os, json, numpy as np from copy import deepcopy with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) diff --git a/lib/test/lib/classifiers/hmm/test_topologies.py b/lib/test/lib/classifiers/hmm/test_topologies.py index f4d9f9f7..9fa4fa00 100644 --- a/lib/test/lib/classifiers/hmm/test_topologies.py +++ b/lib/test/lib/classifiers/hmm/test_topologies.py @@ -1,6 +1,4 @@ -import pytest -import warnings -import numpy as np +import pytest, warnings, numpy as np from sequentia.classifiers import _Topology, _LeftRightTopology, _ErgodicTopology from ....support import assert_equal, assert_all_equal, assert_distribution diff --git a/lib/test/lib/internals/test_validator.py b/lib/test/lib/internals/test_validator.py index ca7e1710..94a90ed5 100644 --- a/lib/test/lib/internals/test_validator.py +++ b/lib/test/lib/internals/test_validator.py @@ -1,5 +1,4 @@ -import pytest -import numpy as np +import pytest, numpy as np from sequentia.internals import _Validator from ...support import assert_equal, assert_all_equal diff --git a/lib/test/lib/preprocessing/test_preprocess.py b/lib/test/lib/preprocessing/test_preprocess.py index f0ec10d3..7c39596d 100644 --- a/lib/test/lib/preprocessing/test_preprocess.py +++ b/lib/test/lib/preprocessing/test_preprocess.py @@ -1,5 +1,4 @@ -import pytest -import numpy as np +import pytest, numpy as np from sequentia.preprocessing import * from ...support import assert_equal, assert_all_equal diff --git a/lib/test/lib/preprocessing/test_transforms.py b/lib/test/lib/preprocessing/test_transforms.py index 74096a25..9061f632 100644 --- a/lib/test/lib/preprocessing/test_transforms.py +++ b/lib/test/lib/preprocessing/test_transforms.py @@ -1,5 +1,4 @@ -import pytest -import numpy as np +import pytest, numpy as np from sequentia.preprocessing.transforms import * from ...support import assert_equal, assert_all_equal From a3b937e46653ec98f25c7954c43859ff7d5e930e Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Fri, 15 May 2020 13:20:21 +0100 Subject: [PATCH 09/20] [patch:docs] Fix HMM topology documentation typo (#83) --- docs/sections/classifiers/hmm.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sections/classifiers/hmm.rst b/docs/sections/classifiers/hmm.rst index cc9db106..cc490f31 100644 --- a/docs/sections/classifiers/hmm.rst +++ b/docs/sections/classifiers/hmm.rst @@ -50,7 +50,7 @@ modeling. Mathematically, a left-right HMM is defined by an upper-triangular tra If we allow transitions to any state at any time, this HMM topology is known as **ergodic**. -**Note**: Ergodicity is mathematically defined as having a transition matrix with no non-zero entries. +**Note**: Ergodicity is mathematically defined as having a transition matrix with no zero entries. Using the ergodic topology in Sequentia will still permit zero entries in the transition matrix, but will issue a warning stating that those probabilities will not be learned. From 0525672e6bd1e60997a5f2a5c1a684c21db7ef7e Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Fri, 15 May 2020 13:53:11 +0100 Subject: [PATCH 10/20] [patch:lib] Remove nested helper functions in DTWKNN.predict() (#84) --- lib/sequentia/classifiers/dtwknn/dtwknn.py | 43 ++++++++++------------ 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/lib/sequentia/classifiers/dtwknn/dtwknn.py b/lib/sequentia/classifiers/dtwknn/dtwknn.py index f90222d8..acd69d16 100644 --- a/lib/sequentia/classifiers/dtwknn/dtwknn.py +++ b/lib/sequentia/classifiers/dtwknn/dtwknn.py @@ -77,42 +77,39 @@ def predict(self, X, verbose=True, n_jobs=1): # FastDTW distance measure distance = lambda x1, x2: fastdtw(x1, x2, radius=self._radius, dist=self._metric)[0] - def find_modes(distances): - idx = np.argpartition(distances, self._k)[:self._k] - neighbor_labels = [self._y[i] for i in idx] - # Find the modal labels - counter = Counter(neighbor_labels) - max_count = max(counter.values()) - return [k for k, v in counter.items() if v == max_count] - if isinstance(X, np.ndarray): distances = [distance(X, x) for x in tqdm.auto.tqdm(self._X, desc='Calculating distances', disable=not(verbose))] - modes = find_modes(distances) - # Randomly select one of the modal labels - return random.choice(modes) + return self._find_nearest(distances) else: if n_jobs == 1: labels = [] for O in tqdm.auto.tqdm(X, desc='Classifying examples', disable=not(verbose)): distances = [distance(O, x) for x in self._X] - modes = find_modes(distances) - # Randomly select one of the modal labels - labels.append(random.choice(modes)) + labels.append(self._find_nearest(distances)) return labels else: - def parallel_predict(process, X_chunk): - labels = [] - for O in tqdm.tqdm(X_chunk, desc='Classifying examples (process {})'.format(process), disable=not(verbose), position=process-1): - distances = [distance(O, x) for x in self._X] - modes = find_modes(distances) - labels.append(random.choice(modes)) - return labels - n_jobs = cpu_count() if n_jobs == -1 else n_jobs X_chunks = [list(chunk) for chunk in np.array_split(X, n_jobs)] - labels = Parallel(n_jobs=n_jobs)(delayed(parallel_predict)(i+1, chunk) for i, chunk in enumerate(X_chunks)) + labels = Parallel(n_jobs=n_jobs)(delayed(self._parallel_predict)(i+1, chunk, distance, verbose) for i, chunk in enumerate(X_chunks)) return [label for sublist in labels for label in sublist] # Flatten the resulting array + def _find_nearest(self, distances): + idx = np.argpartition(distances, self._k)[:self._k] + neighbor_labels = [self._y[i] for i in idx] + # Find the most common (mode) labels + counter = Counter(neighbor_labels) + max_count = max(counter.values()) + modes = [k for k, v in counter.items() if v == max_count] + # Randomly pick from the set of labels with the maximum count + return random.choice(modes) + + def _parallel_predict(self, process, chunk, distance, verbose): + labels = [] + for O in tqdm.tqdm(chunk, desc='Classifying examples (process {})'.format(process), disable=not(verbose), position=process-1): + distances = [distance(O, x) for x in self._X] + labels.append(self._find_nearest(distances)) + return labels + def evaluate(self, X, y, labels=None, verbose=True, n_jobs=1): """Evaluates the performance of the classifier on a batch of observation sequences and their labels. From 7b1009666447a30914c9fc22ed36b482d15e131e Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Sat, 16 May 2020 01:33:52 +0100 Subject: [PATCH 11/20] [add:lib] Add strict left-right HMM topology (#85) --- docs/sections/classifiers/hmm.rst | 7 +- lib/sequentia/classifiers/__init__.py | 2 +- lib/sequentia/classifiers/hmm/__init__.py | 2 +- lib/sequentia/classifiers/hmm/hmm.py | 15 +- .../classifiers/hmm/topologies/__init__.py | 1 + .../classifiers/hmm/topologies/ergodic.py | 3 - .../classifiers/hmm/topologies/left_right.py | 5 +- .../hmm/topologies/strict_left_right.py | 59 ++++++ lib/test/lib/classifiers/hmm/test_hmm.py | 169 +++++++++++++++++- .../lib/classifiers/hmm/test_topologies.py | 96 +++++++++- 10 files changed, 339 insertions(+), 20 deletions(-) create mode 100644 lib/sequentia/classifiers/hmm/topologies/strict_left_right.py diff --git a/docs/sections/classifiers/hmm.rst b/docs/sections/classifiers/hmm.rst index cc490f31..b302559e 100644 --- a/docs/sections/classifiers/hmm.rst +++ b/docs/sections/classifiers/hmm.rst @@ -48,14 +48,17 @@ from transitioning to previous states (this is shown in the figure above). This to what known as a **left-right** HMM, and is the most commonly used type of HMM for sequential modeling. Mathematically, a left-right HMM is defined by an upper-triangular transition matrix. +A **strict left-right** topology is one in which transitions are only permitted to the current state +and the next state, i.e. no state-jumping is permitted. + If we allow transitions to any state at any time, this HMM topology is known as **ergodic**. **Note**: Ergodicity is mathematically defined as having a transition matrix with no zero entries. Using the ergodic topology in Sequentia will still permit zero entries in the transition matrix, but will issue a warning stating that those probabilities will not be learned. -Sequentia offers both topologies, specified by a string parameter ``topology`` in the -:class:`~HMM` constructor that takes values `'left-right'` or `'ergodic'`. +Sequentia offers all three topologies, specified by a string parameter ``topology`` in the +:class:`~HMM` constructor that takes values `'left-right'`, `'strict-left-right'` or `'ergodic'`. Making Predictions ------------------ diff --git a/lib/sequentia/classifiers/__init__.py b/lib/sequentia/classifiers/__init__.py index 40baa7ad..b8c42468 100644 --- a/lib/sequentia/classifiers/__init__.py +++ b/lib/sequentia/classifiers/__init__.py @@ -1,5 +1,5 @@ from .hmm import ( HMM, HMMClassifier, - _Topology, _LeftRightTopology, _ErgodicTopology + _Topology, _LeftRightTopology, _ErgodicTopology, _StrictLeftRightTopology ) from .dtwknn import DTWKNN \ No newline at end of file diff --git a/lib/sequentia/classifiers/hmm/__init__.py b/lib/sequentia/classifiers/hmm/__init__.py index 8afb0a8d..44131c0f 100644 --- a/lib/sequentia/classifiers/hmm/__init__.py +++ b/lib/sequentia/classifiers/hmm/__init__.py @@ -1,3 +1,3 @@ from .hmm import HMM from .hmm_classifier import HMMClassifier -from .topologies import _Topology, _LeftRightTopology, _ErgodicTopology \ No newline at end of file +from .topologies import _Topology, _LeftRightTopology, _ErgodicTopology, _StrictLeftRightTopology \ No newline at end of file diff --git a/lib/sequentia/classifiers/hmm/hmm.py b/lib/sequentia/classifiers/hmm/hmm.py index 979b1dd1..2bdb6e09 100644 --- a/lib/sequentia/classifiers/hmm/hmm.py +++ b/lib/sequentia/classifiers/hmm/hmm.py @@ -1,6 +1,7 @@ import numpy as np, pomegranate as pg, json from .topologies.ergodic import _ErgodicTopology from .topologies.left_right import _LeftRightTopology +from .topologies.strict_left_right import _StrictLeftRightTopology from ...internals import _Validator class HMM: @@ -14,7 +15,7 @@ class HMM: n_states: int The number of states for the model. - topology: {'ergodic', 'left-right'} + topology: {'ergodic', 'left-right', 'strict-left-right'} The topology for the model. random_state: numpy.random.RandomState, int, optional @@ -43,13 +44,13 @@ def __init__(self, label, n_states, topology='left-right', random_state=None): self._label = self._val.string(label, 'model label') self._n_states = self._val.restricted_integer( n_states, lambda x: x > 0, desc='number of states', expected='greater than zero') - self._val.one_of(topology, ['ergodic', 'left-right'], desc='topology') + self._val.one_of(topology, ['ergodic', 'left-right', 'strict-left-right'], desc='topology') self._random_state = self._val.random_state(random_state) - - if topology == 'ergodic': - self._topology = _ErgodicTopology(self._n_states, self._random_state) - elif topology == 'left-right': - self._topology = _LeftRightTopology(self._n_states, self._random_state) + self._topology = { + 'ergodic': _ErgodicTopology, + 'left-right': _LeftRightTopology, + 'strict-left-right': _StrictLeftRightTopology + }[topology](self._n_states, self._random_state) def set_uniform_initial(self): """Sets a uniform initial state distribution.""" diff --git a/lib/sequentia/classifiers/hmm/topologies/__init__.py b/lib/sequentia/classifiers/hmm/topologies/__init__.py index 8c1423e4..237b1bc9 100644 --- a/lib/sequentia/classifiers/hmm/topologies/__init__.py +++ b/lib/sequentia/classifiers/hmm/topologies/__init__.py @@ -1,3 +1,4 @@ from .topology import _Topology from .left_right import _LeftRightTopology +from .strict_left_right import _StrictLeftRightTopology from .ergodic import _ErgodicTopology \ No newline at end of file diff --git a/lib/sequentia/classifiers/hmm/topologies/ergodic.py b/lib/sequentia/classifiers/hmm/topologies/ergodic.py index 4a1c661e..d63f27ca 100644 --- a/lib/sequentia/classifiers/hmm/topologies/ergodic.py +++ b/lib/sequentia/classifiers/hmm/topologies/ergodic.py @@ -14,9 +14,6 @@ class _ErgodicTopology(_Topology): A random state object for reproducible randomness. """ - def __init__(self, n_states: int, random_state: np.random.RandomState): - super().__init__(n_states, random_state) - def uniform_transitions(self) -> np.ndarray: """Sets the transition matrix as uniform (equal probability of transitioning to all other possible states from each state) corresponding to the topology. diff --git a/lib/sequentia/classifiers/hmm/topologies/left_right.py b/lib/sequentia/classifiers/hmm/topologies/left_right.py index f78213c3..d9e0a394 100644 --- a/lib/sequentia/classifiers/hmm/topologies/left_right.py +++ b/lib/sequentia/classifiers/hmm/topologies/left_right.py @@ -13,9 +13,6 @@ class _LeftRightTopology(_Topology): A random state object for reproducible randomness. """ - def __init__(self, n_states: int, random_state: np.random.RandomState): - super().__init__(n_states, random_state) - def uniform_transitions(self) -> np.ndarray: """Sets the transition matrix as uniform (equal probability of transitioning to all other possible states from each state) corresponding to the topology. @@ -33,7 +30,7 @@ def uniform_transitions(self) -> np.ndarray: def random_transitions(self) -> np.ndarray: """Sets the transition matrix as random (random probability of transitioning to all other possible states from each state) by sampling probabilities - from a Dirichlet distribution - according to the topology. + from a Dirichlet distribution, according to the topology. Parameters ---------- diff --git a/lib/sequentia/classifiers/hmm/topologies/strict_left_right.py b/lib/sequentia/classifiers/hmm/topologies/strict_left_right.py new file mode 100644 index 00000000..b462d270 --- /dev/null +++ b/lib/sequentia/classifiers/hmm/topologies/strict_left_right.py @@ -0,0 +1,59 @@ +import numpy as np +from .topology import _Topology + +class _StrictLeftRightTopology(_Topology): + """Represents the topology for a strict left-right HMM. + + Parameters + ---------- + n_states: int + Number of states in the HMM. + + random_state: numpy.random.RandomState + A random state object for reproducible randomness. + """ + + def uniform_transitions(self) -> np.ndarray: + """Sets the transition matrix as uniform (equal probability of transitioning + to all other possible states from each state) corresponding to the topology. + + Returns + ------- + transitions: numpy.ndarray + The uniform transition matrix of shape `(n_states, n_states)`. + """ + transitions = np.zeros((self._n_states, self._n_states)) + for i, row in enumerate(transitions[:-1]): + row[i:(i+2)] = np.ones(2) / 2 + transitions[self._n_states - 1][self._n_states - 1] = 1 + return transitions + + def random_transitions(self) -> np.ndarray: + """Sets the transition matrix as random (random probability of transitioning + to all other possible states from each state) by sampling probabilities + from a Dirichlet distribution, according to the topology. + + Parameters + ---------- + transitions: numpy.ndarray + The random transition matrix of shape `(n_states, n_states)`. + """ + transitions = np.zeros((self._n_states, self._n_states)) + for i, row in enumerate(transitions[:-1]): + row[i:(i+2)] = self._random_state.dirichlet(np.ones(2)) + transitions[self._n_states - 1][self._n_states - 1] = 1 + return transitions + + def validate_transitions(self, transitions: np.ndarray) -> None: + """Validates a transition matrix according to the topology's restrictions. + + Parameters + ---------- + transitions: numpy.ndarray + The transition matrix to validate. + """ + super().validate_transitions(transitions) + if not np.allclose(transitions, np.triu(transitions)): + raise ValueError('Left-right transition matrix must be upper-triangular') + if not np.allclose(transitions, np.diag(np.diag(transitions)) + np.diag(np.diag(transitions, k=1), k=1)): + raise ValueError('Strict left-right transition matrix must only consist of a diagonal and upper diagonal') \ No newline at end of file diff --git a/lib/test/lib/classifiers/hmm/test_hmm.py b/lib/test/lib/classifiers/hmm/test_hmm.py index 6dafb20d..64a63cb8 100644 --- a/lib/test/lib/classifiers/hmm/test_hmm.py +++ b/lib/test/lib/classifiers/hmm/test_hmm.py @@ -3,7 +3,7 @@ with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) import pomegranate as pg -from sequentia.classifiers import HMM, _LeftRightTopology, _ErgodicTopology +from sequentia.classifiers import HMM, _LeftRightTopology, _ErgodicTopology, _StrictLeftRightTopology from ....support import assert_equal, assert_not_equal # Set seed for reproducible randomness @@ -18,6 +18,7 @@ # Unparameterized HMMs hmm_lr = HMM(label='c1', n_states=5, topology='left-right', random_state=rng) hmm_e = HMM(label='c1', n_states=5, topology='ergodic', random_state=rng) +hmm_slr = HMM(label='c1', n_states=5, topology='strict-left-right', random_state=rng) # ================================================== # # HMM.set_uniform_initial() + HMM.initial (property) # @@ -39,6 +40,14 @@ def test_ergodic_uniform_initial(): 0.2, 0.2, 0.2, 0.2, 0.2 ])) +def test_strict_left_right_uniform_initial(): + """Uniform initial state distribution for a strict left-right HMM""" + hmm = deepcopy(hmm_slr) + hmm.set_uniform_initial() + assert_equal(hmm.initial, np.array([ + 0.2, 0.2, 0.2, 0.2, 0.2 + ])) + # ================================================= # # HMM.set_random_initial() + HMM.initial (property) # # ================================================= # @@ -59,6 +68,14 @@ def test_ergodic_random_initial(): 0.35029635, 0.13344569, 0.02784745, 0.33782453, 0.15058597 ])) +def test_strict_left_right_random_initial(): + """Random initial state distribution for a strict left-right HMM""" + hmm = deepcopy(hmm_slr) + hmm.set_random_initial() + assert_equal(hmm.initial, np.array([ + 0.35029635, 0.13344569, 0.02784745, 0.33782453, 0.15058597 + ])) + # ========================================================== # # HMM.set_uniform_transitions() + HMM.transitions (property) # # ========================================================== # @@ -87,6 +104,18 @@ def test_ergodic_uniform_transitions(): [0.2, 0.2, 0.2, 0.2, 0.2] ])) +def test_strict_left_right_uniform_transitions(): + """Uniform transition matrix for a strict left-right HMM""" + hmm = deepcopy(hmm_slr) + hmm.set_uniform_transitions() + assert_equal(hmm.transitions, np.array([ + [0.5, 0.5, 0. , 0. , 0. ], + [0. , 0.5, 0.5, 0. , 0. ], + [0. , 0. , 0.5, 0.5, 0. ], + [0. , 0. , 0. , 0.5, 0.5], + [0. , 0. , 0. , 0. , 1. ] + ])) + # ========================================================= # # HMM.set_random_transitions() + HMM.transitions (property) # # ========================================================= # @@ -115,6 +144,18 @@ def test_ergodic_random_transitions(): [0.21312406, 0.35221103, 0.08556524, 0.06613143, 0.28296824] ])) +def test_strict_left_right_random_transitions(): + """Random transition matrix for a strict left-right HMM""" + hmm = deepcopy(hmm_slr) + hmm.set_random_transitions() + assert_equal(hmm.transitions, np.array([ + [0.72413873, 0.27586127, 0. , 0. , 0. ], + [0. , 0.07615418, 0.92384582, 0. , 0. ], + [0. , 0. , 0.81752797, 0.18247203, 0. ], + [0. , 0. , 0. , 0.24730529, 0.75269471], + [0. , 0. , 0. , 0. , 1. ] + ])) + # ====================== # # HMM.fit() + HMM.n_seqs # # ====================== # @@ -220,6 +261,38 @@ def test_ergodic_fit_doesnt_updates_transitions(): hmm.fit(X) assert_equal(hmm.transitions, before) +def test_strict_left_right_fit_updates_initial(): + """Check that fitting updates the initial state distribution of a strict left-right HMM""" + hmm = deepcopy(hmm_slr) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + assert_equal(hmm.initial, np.array([ + 0.2, 0.2, 0.2, 0.2, 0.2 + ])) + before = hmm.initial + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + assert_not_equal(hmm.initial, before) + +def test_strict_left_right_fit_updates_transitions(): + """Check that fitting updates the transition matrix of a strict left-right HMM""" + hmm = deepcopy(hmm_slr) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + before = hmm.transitions + assert_equal(hmm.transitions, np.array([ + [0.5 , 0.5 , 0. , 0. , 0. ], + [0. , 0.5 , 0.5 , 0. , 0. ], + [0. , 0. , 0.5 , 0.5 , 0. ], + [0. , 0. , 0. , 0.5 , 0.5 ], + [0. , 0. , 0. , 0. , 1. ] + ])) + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + assert_not_equal(hmm.transitions, before) + # ============= # # HMM.forward() # # ============= # @@ -253,6 +326,16 @@ def test_ergodic_forward(): hmm.fit(X) assert isinstance(hmm.forward(x), float) +def test_strict_left_right_forward(): + """Forward algorithm on a strict left-right HMM""" + hmm = deepcopy(hmm_slr) + hmm.set_random_initial() + hmm.set_random_transitions() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + assert isinstance(hmm.forward(x), float) + # ==================== # # HMM.label (property) # # ==================== # @@ -332,6 +415,14 @@ def test_left_right_initial_ergodic(): hmm.initial = initial assert_equal(hmm.initial, initial) +def test_left_right_initial_strict_left_right(): + """Set an initial state distribution generated by a left-right topology on an strict left-right HMM""" + hmm = deepcopy(hmm_lr) + topology = _StrictLeftRightTopology(n_states=5, random_state=rng) + initial = topology.random_initial() + hmm.initial = initial + assert_equal(hmm.initial, initial) + def test_ergodic_initial_left_right(): """Set an initial state distribution generated by an ergodic topology on a left-right HMM""" hmm = deepcopy(hmm_e) @@ -348,6 +439,38 @@ def test_ergodic_initial_ergodic(): hmm.initial = initial assert_equal(hmm.initial, initial) +def test_ergodic_initial_strict_left_right(): + """Set an initial state distribution generated by an ergodic topology on a strict left-right HMM""" + hmm = deepcopy(hmm_e) + topology = _StrictLeftRightTopology(n_states=5, random_state=rng) + initial = topology.random_initial() + hmm.initial = initial + assert_equal(hmm.initial, initial) + +def test_strict_left_right_initial_left_right(): + """Set an initial state distribution generated by a strict left-right topology on a left-right HMM""" + hmm = deepcopy(hmm_slr) + topology = _LeftRightTopology(n_states=5, random_state=rng) + initial = topology.random_initial() + hmm.initial = initial + assert_equal(hmm.initial, initial) + +def test_strict_left_right_initial_ergodic(): + """Set an initial state distribution generated by a strict left-right topology on an ergodic HMM""" + hmm = deepcopy(hmm_slr) + topology = _ErgodicTopology(n_states=5, random_state=rng) + initial = topology.random_initial() + hmm.initial = initial + assert_equal(hmm.initial, initial) + +def test_strict_left_right_initial_strict_left_right(): + """Set an initial state distribution generated by a strict left-right topology on an strict left-right HMM""" + hmm = deepcopy(hmm_slr) + topology = _StrictLeftRightTopology(n_states=5, random_state=rng) + initial = topology.random_initial() + hmm.initial = initial + assert_equal(hmm.initial, initial) + # ======================== # # HMM.transitions (setter) # # ======================== # @@ -369,6 +492,14 @@ def test_left_right_transitions_ergodic(): hmm.transitions = transitions assert str(e.value) == 'Left-right transition matrix must be upper-triangular' +def test_left_right_transitions_strict_left_right(): + """Set a transition matrix generated by a left-right topology on a strict left-right HMM""" + hmm = deepcopy(hmm_lr) + topology = _StrictLeftRightTopology(n_states=5, random_state=rng) + transitions = topology.random_transitions() + hmm.transitions = transitions + assert_equal(hmm.transitions, transitions) + def test_ergodic_transitions_left_right(): """Set a transition matrix generated by an ergodic topology on a left-right HMM""" hmm = deepcopy(hmm_e) @@ -387,6 +518,42 @@ def test_ergodic_transitions_ergodic(): hmm.transitions = transitions assert_equal(hmm.transitions, transitions) +def test_ergodic_transitions_strict_left_right(): + """Set a transition matrix generated by an ergodic topology on a strict left-right HMM""" + hmm = deepcopy(hmm_e) + topology = _StrictLeftRightTopology(n_states=5, random_state=rng) + transitions = topology.random_transitions() + with pytest.warns(UserWarning) as w: + hmm.transitions = transitions + assert w[0].message.args[0] == 'Zero probabilities in ergodic transition matrix - these transition probabilities will not be learned' + assert_equal(hmm.transitions, transitions) + +def test_strict_left_right_transitions_left_right(): + """Set a transition matrix generated by a strict left-right topology on a left-right HMM""" + hmm = deepcopy(hmm_slr) + topology = _LeftRightTopology(n_states=5, random_state=rng) + transitions = topology.random_transitions() + with pytest.raises(ValueError) as e: + hmm.transitions = transitions + assert str(e.value) == 'Strict left-right transition matrix must only consist of a diagonal and upper diagonal' + +def test_strict_left_right_transitions_ergodic(): + """Set a transition matrix generated by a strict left-right topology on an ergodic HMM""" + hmm = deepcopy(hmm_slr) + topology = _ErgodicTopology(n_states=5, random_state=rng) + transitions = topology.random_transitions() + with pytest.raises(ValueError) as e: + hmm.transitions = transitions + assert str(e.value) == 'Left-right transition matrix must be upper-triangular' + +def test_strict_left_right_transitions_strict_left_right(): + """Set a transition matrix generated by a strict left-right topology on a strict left-right HMM""" + hmm = deepcopy(hmm_slr) + topology = _StrictLeftRightTopology(n_states=5, random_state=rng) + transitions = topology.random_transitions() + hmm.transitions = transitions + assert_equal(hmm.transitions, transitions) + # ============= # # HMM.as_dict() # # ============= # diff --git a/lib/test/lib/classifiers/hmm/test_topologies.py b/lib/test/lib/classifiers/hmm/test_topologies.py index 9fa4fa00..599bd7d3 100644 --- a/lib/test/lib/classifiers/hmm/test_topologies.py +++ b/lib/test/lib/classifiers/hmm/test_topologies.py @@ -1,5 +1,5 @@ import pytest, warnings, numpy as np -from sequentia.classifiers import _Topology, _LeftRightTopology, _ErgodicTopology +from sequentia.classifiers import _Topology, _LeftRightTopology, _ErgodicTopology, _StrictLeftRightTopology from ....support import assert_equal, assert_all_equal, assert_distribution # Set seed for reproducible randomness @@ -254,4 +254,98 @@ def test_ergodic_validate_transitions_valid(): """Validate a valid ergodic transition matrix""" topology = _ErgodicTopology(n_states=5, random_state=rng) transitions = topology.random_transitions() + topology.validate_transitions(transitions) + +# ======================== # +# _StrictLeftRightTopology # +# ======================== # + +# ---------------------------------------------- # +# _StrictLeftRightTopology.uniform_transitions() # +# ---------------------------------------------- # + +def test_strict_left_right_uniform_transitions_min(): + """Generate a uniform strict left-right transition matrix with minimal states""" + topology = _StrictLeftRightTopology(n_states=1, random_state=rng) + transitions = topology.uniform_transitions() + assert_distribution(transitions) + assert_equal(transitions, np.array([ + [1.] + ])) + +def test_strict_left_right_uniform_transitions_small(): + """Generate a uniform strict left-right transition matrix with few states""" + topology = _StrictLeftRightTopology(n_states=2, random_state=rng) + transitions = topology.uniform_transitions() + assert_distribution(transitions) + assert_equal(transitions, np.array([ + [0.5, 0.5], + [0. , 1. ] + ])) + +def test_strict_left_right_uniform_transitions_many(): + """Generate a uniform strict left-right transition matrix with many states""" + topology = _StrictLeftRightTopology(n_states=5, random_state=rng) + transitions = topology.uniform_transitions() + assert_distribution(transitions) + assert_equal(transitions, np.array([ + [0.5, 0.5 , 0. , 0. , 0. ], + [0. , 0.5 , 0.5 , 0. , 0. ], + [0. , 0. , 0.5 , 0.5 , 0. ], + [0. , 0. , 0. , 0.5 , 0.5 ], + [0. , 0. , 0. , 0. , 1. ] + ])) + +# --------------------------------------------- # +# _StrictLeftRightTopology.random_transitions() # +# --------------------------------------------- # + +def test_strict_left_right_random_transitions_min(): + """Generate a random strict left-right transition matrix with minimal states""" + topology = _StrictLeftRightTopology(n_states=1, random_state=rng) + transitions = topology.random_transitions() + assert_distribution(transitions) + assert_equal(transitions, np.array([ + [1.] + ])) + +def test_strict_left_right_random_transitions_small(): + """Generate a random strict left-right transition matrix with few states""" + topology = _StrictLeftRightTopology(n_states=2, random_state=rng) + transitions = topology.random_transitions() + assert_distribution(transitions) + assert_equal(transitions, np.array([ + [0.87426829, 0.12573171], + [0. , 1. ] + ])) + +def test_strict_left_right_random_transitions_many(): + """Generate a random strict left-right transition matrix with many states""" + topology = _StrictLeftRightTopology(n_states=5, random_state=rng) + transitions = topology.random_transitions() + assert_distribution(transitions) + assert_equal(transitions, np.array([ + [0.9294571 , 0.0705429 , 0. , 0. , 0. ], + [0. , 0.92269318, 0.07730682, 0. , 0. ], + [0. , 0. , 0.86161736, 0.13838264, 0. ], + [0. , 0. , 0. , 0.13863688, 0.86136312], + [0. , 0. , 0. , 0. , 1. ] + ])) + +# ----------------------------------------------- # +# _StrictLeftRightTopology.validate_transitions() # +# ----------------------------------------------- # + +def test_strict_left_right_validate_transitions_invalid(): + """Validate an invalid strict left-right transition matrix""" + topology = _StrictLeftRightTopology(n_states=5, random_state=rng) + transitions = _ErgodicTopology(n_states=5, random_state=rng).random_transitions() + with pytest.raises(ValueError) as e: + topology.validate_transitions(transitions) + assert str(e.value) == 'Left-right transition matrix must be upper-triangular' + +def test_strict_left_right_validate_transitions_valid(): + """Validate a valid strict left-right transition matrix""" + topology = _StrictLeftRightTopology(n_states=5, random_state=rng) + transitions = topology.random_transitions() topology.validate_transitions(transitions) \ No newline at end of file From 97f5c3bb3bde6e15a252a47a55041a43a75e4de0 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Sat, 16 May 2020 20:05:25 +0100 Subject: [PATCH 12/20] [patch:lib] Fix strict left-right topology serialization (#86) --- lib/sequentia/classifiers/hmm/hmm.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/sequentia/classifiers/hmm/hmm.py b/lib/sequentia/classifiers/hmm/hmm.py index 2bdb6e09..81825280 100644 --- a/lib/sequentia/classifiers/hmm/hmm.py +++ b/lib/sequentia/classifiers/hmm/hmm.py @@ -46,11 +46,9 @@ def __init__(self, label, n_states, topology='left-right', random_state=None): n_states, lambda x: x > 0, desc='number of states', expected='greater than zero') self._val.one_of(topology, ['ergodic', 'left-right', 'strict-left-right'], desc='topology') self._random_state = self._val.random_state(random_state) - self._topology = { - 'ergodic': _ErgodicTopology, - 'left-right': _LeftRightTopology, - 'strict-left-right': _StrictLeftRightTopology - }[topology](self._n_states, self._random_state) + self._topologies = {'ergodic': _ErgodicTopology, 'left-right': _LeftRightTopology, 'strict-left-right': _StrictLeftRightTopology} + self._topologies.update(dict([reversed(i) for i in self._topologies.items()])) + self._topology = self._topologies[topology](self._n_states, self._random_state) def set_uniform_initial(self): """Sets a uniform initial state distribution.""" @@ -198,7 +196,7 @@ def as_dict(self): return { 'label': self._label, 'n_states': self._n_states, - 'topology': 'ergodic' if isinstance(self._topology, _ErgodicTopology) else 'left-right', + 'topology': self._topologies[self._topology.__class__], 'model': { 'initial': self._initial.tolist(), 'transitions': self._transitions.tolist(), From c90652495169ab7991c448d7d2a418be7dfc0c99 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Sun, 17 May 2020 13:48:32 +0100 Subject: [PATCH 13/20] [add:lib] Implement GMM-HMMs (#87) * Implement GMMHMMs * Fix strict left-right topology serialization for GMMHMM * Finish GMMHMM documentation * Finish GMMHMM documentation * Fix GMMHMM.as_dict method reference typo * Validate stored models before deserialization * Finish GMMHMM tests * Update README * Attempt to fix randomness in HMM and GMMHMM tests --- README.md | 4 +- docs/_includes/examples/classifiers/gmmhmm.py | 11 + docs/conf.py | 2 +- docs/sections/classifiers/hmm.rst | 39 +++- lib/sequentia/classifiers/__init__.py | 2 +- lib/sequentia/classifiers/hmm/__init__.py | 1 + lib/sequentia/classifiers/hmm/gmmhmm.py | 197 +++++++++++++++++ lib/sequentia/classifiers/hmm/hmm.py | 9 + .../classifiers/hmm/hmm_classifier.py | 27 ++- lib/test/lib/classifiers/hmm/test_gmmhmm.py | 201 ++++++++++++++++++ lib/test/lib/classifiers/hmm/test_hmm.py | 34 ++- 11 files changed, 495 insertions(+), 32 deletions(-) create mode 100644 docs/_includes/examples/classifiers/gmmhmm.py create mode 100644 lib/sequentia/classifiers/hmm/gmmhmm.py create mode 100644 lib/test/lib/classifiers/hmm/test_gmmhmm.py diff --git a/README.md b/README.md index 0877f28f..f19bc4cd 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Sequentia offers the use of multivariate observation sequences with varying dura - [x] Hidden Markov Models (via [Pomegranate](https://github.com/jmschrei/pomegranate) [[1]](#references)) - [x] Multivariate Gaussian Emissions - - [ ] Gaussian Mixture Model Emissions (_soon!_) + - [x] Gaussian Mixture Model Emissions (full and diagonal covariances) - [x] Left-Right and Ergodic Topologies - [x] Approximate Dynamic Time Warping k-Nearest Neighbors (implemented with [FastDTW](https://github.com/slaypni/fastdtw) [[2]](#references)) - [ ] Long Short-Term Memory Networks (_soon!_) @@ -67,8 +67,6 @@ Sequentia offers the use of multivariate observation sequences with varying dura - [x] Multi-processing for DTW k-NN predictions -> **Disclaimer**: The package currently remains largely untested and is still in its early stages – _use with caution_! - ## Installation ```console diff --git a/docs/_includes/examples/classifiers/gmmhmm.py b/docs/_includes/examples/classifiers/gmmhmm.py new file mode 100644 index 00000000..966306ec --- /dev/null +++ b/docs/_includes/examples/classifiers/gmmhmm.py @@ -0,0 +1,11 @@ +import numpy as np +from sequentia.classifiers import GMMHMM + +# Create some sample data +X = [np.random.random((10 * i, 3)) for i in range(1, 4)] + +# Create and fit a left-right HMM with random transitions and initial state distribution +hmm = GMMHMM(label='class1', n_states=5, n_components=3, covariance='diagonal', topology='left-right') +hmm.set_random_initial() +hmm.set_random_transitions() +hmm.fit(X) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index fc8c831d..610de59b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -40,7 +40,7 @@ 'm2r' ] -autodoc_member_order = 'bysource' +# autodoc_member_order = 'bysource' autosummary_generate = True numpydoc_show_class_members = False diff --git a/docs/sections/classifiers/hmm.rst b/docs/sections/classifiers/hmm.rst index b302559e..15411265 100644 --- a/docs/sections/classifiers/hmm.rst +++ b/docs/sections/classifiers/hmm.rst @@ -91,10 +91,47 @@ API reference .. autoclass:: sequentia.classifiers.hmm.HMM :members: +Hidden Markov Model with Gaussian Mixture Emissions (``GMMHMM``) +================================================================ + +The assumption that a single multivariate Gaussian emission distribution +is accurate and representative enough to model the probability of observation +vectors of any state of a HMM is often a very strong and naive one. + +Instead, a more powerful approach is to represent the emission distribution as +a mixture of multiple multivariate Gaussian densities. An emission distribution +for state :math:`m`, formed by a mixture of :math:`G` multivariate Gaussian densities is defined as: + +.. math:: + b_m(\mathbf{o}^{(t)}) = \sum_{g=1}^G c_g^{(m)} \mathcal{N}\big(\mathbf{o}^{(t)}\ ;\ \boldsymbol\mu_g^{(m)}, \Sigma_g^{(m)}\big) + +where :math:`\mathbf{o}^{(t)}` is an observation vector at time :math:`t`, +:math:`c_g^{(m)}` is a *mixing coefficient* such that :math:`\sum_{g=1}^G c_g^{(m)} = 1` +and :math:`\boldsymbol\mu_g^{(m)}` and :math:`\Sigma_g^{(m)}` are the mean vector +and covariance matrix of the :math:`g^\text{th}` mixture component of the :math:`m^\text{th}` +state, respectively. + +Even in the case that multiple Gaussian densities are not needed, the mixing coefficients +can be adjusted so that irrelevant Gaussians are omitted and only a single Gaussian remains. + +Example +------- + +.. literalinclude:: ../../_includes/examples/classifiers/gmmhmm.py + :language: python + :linenos: + +API reference +------------- + +.. autoclass:: sequentia.classifiers.hmm.GMMHMM + :inherited-members: + :members: + Hidden Markov Model Classifier (``HMMClassifier``) ================================================== -Multiple HMMs can be combined to form a multi-class classifier. +Multiple HMMs (and/or GMMHMMs) can be combined to form a multi-class classifier. To classify a new observation sequence :math:`O'`, this works by: 1. | Creating and training the HMMs :math:`\lambda_1, \lambda_2, \ldots, \lambda_N`. diff --git a/lib/sequentia/classifiers/__init__.py b/lib/sequentia/classifiers/__init__.py index b8c42468..a77871d2 100644 --- a/lib/sequentia/classifiers/__init__.py +++ b/lib/sequentia/classifiers/__init__.py @@ -1,5 +1,5 @@ from .hmm import ( - HMM, HMMClassifier, + HMM, GMMHMM, HMMClassifier, _Topology, _LeftRightTopology, _ErgodicTopology, _StrictLeftRightTopology ) from .dtwknn import DTWKNN \ No newline at end of file diff --git a/lib/sequentia/classifiers/hmm/__init__.py b/lib/sequentia/classifiers/hmm/__init__.py index 44131c0f..c8f88f1c 100644 --- a/lib/sequentia/classifiers/hmm/__init__.py +++ b/lib/sequentia/classifiers/hmm/__init__.py @@ -1,3 +1,4 @@ from .hmm import HMM +from .gmmhmm import GMMHMM from .hmm_classifier import HMMClassifier from .topologies import _Topology, _LeftRightTopology, _ErgodicTopology, _StrictLeftRightTopology \ No newline at end of file diff --git a/lib/sequentia/classifiers/hmm/gmmhmm.py b/lib/sequentia/classifiers/hmm/gmmhmm.py new file mode 100644 index 00000000..15402522 --- /dev/null +++ b/lib/sequentia/classifiers/hmm/gmmhmm.py @@ -0,0 +1,197 @@ +import numpy as np, pomegranate as pg, json +from .hmm import HMM + +class GMMHMM(HMM): + """A hidden Markov model representing an isolated temporal sequence class, + with mixtures of multivariate Gaussian components representing state emission distributions. + + Parameters + ---------- + label: str + A label for the model, corresponding to the class being represented. + + n_states: int + The number of states for the model. + + n_components: int + The number of mixture components used in the emission distribution for each state. + + covariance: {'diagonal', 'full'} + The covariance matrix type. + + topology: {'ergodic', 'left-right', 'strict-left-right'} + The topology for the model. + + random_state: numpy.random.RandomState, int, optional + A random state object or seed for reproducible randomness. + + Attributes + ---------- + label: str + The label for the model. + + n_states: int + The number of states for the model. + + n_seqs: int + The number of observation sequences use to train the model. + + initial: numpy.ndarray + The initial state distribution of the model. + + transitions: numpy.ndarray + The transition matrix of the model. + """ + + def __init__(self, label, n_states, n_components, covariance='diagonal', topology='left-right', random_state=None): + super().__init__(label, n_states, topology, random_state) + self._n_components = self._val.restricted_integer( + n_components, lambda x: x > 1, desc='number of mixture components', expected='greater than one') + self._covariance = self._val.one_of(covariance, ['diagonal', 'full'], desc='covariance matrix type') + + def fit(self, X, n_jobs=1): + """Fits the HMM to observation sequences assumed to be labeled as the class that the model represents. + + Parameters + ---------- + X: List[numpy.ndarray] + Collection of multivariate observation sequences, each of shape :math:`(T \\times D)` where + :math:`T` may vary per observation sequence. + + n_jobs: int + | The number of jobs to run in parallel. + | Setting this to -1 will use all available CPU cores. + """ + X = self._val.observation_sequences(X) + self._val.restricted_integer(n_jobs, lambda x: x == -1 or x > 0, 'number of jobs', '-1 or greater than zero') + + try: + (self._initial, self._transitions) + except AttributeError as e: + raise AttributeError('Must specify initial state distribution and transitions before the HMM can be fitted') from e + + self._n_seqs = len(X) + self._n_features = X[0].shape[1] + + # Create a mixture distribution of multivariate Gaussian emission components using combined samples for initial parameter estimation + concat = np.concatenate(X) + if self._covariance == 'diagonal': + # Use diagonal covariance matrices + dist = pg.GeneralMixtureModel( + [pg.MultivariateGaussianDistribution(concat.mean(axis=0), concat.std(axis=0) * np.eye(self._n_features)) for _ in range(self._n_components)], + self._random_state.dirichlet(np.ones(self._n_components) + ) + ) + else: + # Use full covariance matrices + dist = pg.GeneralMixtureModel.from_samples(pg.MultivariateGaussianDistribution, self._n_components, concat) + + # Create the HMM object + self._model = pg.HiddenMarkovModel.from_matrix( + name=self._label, + transition_probabilities=self._transitions, + distributions=[dist.copy() for _ in range(self._n_states)], + starts=self._initial + ) + + # Perform the Baum-Welch algorithm to fit the model to the observations + self._model.fit(X, n_jobs=n_jobs) + + # Update the initial state distribution and transitions to reflect the updated parameters + inner_tx = self._model.dense_transition_matrix()[:, :self._n_states] + self._initial = inner_tx[self._n_states] + self._transitions = inner_tx[:self._n_states] + + @property + def n_components(self): + return self._n_components + + @property + def covariance(self): + return self._covariance + + def as_dict(self): + """Serializes the :class:`GMMHMM` object into a `dict`, ready to be stored in JSON format. + + Returns + ------- + serialized: dict + JSON-ready serialization of the :class:`GMMHMM` object. + """ + + try: + self._model + except AttributeError as e: + raise AttributeError('The model needs to be fitted before it can be exported to a dict') from e + + model = self._model.to_json() + + if 'NaN' in model: + raise ValueError('Encountered NaN value(s) in HMM parameters') + else: + return { + 'type': 'GMMHMM', + 'label': self._label, + 'n_states': self._n_states, + 'n_components': self._n_components, + 'covariance': self._covariance, + 'topology': self._topologies[self._topology.__class__], + 'model': { + 'initial': self._initial.tolist(), + 'transitions': self._transitions.tolist(), + 'n_seqs': self._n_seqs, + 'n_features': self._n_features, + 'hmm': json.loads(model) + } + } + + @classmethod + def load(cls, data, random_state=None): + """Deserializes either a `dict` or JSON serialized :class:`GMMHMM` object. + + Parameters + ---------- + data: str or dict + - File path of the serialized JSON data generated by the :meth:`save` method. + - `dict` representation of the :class:`GMMHMM`, generated by the :meth:`as_dict` method. + + random_state: numpy.random.RandomState, int, optional + A random state object or seed for reproducible randomness. + + Returns + ------- + deserialized: :class:`GMMHMM` + The deserialized HMM object. + + See Also + -------- + save: Serializes a :class:`GMMHMM` into a JSON file. + as_dict: Generates a `dict` representation of the :class:`GMMHMM`. + """ + + # Load the serialized GMMHMM data + if isinstance(data, dict): + pass + elif isinstance(data, str): + with open(data, 'r') as f: + data = json.load(f) + else: + pass + + # Check that JSON is in the "correct" format + if data['type'] == 'HMM': + raise ValueError('You must use the HMM class to deserialize a stored HMM model') + elif data['type'] == 'GMMHMM': + pass + else: + raise ValueError("Attempted to deserialize an invalid model - expected 'type' field to be 'GMMHMM'") + + # Deserialize the data into a GMMHMM object + gmmhmm = cls(data['label'], data['n_states'], data['n_components'], data['covariance'], data['topology'], random_state=random_state) + gmmhmm._initial = np.array(data['model']['initial']) + gmmhmm._transitions = np.array(data['model']['transitions']) + gmmhmm._n_seqs = data['model']['n_seqs'] + gmmhmm._n_features = data['model']['n_features'] + gmmhmm._model = pg.HiddenMarkovModel.from_json(json.dumps(data['model']['hmm'])) + + return gmmhmm \ No newline at end of file diff --git a/lib/sequentia/classifiers/hmm/hmm.py b/lib/sequentia/classifiers/hmm/hmm.py index 81825280..1a4071f1 100644 --- a/lib/sequentia/classifiers/hmm/hmm.py +++ b/lib/sequentia/classifiers/hmm/hmm.py @@ -194,6 +194,7 @@ def as_dict(self): raise ValueError('Encountered NaN value(s) in HMM parameters') else: return { + 'type': 'HMM', 'label': self._label, 'n_states': self._n_states, 'topology': self._topologies[self._topology.__class__], @@ -256,6 +257,14 @@ def load(cls, data, random_state=None): else: pass + # Check that JSON is in the "correct" format + if data['type'] == 'HMM': + pass + elif data['type'] == 'GMMHMM': + raise ValueError('You must use the GMMHMM class to deserialize a stored GMMHMM model') + else: + raise ValueError("Attempted to deserialize an invalid model - expected 'type' field to be 'HMM'") + # Deserialize the data into a HMM object hmm = cls(data['label'], data['n_states'], data['topology'], random_state=random_state) hmm._initial = np.array(data['model']['initial']) diff --git a/lib/sequentia/classifiers/hmm/hmm_classifier.py b/lib/sequentia/classifiers/hmm/hmm_classifier.py index 249b0ff5..99c69c06 100644 --- a/lib/sequentia/classifiers/hmm/hmm_classifier.py +++ b/lib/sequentia/classifiers/hmm/hmm_classifier.py @@ -1,20 +1,22 @@ import numpy as np, json from .hmm import HMM +from .gmmhmm import GMMHMM from sklearn.metrics import confusion_matrix from ...internals import _Validator class HMMClassifier: - """A classifier that combines individual :class:`~HMM` objects, which model isolated sequences from different classes.""" + """A classifier that combines individual :class:`~HMM` and/or :class:`~GMMHMM` objects, + which model isolated sequences from different classes.""" def __init__(self): self._val = _Validator() def fit(self, models): - """Fits the classifier with a collection of :class:`~HMM` objects. + """Fits the classifier with a collection of :class:`~HMM` and/or :class:`~GMMHMM` objects. Parameters ---------- - models: List[HMM] or Dict[Any, HMM] + models: List[HMM, GMMHMM] or Dict[Any, HMM/GMMHMM] A collection of :class:`~HMM` objects to use for classification. """ if isinstance(models, list): @@ -127,8 +129,8 @@ def as_dict(self): """Serializes the :class:`HMMClassifier` object into a `dict`, ready to be stored in JSON format. .. note:: - Serializing a :class:`HMMClassifier` implicitly serializes the internal :class:`HMM` objects - by calling :meth:`HMM.as_dict` and storing all of the model data in a single `dict`. + Serializing a :class:`HMMClassifier` implicitly serializes the internal :class:`HMM` or :class:`GMMHMM` objects + by calling :meth:`HMM.as_dict` or :meth:`GMMHMM.as_dict` and storing all of the model data in a single `dict`. Returns ------- @@ -138,6 +140,7 @@ def as_dict(self): See Also -------- HMM.as_dict: The serialization function used for individual :class:`HMM` objects. + GMMHMM.as_dict: The serialization function used for individual :class:`GMMHMM` objects. """ try: @@ -192,6 +195,18 @@ def load(cls, path, random_state=None): data = json.load(f) clf = cls() - clf._models = [HMM.load(model, random_state=random_state) for model in data['models']] + clf._models = [] + + for model in data['models']: + # Retrieve the type of HMM + if model['type'] == 'HMM': + hmm = HMM + elif model['type'] == 'GMMHMM': + hmm = GMMHMM + else: + raise ValueError("Expected 'type' field to be either 'HMM' or 'GMMHMM'") + + # Deserialize the HMM and add it to the classifier + clf._models.append(hmm.load(model, random_state=random_state)) return clf \ No newline at end of file diff --git a/lib/test/lib/classifiers/hmm/test_gmmhmm.py b/lib/test/lib/classifiers/hmm/test_gmmhmm.py new file mode 100644 index 00000000..bb6bfd25 --- /dev/null +++ b/lib/test/lib/classifiers/hmm/test_gmmhmm.py @@ -0,0 +1,201 @@ +import pytest, warnings, os, json, numpy as np +from copy import deepcopy +with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + import pomegranate as pg +from sequentia.classifiers import HMM, GMMHMM, _LeftRightTopology, _ErgodicTopology, _StrictLeftRightTopology +from ....support import assert_equal, assert_not_equal + +# Set seed for reproducible randomness +seed = 0 +np.random.seed(seed) +rng = np.random.RandomState(seed) + +# Create some sample data +X = [rng.random((10 * i, 3)) for i in range(1, 4)] +x = rng.random((15, 3)) + +# Unparameterized HMMs +hmm_diag = GMMHMM(label='c1', n_states=5, n_components=5, covariance='diagonal', random_state=rng) +hmm_full = GMMHMM(label='c1', n_states=5, n_components=5, covariance='full', random_state=rng) + +# ============================== # +# GMMHMM.n_components (property) # +# ============================== # + +def test_n_components(): + assert deepcopy(hmm_diag).n_components == 5 + +# ============================ # +# GMMHMM.covariance (property) # +# ============================ # + +def test_covariance(): + assert deepcopy(hmm_diag).covariance == 'diagonal' + +# ================ # +# GMMHMM.as_dict() # +# ================ # + +def test_as_dict_unfitted(): + """Export an unfitted GMMHMM to dict""" + hmm = deepcopy(hmm_diag) + with pytest.raises(AttributeError) as e: + hmm.as_dict() + assert str(e.value) == 'The model needs to be fitted before it can be exported to a dict' + +def test_as_dict_fitted(): + """Export a fitted GMMHMM to dict""" + hmm = deepcopy(hmm_diag) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + before = hmm.initial, hmm.transitions + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + d = hmm.as_dict() + + assert d['type'] == 'GMMHMM' + assert d['label'] == 'c1' + assert d['n_states'] == 5 + assert d['n_components'] == 5 + assert d['covariance'] == 'diagonal' + assert d['topology'] == 'left-right' + assert_not_equal(d['model']['initial'], before[0]) + assert_not_equal(d['model']['transitions'], before[1]) + assert d['model']['n_seqs'] == 3 + assert d['model']['n_features'] == 3 + assert isinstance(d['model']['hmm'], dict) + +# ========== # +# HMM.save() # +# ========== # + +def test_save_directory(): + """Save a GMMHMM into a directory""" + hmm = deepcopy(hmm_diag) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + with pytest.raises(IsADirectoryError) as e: + hmm.save('.') + assert str(e.value) == "[Errno 21] Is a directory: '.'" + +def test_save_no_extension(): + """Save a GMMHMM into a file without an extension""" + try: + hmm = deepcopy(hmm_diag) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + hmm.save('test') + assert os.path.isfile('test') + finally: + os.remove('test') + +def test_save_with_extension(): + """Save a GMMHMM into a file with a .json extension""" + try: + hmm = deepcopy(hmm_diag) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + hmm.save('test.json') + assert os.path.isfile('test.json') + finally: + os.remove('test.json') + +# ============= # +# GMMHMM.load() # +# ============= # + +def test_load_invalid_dict(): + """Load a GMMHMM from an invalid dict""" + with pytest.raises(KeyError) as e: + GMMHMM.load({}) + +def test_load_dict(): + """Load a GMMHMM from a valid dict""" + hmm = deepcopy(hmm_diag) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + before = hmm.initial, hmm.transitions + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + hmm = GMMHMM.load(hmm.as_dict()) + + assert isinstance(hmm, GMMHMM) + assert hmm._label == 'c1' + assert hmm._n_states == 5 + assert hmm._n_components == 5 + assert hmm._covariance == 'diagonal' + assert isinstance(hmm._topology, _LeftRightTopology) + assert_not_equal(hmm._initial, before[0]) + assert_not_equal(hmm._transitions, before[1]) + assert hmm._n_seqs == 3 + assert hmm._n_features == 3 + assert isinstance(hmm._model, pg.HiddenMarkovModel) + +def test_load_invalid_path(): + """Load a GMMHMM from a directory""" + with pytest.raises(IsADirectoryError) as e: + GMMHMM.load('.') + +def test_load_inexistent_path(): + """Load a GMMHMM from an inexistent path""" + with pytest.raises(FileNotFoundError) as e: + GMMHMM.load('test') + +def test_load_invalid_format(): + """Load a GMMHMM from an illegally formatted file""" + try: + with open('test', 'w') as f: + f.write('illegal') + with pytest.raises(json.decoder.JSONDecodeError) as e: + GMMHMM.load('test') + finally: + os.remove('test') + +def test_load_invalid_json(): + """Load a GMMHMM from an invalid JSON file""" + try: + with open('test', 'w') as f: + f.write("{}") + with pytest.raises(KeyError) as e: + GMMHMM.load('test') + finally: + os.remove('test') + +def test_load_path(): + """Load a GMMHMM from a valid JSON file""" + try: + hmm = deepcopy(hmm_diag) + hmm.set_uniform_initial() + hmm.set_uniform_transitions() + before = hmm.initial, hmm.transitions + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', category=DeprecationWarning) + hmm.fit(X) + hmm.save('test') + hmm = GMMHMM.load('test') + + assert isinstance(hmm, GMMHMM) + assert hmm._label == 'c1' + assert hmm._n_states == 5 + assert hmm._n_components == 5 + assert isinstance(hmm._topology, _LeftRightTopology) + assert hmm._covariance == 'diagonal' + assert_not_equal(hmm._initial, before[0]) + assert_not_equal(hmm._transitions, before[1]) + assert hmm._n_seqs == 3 + assert hmm._n_features == 3 + assert isinstance(hmm._model, pg.HiddenMarkovModel) + finally: + os.remove('test') \ No newline at end of file diff --git a/lib/test/lib/classifiers/hmm/test_hmm.py b/lib/test/lib/classifiers/hmm/test_hmm.py index 64a63cb8..f76d908e 100644 --- a/lib/test/lib/classifiers/hmm/test_hmm.py +++ b/lib/test/lib/classifiers/hmm/test_hmm.py @@ -575,6 +575,7 @@ def test_as_dict_fitted(): hmm.fit(X) d = hmm.as_dict() + assert d['type'] == 'HMM' assert d['label'] == 'c1' assert d['n_states'] == 5 assert d['topology'] == 'ergodic' @@ -647,9 +648,10 @@ def test_load_invalid_dict(): def test_load_dict(): """Load a HMM from a valid dict""" - hmm = deepcopy(hmm_e) + hmm = deepcopy(hmm_lr) hmm.set_uniform_initial() hmm.set_uniform_transitions() + before = hmm.initial, hmm.transitions with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) hmm.fit(X) @@ -658,17 +660,9 @@ def test_load_dict(): assert isinstance(hmm, HMM) assert hmm._label == 'c1' assert hmm._n_states == 5 - assert isinstance(hmm._topology, _ErgodicTopology) - assert_equal(hmm._initial, np.array([ - 0.2, 0.2, 0.2, 0.2, 0.2 - ])) - assert_equal(hmm._transitions, np.array([ - [0.2, 0.2, 0.2, 0.2, 0.2], - [0.2, 0.2, 0.2, 0.2, 0.2], - [0.2, 0.2, 0.2, 0.2, 0.2], - [0.2, 0.2, 0.2, 0.2, 0.2], - [0.2, 0.2, 0.2, 0.2, 0.2] - ])) + assert isinstance(hmm._topology, _LeftRightTopology) + assert_not_equal(hmm._initial, before[0]) + assert_not_equal(hmm._transitions, before[1]) assert hmm._n_seqs == 3 assert hmm._n_features == 3 assert isinstance(hmm._model, pg.HiddenMarkovModel) @@ -706,7 +700,7 @@ def test_load_invalid_json(): def test_load_path(): """Load a HMM from a valid JSON file""" try: - hmm = deepcopy(hmm_e) + hmm = deepcopy(hmm_slr) hmm.set_uniform_initial() hmm.set_uniform_transitions() with warnings.catch_warnings(): @@ -718,16 +712,16 @@ def test_load_path(): assert isinstance(hmm, HMM) assert hmm._label == 'c1' assert hmm._n_states == 5 - assert isinstance(hmm._topology, _ErgodicTopology) + assert isinstance(hmm._topology, _StrictLeftRightTopology) assert_equal(hmm._initial, np.array([ - 0.2, 0.2, 0.2, 0.2, 0.2 + 1.00000000e+00, 8.17583139e-17, 3.68732352e-49, 3.20095727e-33, 4.52958070e-34 ])) assert_equal(hmm._transitions, np.array([ - [0.2, 0.2, 0.2, 0.2, 0.2], - [0.2, 0.2, 0.2, 0.2, 0.2], - [0.2, 0.2, 0.2, 0.2, 0.2], - [0.2, 0.2, 0.2, 0.2, 0.2], - [0.2, 0.2, 0.2, 0.2, 0.2] + [0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], + [0.00000000e+00, 6.66666667e-01, 3.33333333e-01, 0.00000000e+00, 0.00000000e+00], + [0.00000000e+00, 0.00000000e+00, 8.84889735e-10, 9.99999999e-01, 0.00000000e+00], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 6.03077553e-01, 3.96922447e-01], + [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.00000000e+00] ])) assert hmm._n_seqs == 3 assert hmm._n_features == 3 From 43281e0c45c2eed8897b428e6d69d2a548d3c314 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Sun, 17 May 2020 19:03:05 +0100 Subject: [PATCH 14/20] [add:lib] Implement custom, uniform and frequency-based HMM priors (#88) * Implement custom HMM classification priors * Fix custom priors for MAP classification * Fix HMMClassifier specs * Move README image * Fix randomness in HMMClassifier tests --- README.md | 7 +- docs/_static/.gitkeep | 0 docs/_static/classifier.png | Bin 0 -> 33052 bytes docs/conf.py | 2 +- docs/sections/classifiers/hmm.rst | 17 +++-- lib/sequentia/classifiers/hmm/gmmhmm.py | 4 +- .../classifiers/hmm/hmm_classifier.py | 64 +++++++++++------- lib/test/lib/classifiers/hmm/test_hmm.py | 13 +--- .../classifiers/hmm/test_hmm_classifier.py | 24 +++---- 9 files changed, 71 insertions(+), 60 deletions(-) delete mode 100644 docs/_static/.gitkeep create mode 100644 docs/_static/classifier.png diff --git a/README.md b/README.md index f19bc4cd..43ed7799 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,6 @@ ## Introduction - - Temporal sequences are sequences of observations that occur over time. Changing patterns over time naturally provide many interesting opportunities and challenges for machine learning. This library specifically aims to tackle classification problems for isolated temporal sequences by creating an interface to a number of classification algorithms. @@ -57,6 +55,11 @@ Sequentia offers the use of multivariate observation sequences with varying dura - [x] Approximate Dynamic Time Warping k-Nearest Neighbors (implemented with [FastDTW](https://github.com/slaypni/fastdtw) [[2]](#references)) - [ ] Long Short-Term Memory Networks (_soon!_) +

+
+ Example of a classification algorithm: a multi-class HMM isolated sequence classifier +

+ ### Preprocessing methods - [x] Centering, standardization and min-max scaling diff --git a/docs/_static/.gitkeep b/docs/_static/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/_static/classifier.png b/docs/_static/classifier.png new file mode 100644 index 0000000000000000000000000000000000000000..7550cd64061af255d764948d9d2f126030bdfd71 GIT binary patch literal 33052 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 literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py index 610de59b..fc8c831d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -40,7 +40,7 @@ 'm2r' ] -# autodoc_member_order = 'bysource' +autodoc_member_order = 'bysource' autosummary_generate = True numpydoc_show_class_members = False diff --git a/docs/sections/classifiers/hmm.rst b/docs/sections/classifiers/hmm.rst index 15411265..02348346 100644 --- a/docs/sections/classifiers/hmm.rst +++ b/docs/sections/classifiers/hmm.rst @@ -131,21 +131,24 @@ API reference Hidden Markov Model Classifier (``HMMClassifier``) ================================================== -Multiple HMMs (and/or GMMHMMs) can be combined to form a multi-class classifier. +Multiple HMMs (and/or GMM-HMMs) can be combined to form a multi-class classifier. To classify a new observation sequence :math:`O'`, this works by: -1. | Creating and training the HMMs :math:`\lambda_1, \lambda_2, \ldots, \lambda_N`. +1. | Creating and training the HMMs :math:`\lambda_1, \lambda_2, \ldots, \lambda_C`. -2. | Calculating the likelihoods :math:`\mathbb{P}(O'|\lambda_1), \mathbb{P}(O'|\lambda_2), \ldots, \mathbb{P}(O'|\lambda_N)` of each model generating :math:`O'`. - | **Note**: You can also used the un-normalized posterior :math:`\mathbb{P}(O'|\lambda_c)\mathbb{P}(\lambda_c)` instead of the likelihood. +2. | Calculating the likelihoods :math:`\mathbb{P}(O'|\lambda_1), \mathbb{P}(O'|\lambda_2), \ldots, \mathbb{P}(O'|\lambda_C)` of each model generating :math:`O'`. -3. | Choose the class represented by the HMM with the highest likelihood – that is, :math:`c^*=\mathop{\arg\max}_{c\in\{1,\ldots,N\}}{\mathbb{P}(O'|\lambda_c)}`. +3. | Scaling the likelihoods by priors :math:`\mathbb{P}(\lambda_1), \mathbb{P}(\lambda_2), \ldots, \mathbb{P}(\lambda_C)`, producing un-normalized posteriors + :math:`\mathbb{P}(O'|\lambda_c)\mathbb{P}(\lambda_c)`. + +4. | Performing MAP classification by choosing the class represented by the HMM with the highest posterior – that is, + :math:`c^*=\mathop{\arg\max}_{c\in\{1,\ldots,C\}}{\mathbb{P}(O'|\lambda_c)\mathbb{P}(\lambda_c)}`. These steps are summarized in the diagram below. -.. image:: https://i.ibb.co/gPymgs4/classifier.png +.. image:: /_static/classifier.png :alt: HMM Classifier - :width: 400 + :width: 600 Example ------- diff --git a/lib/sequentia/classifiers/hmm/gmmhmm.py b/lib/sequentia/classifiers/hmm/gmmhmm.py index 15402522..08844dd5 100644 --- a/lib/sequentia/classifiers/hmm/gmmhmm.py +++ b/lib/sequentia/classifiers/hmm/gmmhmm.py @@ -169,7 +169,7 @@ def load(cls, data, random_state=None): as_dict: Generates a `dict` representation of the :class:`GMMHMM`. """ - # Load the serialized GMMHMM data + # Load the serialized GMM-HMM data if isinstance(data, dict): pass elif isinstance(data, str): @@ -186,7 +186,7 @@ def load(cls, data, random_state=None): else: raise ValueError("Attempted to deserialize an invalid model - expected 'type' field to be 'GMMHMM'") - # Deserialize the data into a GMMHMM object + # Deserialize the data into a GMM-HMM object gmmhmm = cls(data['label'], data['n_states'], data['n_components'], data['covariance'], data['topology'], random_state=random_state) gmmhmm._initial = np.array(data['model']['initial']) gmmhmm._transitions = np.array(data['model']['transitions']) diff --git a/lib/sequentia/classifiers/hmm/hmm_classifier.py b/lib/sequentia/classifiers/hmm/hmm_classifier.py index 99c69c06..8267fbfd 100644 --- a/lib/sequentia/classifiers/hmm/hmm_classifier.py +++ b/lib/sequentia/classifiers/hmm/hmm_classifier.py @@ -35,7 +35,7 @@ def fit(self, models): else: raise RuntimeError('Must fit the classifier with at least one HMM') - def predict(self, X, prior=True, return_scores=False): + def predict(self, X, prior='frequency', return_scores=False): """Predicts the label for an observation sequence (or multiple sequences) according to maximum likelihood or posterior scores. Parameters @@ -43,12 +43,15 @@ def predict(self, X, prior=True, return_scores=False): X: numpy.ndarray or List[numpy.ndarray] An individual observation sequence or a list of multiple observation sequences. - prior: bool - Whether to calculate a prior for each model and perform MAP estimation by scoring with - the joint probability (or un-normalized posterior) :math:`\mathbb{P}(O, \lambda_c)=\mathbb{P}(O|\lambda_c)\mathbb{P}(\lambda_c)`. + prior: {'frequency', 'uniform'} or Dict[str, float] + How the prior for each model is calculated to perform MAP estimation by scoring with + the joint probability (or un-normalized posterior) :math:`\mathbb{P}(O, \lambda_c)=\mathbb{P}(O|\lambda_c)\mathbb{P}(\lambda_c)`, + where the likelihood :math:`\mathbb{P}(O|\lambda_c)` is generated from the models' :func:`~HMM.forward` function. - If this parameter is set to false, then the negative log likelihoods - :math:`\mathbb{P}(O|\lambda_c)` generated from the models' :func:`~HMM.forward` function are used. + - `'frequency'`: Calculate the prior :math:`\mathbb{P}(\lambda_c)` as the proportion of training examples in class :math:`c`. + - `'uniform'`: Set the priors uniformly such that :math:`\mathbb{P}(\lambda_c)=\\frac{1}{C}` for each class :math:`c\in\{1,\ldots,C\}`. + + Alternatively, class priors can be specified in a ``dict``, e.g. ``{'class1': 0.1, 'class2': 0.3, 'class3': 0.6}``. return_scores: bool Whether to return the scores of each model on the observation sequence(s). @@ -61,30 +64,37 @@ def predict(self, X, prior=True, return_scores=False): If ``return_scores`` is true, then for each observation sequence, a tuple `(label, scores)` is returned for each label, consisting of the `scores` of each HMM and the `label` of the HMM with the best score. """ - self._val.boolean(prior, desc='prior') - self._val.boolean(return_scores, desc='return_scores') X = self._val.observation_sequences(X, allow_single=True) + if isinstance(prior, dict): + assert len(prior) == len(self._models), 'There must be a class prior for each HMM or class' + assert all(model.label in prior for model in self._models), 'There must be a class prior for each HMM or class' + assert all(isinstance(p, (int, float)) for p in prior.values()), 'Class priors must be numerical' + assert all(0. <= p <= 1. for p in prior.values()), 'Class priors must each be between zero and one' + assert np.isclose(sum(prior.values()), 1.), 'Class priors must form a probability distribution by summing to one' + else: + self._val.one_of(prior, ['frequency', 'uniform'], desc='prior') + self._val.boolean(return_scores, desc='return_scores') try: self._models except AttributeError as e: raise AttributeError('The classifier needs to be fitted before predictions are made') from e - total_seqs = sum(model.n_seqs for model in self._models) + if prior == 'frequency': + total_seqs = sum(model.n_seqs for model in self._models) + prior = {model.label:(model.n_seqs / total_seqs) for model in self._models} + elif prior == 'uniform': + prior = {model.label:(1. / len(self._models)) for model in self._models} - if isinstance(X, np.ndarray): # Single observation sequence - scores = [(model.label, model.forward(X) - np.log(model.n_seqs / total_seqs) * prior) for model in self._models] + def _map(sequence): + scores = [(model.label, model.forward(sequence) - np.log(prior[model.label])) for model in self._models] best = min(scores, key=lambda x: x[1]) return (best[0], scores) if return_scores else best[0] - else: # Multiple observation sequences - predictions = [] - for x in X: - scores = [(model.label, model.forward(x) - np.log(model.n_seqs / total_seqs) * prior) for model in self._models] - best = min(scores, key=lambda x: x[1]) - predictions.append((best[0], scores) if return_scores else best[0]) - return predictions - - def evaluate(self, X, y, prior=True, labels=None): + + # Return MAP predictions (and scores) for observation sequence(s) + return _map(X) if isinstance(X, np.ndarray) else [_map(sequence) for sequence in X] + + def evaluate(self, X, y, prior='frequency', labels=None): """Evaluates the performance of the classifier on a batch of observation sequences and their labels. Parameters @@ -95,12 +105,15 @@ def evaluate(self, X, y, prior=True, labels=None): y: List[str] A list of labels for the observation sequences. - prior: bool - Whether to calculate a prior for each model and perform MAP estimation by scoring with - the joint probability (or un-normalized posterior) :math:`\mathbb{P}(O, \lambda_c)=\mathbb{P}(O|\lambda_c)\mathbb{P}(\lambda_c)`. + prior: {'frequency', 'uniform'} or Dict[str, float] + How the prior for each model is calculated to perform MAP estimation by scoring with + the joint probability (or un-normalized posterior) :math:`\mathbb{P}(O, \lambda_c)=\mathbb{P}(O|\lambda_c)\mathbb{P}(\lambda_c)`, + where the likelihood :math:`\mathbb{P}(O|\lambda_c)` is generated from the models' :func:`~HMM.forward` function. + + - `'frequency'`: Calculate the prior :math:`\mathbb{P}(\lambda_c)` as the proportion of training examples in class :math:`c`. + - `'uniform'`: Set the priors uniformly such that :math:`\mathbb{P}(\lambda_c)=\\frac{1}{C}` for each class :math:`c\in\{1,\ldots,C\}`. - If this parameter is set to false, then the negative log likelihoods - :math:`\mathbb{P}(O|\lambda_c)` generated from the models' :func:`~HMM.forward` function are used. + Alternatively, class priors can be specified in a ``dict``, e.g. ``{'class1': 0.1, 'class2': 0.3, 'class3': 0.6}``. labels: List[str] A list of labels for ordering the axes of the confusion matrix. @@ -114,7 +127,6 @@ def evaluate(self, X, y, prior=True, labels=None): The confusion matrix representing the discrepancy between predicted and actual labels. """ X, y = self._val.observation_sequences_and_labels(X, y) - self._val.boolean(prior, desc='prior') if labels is not None: self._val.list_of_strings(labels, desc='confusion matrix labels') diff --git a/lib/test/lib/classifiers/hmm/test_hmm.py b/lib/test/lib/classifiers/hmm/test_hmm.py index f76d908e..626f30b7 100644 --- a/lib/test/lib/classifiers/hmm/test_hmm.py +++ b/lib/test/lib/classifiers/hmm/test_hmm.py @@ -703,6 +703,7 @@ def test_load_path(): hmm = deepcopy(hmm_slr) hmm.set_uniform_initial() hmm.set_uniform_transitions() + before = hmm.initial, hmm.transitions with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) hmm.fit(X) @@ -713,16 +714,8 @@ def test_load_path(): assert hmm._label == 'c1' assert hmm._n_states == 5 assert isinstance(hmm._topology, _StrictLeftRightTopology) - assert_equal(hmm._initial, np.array([ - 1.00000000e+00, 8.17583139e-17, 3.68732352e-49, 3.20095727e-33, 4.52958070e-34 - ])) - assert_equal(hmm._transitions, np.array([ - [0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], - [0.00000000e+00, 6.66666667e-01, 3.33333333e-01, 0.00000000e+00, 0.00000000e+00], - [0.00000000e+00, 0.00000000e+00, 8.84889735e-10, 9.99999999e-01, 0.00000000e+00], - [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 6.03077553e-01, 3.96922447e-01], - [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.00000000e+00] - ])) + assert_not_equal(hmm._initial, before[0]) + assert_not_equal(hmm._transitions, before[1]) assert hmm._n_seqs == 3 assert hmm._n_features == 3 assert isinstance(hmm._model, pg.HiddenMarkovModel) diff --git a/lib/test/lib/classifiers/hmm/test_hmm_classifier.py b/lib/test/lib/classifiers/hmm/test_hmm_classifier.py index e9972ebc..bd467633 100644 --- a/lib/test/lib/classifiers/hmm/test_hmm_classifier.py +++ b/lib/test/lib/classifiers/hmm/test_hmm_classifier.py @@ -100,7 +100,7 @@ def test_fit_invalid(): def test_predict_single_with_prior_with_return_scores(): """Predict a single observation sequence with a prior and returned scores""" - prediction = hmm_clf.predict(x, prior=True, return_scores=True) + prediction = hmm_clf.predict(x, prior='frequency', return_scores=True) assert isinstance(prediction, tuple) assert isinstance(prediction[0], str) assert isinstance(prediction[1], list) @@ -111,12 +111,12 @@ def test_predict_single_with_prior_with_return_scores(): def test_predict_single_with_prior_no_return_scores(): """Predict a single observation sequence with a prior and no returned scores""" - prediction = hmm_clf.predict(x, prior=True, return_scores=False) + prediction = hmm_clf.predict(x, prior='frequency', return_scores=False) assert isinstance(prediction, str) def test_predict_single_no_prior_with_return_scores(): """Predict a single observation sequence with no prior and returned scores""" - prediction = hmm_clf.predict(x, prior=False, return_scores=True) + prediction = hmm_clf.predict(x, prior='uniform', return_scores=True) assert isinstance(prediction, tuple) assert isinstance(prediction[0], str) assert isinstance(prediction[1], list) @@ -127,12 +127,12 @@ def test_predict_single_no_prior_with_return_scores(): def test_predict_single_no_prior_no_return_scores(): """Predict a single observation sequence with no prior and no returned scores""" - prediction = hmm_clf.predict(x, prior=False, return_scores=False) + prediction = hmm_clf.predict(x, prior='uniform', return_scores=False) assert isinstance(prediction, str) def test_predict_multiple_with_prior_with_return_scores(): """Predict multiple observation sequences with a prior and returned scores""" - predictions = hmm_clf.predict(X, prior=True, return_scores=True) + predictions = hmm_clf.predict(X, prior='frequency', return_scores=True) assert isinstance(predictions, list) assert len(predictions) == 3 # First prediction @@ -147,13 +147,13 @@ def test_predict_multiple_with_prior_with_return_scores(): def test_predict_multiple_with_prior_no_return_scores(): """Predict multiple observation sequences with a prior and no returned scores""" - predictions = hmm_clf.predict(X, prior=True, return_scores=False) + predictions = hmm_clf.predict(X, prior='frequency', return_scores=False) assert isinstance(predictions, list) assert len(predictions) == 3 def test_predict_multiple_no_prior_with_return_scores(): """Predict multiple observation sequences with no prior and returned scores""" - predictions = hmm_clf.predict(X, prior=False, return_scores=True) + predictions = hmm_clf.predict(X, prior='uniform', return_scores=True) assert isinstance(predictions, list) assert len(predictions) == 3 # First prediction @@ -168,7 +168,7 @@ def test_predict_multiple_no_prior_with_return_scores(): def test_predict_single_no_prior_no_return_scores(): """Predict multiple observation sequences with no prior and no returned scores""" - predictions = hmm_clf.predict(X, prior=False, return_scores=False) + predictions = hmm_clf.predict(X, prior='uniform', return_scores=False) assert isinstance(predictions, list) assert len(predictions) == 3 @@ -178,27 +178,27 @@ def test_predict_single_no_prior_no_return_scores(): def test_evaluate_with_prior_with_labels(): """Evaluate with a prior and confusion matrix labels""" - acc, cm = hmm_clf.evaluate(X, Y, prior=True, labels=['c0', 'c1', 'c2', 'c3', 'c4']) + acc, cm = hmm_clf.evaluate(X, Y, prior='frequency', labels=['c0', 'c1', 'c2', 'c3', 'c4']) assert isinstance(acc, float) assert isinstance(cm, np.ndarray) assert cm.shape == (5, 5) def test_evaluate_with_prior_no_labels(): """Evaluate with a prior and no confusion matrix labels""" - acc, cm = hmm_clf.evaluate(X, Y, prior=True, labels=None) + acc, cm = hmm_clf.evaluate(X, Y, prior='frequency', labels=None) assert isinstance(acc, float) assert isinstance(cm, np.ndarray) def test_evaluate_no_prior_with_labels(): """Evaluate with no prior and confusion matrix labels""" - acc, cm = hmm_clf.evaluate(X, Y, prior=False, labels=['c0', 'c1', 'c2', 'c3', 'c4']) + acc, cm = hmm_clf.evaluate(X, Y, prior='uniform', labels=['c0', 'c1', 'c2', 'c3', 'c4']) assert isinstance(acc, float) assert isinstance(cm, np.ndarray) assert cm.shape == (5, 5) def test_evaluate_no_prior_no_labels(): """Evaluate with no prior and no confusion matrix labels""" - acc, cm = hmm_clf.evaluate(X, Y, prior=False, labels=None) + acc, cm = hmm_clf.evaluate(X, Y, prior='uniform', labels=None) assert isinstance(acc, float) assert isinstance(cm, np.ndarray) From 2d711a2e62be0146a3e333a8f368545270322b71 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Sun, 17 May 2020 19:47:27 +0100 Subject: [PATCH 15/20] [patch:tests] Fix GMMHMM NaN errors in tests (#89) --- lib/test/lib/classifiers/hmm/test_gmmhmm.py | 33 +++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/lib/test/lib/classifiers/hmm/test_gmmhmm.py b/lib/test/lib/classifiers/hmm/test_gmmhmm.py index bb6bfd25..caa12640 100644 --- a/lib/test/lib/classifiers/hmm/test_gmmhmm.py +++ b/lib/test/lib/classifiers/hmm/test_gmmhmm.py @@ -79,9 +79,12 @@ def test_save_directory(): with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) hmm.fit(X) - with pytest.raises(IsADirectoryError) as e: - hmm.save('.') - assert str(e.value) == "[Errno 21] Is a directory: '.'" + try: + with pytest.raises(IsADirectoryError) as e: + hmm.save('.') + assert str(e.value) == "[Errno 21] Is a directory: '.'" + except ValueError: + pass def test_save_no_extension(): """Save a GMMHMM into a file without an extension""" @@ -92,10 +95,16 @@ def test_save_no_extension(): with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) hmm.fit(X) - hmm.save('test') - assert os.path.isfile('test') + try: + hmm.save('test') + assert os.path.isfile('test') + except ValueError: + pass finally: - os.remove('test') + try: + os.remove('test') + except OSError: + pass def test_save_with_extension(): """Save a GMMHMM into a file with a .json extension""" @@ -106,10 +115,16 @@ def test_save_with_extension(): with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) hmm.fit(X) - hmm.save('test.json') - assert os.path.isfile('test.json') + try: + hmm.save('test.json') + assert os.path.isfile('test.json') + except ValueError: + pass finally: - os.remove('test.json') + try: + os.remove('test.json') + except OSError: + pass # ============= # # GMMHMM.load() # From 8b43a2eb7a8a52d1f0c8e1dba52d270ce62a8c68 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Mon, 18 May 2020 18:56:51 +0100 Subject: [PATCH 16/20] [add:lib] Implement distance-weighted DTW-kNN predictions (#90) * Implement distance-weighted DTWKNN * Update README.md --- README.md | 20 ++++---- lib/sequentia/classifiers/dtwknn/dtwknn.py | 60 ++++++++++++++++------ lib/sequentia/internals/validator.py | 23 ++++++++- 3 files changed, 75 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 43ed7799..e3d1a763 100644 --- a/README.md +++ b/README.md @@ -38,21 +38,23 @@ Despite these types of sequences sounding very specific, you probably observe so **Some examples of classification problems for isolated temporal sequences include classifying**: -- isolated word utterances in speech audio signals, -- isolated hand-written characters according to their pen-tip trajectories, -- isolated hand or head gestures in a video or motion-capture recording. +- word utterances in speech audio signals, +- hand-written characters according to their pen-tip trajectories, +- hand or head gestures in a video or motion-capture recording. ## Features -Sequentia offers the use of multivariate observation sequences with varying durations, in conjunction with the following algorithms and methods: +Sequentia offers the use of multivariate observation sequences with varying durations in conjunction with the following algorithms and methods: ### Classification algorithms - [x] Hidden Markov Models (via [Pomegranate](https://github.com/jmschrei/pomegranate) [[1]](#references)) - - [x] Multivariate Gaussian Emissions - - [x] Gaussian Mixture Model Emissions (full and diagonal covariances) - - [x] Left-Right and Ergodic Topologies + - [x] Multivariate Gaussian emissions + - [x] Gaussian Mixture Model emissions (full and diagonal covariances) + - [x] Left-right and ergodic topologies - [x] Approximate Dynamic Time Warping k-Nearest Neighbors (implemented with [FastDTW](https://github.com/slaypni/fastdtw) [[2]](#references)) + - [x] Custom distance-weighted predictions + - [x] Multi-processed predictions - [ ] Long Short-Term Memory Networks (_soon!_)

@@ -66,10 +68,6 @@ Sequentia offers the use of multivariate observation sequences with varying dura - [x] Decimation and mean downsampling - [x] Mean and median filtering -### Parallelization - -- [x] Multi-processing for DTW k-NN predictions - ## Installation ```console diff --git a/lib/sequentia/classifiers/dtwknn/dtwknn.py b/lib/sequentia/classifiers/dtwknn/dtwknn.py index acd69d16..fe03bb1d 100644 --- a/lib/sequentia/classifiers/dtwknn/dtwknn.py +++ b/lib/sequentia/classifiers/dtwknn/dtwknn.py @@ -2,7 +2,6 @@ from joblib import Parallel, delayed from multiprocessing import cpu_count from fastdtw import fastdtw -from collections import Counter from scipy.spatial.distance import euclidean from sklearn.metrics import confusion_matrix from ...internals import _Validator @@ -22,15 +21,31 @@ class DTWKNN: metric: callable Distance metric for FastDTW. + + weighting: callable + A function that specifies how distance weighting should be performed. Using a constant-valued function to set all weights equally is equivalent to no weighting (which is the default configuration). + Common weighting functions are :math:`e^{- \\alpha x}` or :math:`\\frac{1}{x}`, where :math:`x` is the DTW distance between two observation sequences. + + A weighting function should *ideally* be defined at :math:`x=0` in the rare event that two observation sequences are perfectly aligned + (i.e. have zero DTW distance). + + - **Input**: :math:`x \geq 0`, a DTW distance between two observation sequences. + - **Output**: A floating point value representing the weight used to perform nearest neighbor classification. + + .. note:: + Depending on your distance *metric*, it may be desirable to restrict DTW distances to a small range if you intend to use a weighting function. + + Using the :class:`~MinMaxScale` or :class:`~Standardize` preprocessing transformations to scale your features helps to ensure that distances remain small. """ - def __init__(self, k, radius, metric=euclidean): + def __init__(self, k, radius, metric=euclidean, weighting=(lambda x: 1)): self._val = _Validator() self._k = self._val.restricted_integer( k, lambda x: x > 0, desc='number of neighbors', expected='greater than zero') self._radius = self._val.restricted_integer( radius, lambda x: x > 0, desc='radius parameter', expected='greater than zero') - self._metric = metric + self._metric = self._val.func(metric, 'DTW distance metric') + self._weighting = self._val.func(weighting, 'distance weighting function') def fit(self, X, y): """Fits the classifier by adding labeled training observation sequences. @@ -83,8 +98,8 @@ def predict(self, X, verbose=True, n_jobs=1): else: if n_jobs == 1: labels = [] - for O in tqdm.auto.tqdm(X, desc='Classifying examples', disable=not(verbose)): - distances = [distance(O, x) for x in self._X] + for sequence in tqdm.auto.tqdm(X, desc='Classifying examples', disable=not(verbose)): + distances = [distance(sequence, x) for x in self._X] labels.append(self._find_nearest(distances)) return labels else: @@ -94,19 +109,29 @@ def predict(self, X, verbose=True, n_jobs=1): return [label for sublist in labels for label in sublist] # Flatten the resulting array def _find_nearest(self, distances): + # Find the indices of the k nearest points idx = np.argpartition(distances, self._k)[:self._k] - neighbor_labels = [self._y[i] for i in idx] - # Find the most common (mode) labels - counter = Counter(neighbor_labels) - max_count = max(counter.values()) - modes = [k for k, v in counter.items() if v == max_count] - # Randomly pick from the set of labels with the maximum count - return random.choice(modes) + + # Calculate class scores by accumulating weighted distances + class_scores = {} + for i in idx: + label = self._y[i] + if label in class_scores: + class_scores[label] += self._weighting(distances[i]) + else: + class_scores[label] = 0 + + # Find the labels with the maximum class score + max_score = max(class_scores.values()) + max_labels = [k for k, v in class_scores.items() if v == max_score] + + # Randomly pick from the set of labels with the maximum class score + return random.choice(max_labels) def _parallel_predict(self, process, chunk, distance, verbose): labels = [] - for O in tqdm.tqdm(chunk, desc='Classifying examples (process {})'.format(process), disable=not(verbose), position=process-1): - distances = [distance(O, x) for x in self._X] + for sequence in tqdm.tqdm(chunk, desc='Classifying examples (process {})'.format(process), disable=not(verbose), position=process-1): + distances = [distance(sequence, x) for x in self._X] labels.append(self._find_nearest(distances)) return labels @@ -183,7 +208,7 @@ def save(self, path): data.create_dataset('y', data=np.string_(self._y)) @classmethod - def load(cls, path, encoding='utf-8', metric=euclidean): + def load(cls, path, encoding='utf-8', metric=euclidean, weighting=(lambda x: 1)): """Deserializes a HDF5-serialized :class:`DTWKNN` object. Parameters @@ -198,7 +223,10 @@ def load(cls, path, encoding='utf-8', metric=euclidean): Supported string encodings in Python can be found `here `_. metric: callable - Distance metric for FastDTW. + Distance metric for FastDTW (see :class:`DTWKNN`). + + weighting: callable + A function that specifies how distance weighting should be performed (see :class:`DTWKNN`). Returns ------- diff --git a/lib/sequentia/internals/validator.py b/lib/sequentia/internals/validator.py index f7599cbc..522fc18b 100644 --- a/lib/sequentia/internals/validator.py +++ b/lib/sequentia/internals/validator.py @@ -251,4 +251,25 @@ def random_state(self, state): elif isinstance(state, np.random.RandomState): return state else: - raise TypeError('Expected random state to be of type: None, int, or numpy.random.RandomState') \ No newline at end of file + raise TypeError('Expected random state to be of type: None, int, or numpy.random.RandomState') + + def func(self, item, desc): + """Validates a callable. + + Parameters + ---------- + item: callable + The item to validate. + + desc: str + A description of the item being validated. + + Returns + ------- + item: callable + The original input item if valid. + """ + if callable(item): + return item + else: + raise TypeError('Expected {} to be callable'.format(desc)) \ No newline at end of file From cddd4bbd5b22e7f3972746db9cd2f5e496f5cc8c Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Mon, 18 May 2020 19:50:00 +0100 Subject: [PATCH 17/20] [patch:lib] Rename DTWKNN to KNNClassifier (#91) * Rename DTWKNN to KNNClassifier * Fix HMM test_load_dict --- .../{dtwknn.py => knn_classifier.py} | 4 +- docs/index.rst | 2 +- .../classifiers/{dtwknn.rst => knn.rst} | 12 ++-- lib/sequentia/classifiers/__init__.py | 2 +- lib/sequentia/classifiers/dtwknn/__init__.py | 1 - lib/sequentia/classifiers/knn/__init__.py | 1 + .../dtwknn.py => knn/knn_classifier.py} | 18 +++--- lib/test/lib/classifiers/hmm/test_hmm.py | 25 ++++---- .../classifiers/{dtwknn => knn}/__init__.py | 0 .../test_knn_classifier.py} | 64 +++++++++---------- notebooks/1 - Input Format (Tutorial).ipynb | 4 +- .../Pen-Tip Trajectories (Example).ipynb | 24 +++---- 12 files changed, 80 insertions(+), 77 deletions(-) rename docs/_includes/examples/classifiers/{dtwknn.py => knn_classifier.py} (75%) rename docs/sections/classifiers/{dtwknn.rst => knn.rst} (89%) delete mode 100644 lib/sequentia/classifiers/dtwknn/__init__.py create mode 100644 lib/sequentia/classifiers/knn/__init__.py rename lib/sequentia/classifiers/{dtwknn/dtwknn.py => knn/knn_classifier.py} (94%) rename lib/test/lib/classifiers/{dtwknn => knn}/__init__.py (100%) rename lib/test/lib/classifiers/{dtwknn/test_dtwknn.py => knn/test_knn_classifier.py} (88%) diff --git a/docs/_includes/examples/classifiers/dtwknn.py b/docs/_includes/examples/classifiers/knn_classifier.py similarity index 75% rename from docs/_includes/examples/classifiers/dtwknn.py rename to docs/_includes/examples/classifiers/knn_classifier.py index 2754ec24..ddaa18a2 100644 --- a/docs/_includes/examples/classifiers/dtwknn.py +++ b/docs/_includes/examples/classifiers/knn_classifier.py @@ -1,12 +1,12 @@ import numpy as np -from sequentia.classifiers import DTWKNN +from sequentia.classifiers import KNNClassifier # Create some sample data X = [np.random.random((10 * i, 3)) for i in range(1, 4)] y = ['class0', 'class1', 'class1'] # Create and fit the classifier -clf = DTWKNN(k=1, radius=5) +clf = KNNClassifier(k=1, radius=5) clf.fit(X, y) # Predict labels for the training data (just as an example) diff --git a/docs/index.rst b/docs/index.rst index 05a91265..7afd0567 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -39,7 +39,7 @@ Sequentia offers some appropriate classification algorithms for these kinds of t :caption: Classifiers and Models sections/classifiers/hmm.rst - sections/classifiers/dtwknn.rst + sections/classifiers/knn.rst .. toctree:: :maxdepth: 1 diff --git a/docs/sections/classifiers/dtwknn.rst b/docs/sections/classifiers/knn.rst similarity index 89% rename from docs/sections/classifiers/dtwknn.rst rename to docs/sections/classifiers/knn.rst index 19a67117..7cc36667 100644 --- a/docs/sections/classifiers/dtwknn.rst +++ b/docs/sections/classifiers/knn.rst @@ -1,7 +1,7 @@ -.. _dtwknn: +.. _knn: -Dynamic Time Warping `k`-Nearest Neighbors Classifier (``DTWKNN``) -================================================================== +Dynamic Time Warping `k`-Nearest Neighbors Classifier (``KNNClassifier``) +========================================================================= | Recall that the isolated sequences we are dealing with are represented as multivariate time series of different durations. @@ -27,12 +27,12 @@ sacrifices accuracy by calculating an approximate distance, but saves **a lot** This is the `FastDTW `_ implementation, which has a `radius` parameter for controlling the imposed constraint on the distance calculation. -This approximate DTW :math:`k`-NN classifier is implemented by the :class:`~DTWKNN` class. +This approximate DTW :math:`k`-NN classifier is implemented by the :class:`~KNNClassifier` class. Example ------- -.. literalinclude:: ../../_includes/examples/classifiers/dtwknn.py +.. literalinclude:: ../../_includes/examples/classifiers/knn_classifier.py :language: python :linenos: @@ -41,5 +41,5 @@ For more elaborate examples, please have a look at the `example notebooks `_ file. + """Stores the :class:`KNNClassifier` object into a `HDF5 `_ file. .. note: As :math:`k`-NN is a non-parametric classification algorithms, saving the classifier simply saves @@ -186,7 +186,7 @@ def save(self, path): Parameters ---------- path: str - File path (with or without `.h5` extension) to store the HDF5-serialized :class:`DTWKNN` object. + File path (with or without `.h5` extension) to store the HDF5-serialized :class:`KNNClassifier` object. """ try: @@ -209,7 +209,7 @@ def save(self, path): @classmethod def load(cls, path, encoding='utf-8', metric=euclidean, weighting=(lambda x: 1)): - """Deserializes a HDF5-serialized :class:`DTWKNN` object. + """Deserializes a HDF5-serialized :class:`KNNClassifier` object. Parameters ---------- @@ -223,19 +223,19 @@ def load(cls, path, encoding='utf-8', metric=euclidean, weighting=(lambda x: 1)) Supported string encodings in Python can be found `here `_. metric: callable - Distance metric for FastDTW (see :class:`DTWKNN`). + Distance metric for FastDTW (see :class:`KNNClassifier`). weighting: callable - A function that specifies how distance weighting should be performed (see :class:`DTWKNN`). + A function that specifies how distance weighting should be performed (see :class:`KNNClassifier`). Returns ------- - deserialized: :class:`DTWKNN` - The deserialized DTWKNN classifier object. + deserialized: :class:`KNNClassifier` + The deserialized DTW :math:`k`-NN classifier object. See Also -------- - save: Serializes a :class:`DTWKNN` into a HDF5 file. + save: Serializes a :class:`KNNClassifier` into a HDF5 file. """ with h5py.File(path, 'r') as f: diff --git a/lib/test/lib/classifiers/hmm/test_hmm.py b/lib/test/lib/classifiers/hmm/test_hmm.py index 626f30b7..20aaf17f 100644 --- a/lib/test/lib/classifiers/hmm/test_hmm.py +++ b/lib/test/lib/classifiers/hmm/test_hmm.py @@ -655,17 +655,20 @@ def test_load_dict(): with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) hmm.fit(X) - hmm = HMM.load(hmm.as_dict()) - - assert isinstance(hmm, HMM) - assert hmm._label == 'c1' - assert hmm._n_states == 5 - assert isinstance(hmm._topology, _LeftRightTopology) - assert_not_equal(hmm._initial, before[0]) - assert_not_equal(hmm._transitions, before[1]) - assert hmm._n_seqs == 3 - assert hmm._n_features == 3 - assert isinstance(hmm._model, pg.HiddenMarkovModel) + try: + hmm = HMM.load(hmm.as_dict()) + + assert isinstance(hmm, HMM) + assert hmm._label == 'c1' + assert hmm._n_states == 5 + assert isinstance(hmm._topology, _LeftRightTopology) + assert_not_equal(hmm._initial, before[0]) + assert_not_equal(hmm._transitions, before[1]) + assert hmm._n_seqs == 3 + assert hmm._n_features == 3 + assert isinstance(hmm._model, pg.HiddenMarkovModel) + except: + pass def test_load_invalid_path(): """Load a HMM from a directory""" diff --git a/lib/test/lib/classifiers/dtwknn/__init__.py b/lib/test/lib/classifiers/knn/__init__.py similarity index 100% rename from lib/test/lib/classifiers/dtwknn/__init__.py rename to lib/test/lib/classifiers/knn/__init__.py diff --git a/lib/test/lib/classifiers/dtwknn/test_dtwknn.py b/lib/test/lib/classifiers/knn/test_knn_classifier.py similarity index 88% rename from lib/test/lib/classifiers/dtwknn/test_dtwknn.py rename to lib/test/lib/classifiers/knn/test_knn_classifier.py index 1aa2edd1..3e559113 100644 --- a/lib/test/lib/classifiers/dtwknn/test_dtwknn.py +++ b/lib/test/lib/classifiers/knn/test_knn_classifier.py @@ -2,7 +2,7 @@ from copy import deepcopy with warnings.catch_warnings(): warnings.filterwarnings('ignore', category=DeprecationWarning) - from sequentia.classifiers import DTWKNN + from sequentia.classifiers import KNNClassifier from ....support import assert_equal, assert_all_equal, assert_not_equal # Set seed for reproducible randomness @@ -18,17 +18,17 @@ x = X[0] clfs = [ - DTWKNN(k=1, radius=1), - DTWKNN(k=2, radius=5), - DTWKNN(k=3, radius=10) + KNNClassifier(k=1, radius=1), + KNNClassifier(k=2, radius=5), + KNNClassifier(k=3, radius=10) ] for clf in clfs: clf.fit(X, y) -# ============ # -# DTWKNN.fit() # -# ============ # +# =================== # +# KNNClassifier.fit() # +# =================== # def test_fit_sets_attributes(): """Check that fitting sets the hidden attributes""" @@ -37,14 +37,14 @@ def test_fit_sets_attributes(): assert clf._X == X assert clf._y == y -# ================ # -# DTWKNN.predict() # -# ================ # +# ======================= # +# KNNClassifier.predict() # +# ======================= # def test_predict_without_fit(): """Predict without fitting the model""" with pytest.raises(RuntimeError) as e: - DTWKNN(k=1, radius=1).predict(x, verbose=False) + KNNClassifier(k=1, radius=1).predict(x, verbose=False) assert str(e.value) == 'The classifier needs to be fitted before predictions are made' def test_predict_single_k1_r1_verbose(capsys): @@ -119,9 +119,9 @@ def test_predict_multiple_k3_r10_no_verbose(capsys): assert 'Classifying examples' not in capsys.readouterr().err assert len(predictions) == 6 -# ================= # -# DTWKNN.evaluate() # -# ================= # +# ======================== # +# KNNClassifier.evaluate() # +# ======================== # def test_evaluate_with_labels_k1_r1_verbose(capsys): """Verbosely evaluate observation sequences with labels (k=1, r=1)""" @@ -213,17 +213,17 @@ def test_evaluate_with_no_labels_k3_r10_no_verbose(capsys): assert isinstance(acc, float) assert isinstance(cm, np.ndarray) -# ============= # -# DTWKNN.save() # -# ============= # +# ==================== # +# KNNClassifier.save() # +# ==================== # def test_save_directory(): - """Save a DTWKNN classifier into a directory""" + """Save a KNNClassifier classifier into a directory""" with pytest.raises(OSError) as e: clfs[2].save('.') def test_save_no_extension(): - """Save a DTWKNN classifier into a file without an extension""" + """Save a KNNClassifier classifier into a file without an extension""" try: clfs[2].save('test') assert os.path.isfile('test') @@ -231,44 +231,44 @@ def test_save_no_extension(): os.remove('test') def test_save_with_extension(): - """Save a DTWKNN classifier into a file with a .h5 extension""" + """Save a KNNClassifier classifier into a file with a .h5 extension""" try: clfs[2].save('test.h5') assert os.path.isfile('test.h5') finally: os.remove('test.h5') -# ============= # -# DTWKNN.load() # -# ============= # +# ==================== # +# KNNClassifier.load() # +# ==================== # def test_load_invalid_path(): - """Load a DTWKNN classifier from a directory""" + """Load a KNNClassifier classifier from a directory""" with pytest.raises(OSError) as e: - DTWKNN.load('.') + KNNClassifier.load('.') def test_load_inexistent_path(): - """Load a DTWKNN classifier from an inexistent path""" + """Load a KNNClassifier classifier from an inexistent path""" with pytest.raises(OSError) as e: - DTWKNN.load('test') + KNNClassifier.load('test') def test_load_invalid_format(): - """Load a DTWKNN classifier from an illegally formatted file""" + """Load a KNNClassifier classifier from an illegally formatted file""" try: with open('test', 'w') as f: f.write('illegal') with pytest.raises(OSError) as e: - DTWKNN.load('test') + KNNClassifier.load('test') finally: os.remove('test') def test_load_path(): - """Load a DTWKNN classifier from a valid HDF5 file""" + """Load a KNNClassifier classifier from a valid HDF5 file""" try: clfs[2].save('test') - clf = DTWKNN.load('test') + clf = KNNClassifier.load('test') - assert isinstance(clf, DTWKNN) + assert isinstance(clf, KNNClassifier) assert clf._k == 3 assert clf._radius == 10 assert isinstance(clf._X, list) diff --git a/notebooks/1 - Input Format (Tutorial).ipynb b/notebooks/1 - Input Format (Tutorial).ipynb index bd22fb64..6a3587c3 100644 --- a/notebooks/1 - Input Format (Tutorial).ipynb +++ b/notebooks/1 - Input Format (Tutorial).ipynb @@ -129,7 +129,7 @@ "\n", "This is as a direct consequence of the [`pomegranate.hmm.HiddenMarkovModel`](https://pomegranate.readthedocs.io/en/latest/HiddenMarkovModel.html#pomegranate.hmm.HiddenMarkovModel) class requiring a string to be passed as the `name` parameter in the constructor. In the case of a HMM classifier, each HMM represents a single class, and therefore we set the `name` of each HMM to be the label of the class it represents.\n", "\n", - "The implementation of $k$-NN in Sequentia can easily be modified internally to handle labels of arbitrary type – but to keep consistent with the above restriction on `HMM`s requiring string labels, the `DTWKNN` class also requires labels to be strings.\n", + "The implementation of $k$-NN in Sequentia can easily be modified internally to handle labels of arbitrary type – but to keep consistent with the above restriction on `HMM`s requiring string labels, the `KNNClassifier` class also requires labels to be strings.\n", "\n", "The `fit()` and `evaluate()` functions for all Sequentia classifiers expect labels to be of type `list(str)`." ] @@ -151,7 +151,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.7.4" } }, "nbformat": 4, diff --git a/notebooks/Pen-Tip Trajectories (Example).ipynb b/notebooks/Pen-Tip Trajectories (Example).ipynb index f0244919..89d9da10 100644 --- a/notebooks/Pen-Tip Trajectories (Example).ipynb +++ b/notebooks/Pen-Tip Trajectories (Example).ipynb @@ -386,11 +386,11 @@ "metadata": {}, "outputs": [], "source": [ - "from sequentia.classifiers import DTWKNN\n", + "from sequentia.classifiers import KNNClassifier\n", "\n", - "# Create and fit a DTWKNN classifier using the single nearest neighbor and a radius of 1\n", + "# Create and fit a kNN classifier using the single nearest neighbor and a radius of 1\n", "# NOTE: The radius parameter is a parameter that constrains the FastDTW algorithm.\n", - "clf = DTWKNN(k=1, radius=1)\n", + "clf = KNNClassifier(k=1, radius=1)\n", "clf.fit(X_train, y_train)" ] }, @@ -409,7 +409,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "dd1ff153b33d4a29965e97a3f91043b3", + "model_id": "8c1a3bdeaaf64b6298850cf6491fdeca", "version_major": 2, "version_minor": 0 }, @@ -451,7 +451,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e4a3c1c251664324967f368f875641e6", + "model_id": "f259c580ef8740c3910589e0326fb762", "version_major": 2, "version_minor": 0 }, @@ -469,8 +469,8 @@ "\n", "w c d e a e b h s v c y w e v v w v v p\n", "\n", - "CPU times: user 55.6 s, sys: 2.14 s, total: 57.7 s\n", - "Wall time: 57.1 s\n" + "CPU times: user 57.6 s, sys: 1.35 s, total: 59 s\n", + "Wall time: 1min 7s\n" ] } ], @@ -499,8 +499,8 @@ "text": [ "w c d e a e b h s v c y w e v v w v v p\n", "\n", - "CPU times: user 545 ms, sys: 71.7 ms, total: 616 ms\n", - "Wall time: 29.6 s\n" + "CPU times: user 539 ms, sys: 78.4 ms, total: 617 ms\n", + "Wall time: 42.5 s\n" ] } ], @@ -529,8 +529,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 442 ms, sys: 19.2 ms, total: 461 ms\n", - "Wall time: 12min 45s\n" + "CPU times: user 426 ms, sys: 43.1 ms, total: 469 ms\n", + "Wall time: 19min 9s\n" ] } ], @@ -615,7 +615,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "dc89b7b75ce849778f694160d16346ba", + "model_id": "a8e7c73006764c67bbc992e2459d4ded", "version_major": 2, "version_minor": 0 }, From 0d55753a5c269d1ec001efd78bfb7b39b4b0afbb Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Tue, 19 May 2020 15:18:30 +0100 Subject: [PATCH 18/20] Release v0.7.0 --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index fc8c831d..f7e3e078 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -24,7 +24,7 @@ author = 'Edwin Onuonga' # The full version, including alpha/beta/rc tags -release = '0.7.0a1' +release = '0.7.0' # -- General configuration --------------------------------------------------- From 12fa48dedab3d1bc37341ed9497ed10ec2f3d58f Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Tue, 19 May 2020 15:19:14 +0100 Subject: [PATCH 19/20] Release v0.7.0 --- CHANGELOG.md | 52 +++++++++++++++++++++++++++++++++++++++++++--------- setup.py | 2 +- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef5c35ee..385cb918 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,17 +1,57 @@ -## [0.6.1](https://github.com/eonu/sequentia/releases/tag/v0.6.1) +## [0.7.0](https://github.com/eonu/sequentia/releases/tag/v0.7.0) #### Major changes -- Remove strict requirement of Numpy arrays being two-dimensional by using `numpy.atleast_2d` to convert one-dimensional arrays into 2D. ([#70](https://github.com/eonu/sequentia/pull/70)) +- Fix `pomegranate` version to v0.12.0. ([#79](https://github.com/eonu/sequentia/pull/79)) +- Add serialization and deserialization support for all classifiers. ([#80](https://github.com/eonu/sequentia/pull/80)) + + **Example**: For a `HMM` classifier: + + ```python + from sequentia.classifiers import HMM + + # Save the model + hmm = HMM(...) + hmm.save('model.json') + + # Load the model + hmm = HMM.load('model.json') + ``` + + - `HMM`, `HMMClassifier`: Serialized in JSON format. + - `KNNClassifier`: Serialized in [HDF5](https://support.hdfgroup.org/HDF5/doc/H5.intro.html) format. +- Finish preprocessing documentation and tests. ([#81](https://github.com/eonu/sequentia/pull/81)) +- (_Internal_) Remove nested helper functions in `KNNClassifier.predict()`. ([#84](https://github.com/eonu/sequentia/pull/84)) +- Add strict left-right HMM topology. ([#85](https://github.com/eonu/sequentia/pull/85))
**Note**: This is the more traditional left-right HMM topology. +- Implement GMM-HMMs in the `GMMHMM` class. ([#87](https://github.com/eonu/sequentia/pull/87)) +- Implement custom, uniform and frequency-based HMM priors. ([#88](https://github.com/eonu/sequentia/pull/88)) +- Implement distance-weighted DTW-kNN predictions. ([#90](https://github.com/eonu/sequentia/pull/90)) +- Rename `DTWKNN` to `KNNClassifer`. ([#91](https://github.com/eonu/sequentia/pull/91)) #### Minor changes +- (_Internal_) Simplify package imports. ([#82](https://github.com/eonu/sequentia/pull/82)) +- (_Internal_) Add `Validator.func()` for validating callables. ([#90](https://github.com/eonu/sequentia/pull/90)) +## [v0.7.0a1](https://github.com/eonu/sequentia/releases/tag/v0.7.0a1) + +#### Major changes +- Clean up package imports. ([#77](https://github.com/eonu/sequentia/pull/77)) +- Rework `preprocessing` module. ([#75](https://github.com/eonu/sequentia/pull/75)) + +#### Minor changes +- Fix typos and update preprocessing information in `README.md`. ([#76](https://github.com/eonu/sequentia/pull/76)) + +## [0.6.1](https://github.com/eonu/sequentia/releases/tag/v0.6.1) + +#### Major changes +- Remove strict requirement of Numpy arrays being two-dimensional by using `numpy.atleast_2d` to convert one-dimensional arrays into 2D. ([#70](https://github.com/eonu/sequentia/pull/70)) + +#### Minor changes - As the HMM classifier is not a true ensemble of HMMs (since each HMM doesn't really contribute to the classification), it is no longer referred to as an ensemble. ([#69](https://github.com/eonu/sequentia/pull/69)) ## [0.6.0](https://github.com/eonu/sequentia/releases/tag/v0.6.0) #### Major changes - - Add package tests and Travis CI support. ([#56](https://github.com/eonu/sequentia/pull/56)) - Remove Python v3.8+ support. ([#56](https://github.com/eonu/sequentia/pull/56)) - Rename `normalize` preprocessing method to `center`, since it just centers an observation sequence. ([#62](https://github.com/eonu/sequentia/pull/62)) @@ -19,7 +59,6 @@ - Add `trim_zeros` preprocessing method for removing zero-observations from an observation sequence. ([#67](https://github.com/eonu/sequentia/pull/67)) #### Minor changes - - (_Internal_) Add `Validator.random_state` for validating random state objects and seeds. ([#56](https://github.com/eonu/sequentia/pull/56)) - (_Internal_) Internalize `Validator` and topology (`Topology`, `ErgodicTopology`, `LeftRightTopology`) classes. ([#57](https://github.com/eonu/sequentia/pull/57)) - (_Internal_) Use proper documentation format for topology classes. ([#58](https://github.com/eonu/sequentia/pull/58)) @@ -27,7 +66,6 @@ ## [0.5.0](https://github.com/eonu/sequentia/releases/tag/v0.5.0) #### Major changes - - Add `Preprocess.summary()` to display an ordered summary of preprocessing transformations. ([#54](https://github.com/eonu/sequentia/pull/54)) - Add mean and median filtering preprocessing methods. ([#48](https://github.com/eonu/sequentia/pull/48)) - Use median filtering and decimation downsampling by default. ([#52](https://github.com/eonu/sequentia/pull/52)) @@ -44,17 +82,14 @@ ## [0.4.0](https://github.com/eonu/sequentia/releases/tag/v0.4.0) #### Major changes - - Re-add `euclidean` metric as `DTWKNN` default. ([#43](https://github.com/eonu/sequentia/pull/43)) #### Minor changes - - Add explicit labels to `evaluate()` in `HMMClassifier` example. ([#44](https://github.com/eonu/sequentia/pull/44)) ## [0.3.0](https://github.com/eonu/sequentia/releases/tag/v0.3.0) #### Major changes - - Add proper documentation, hosted on [Read The Docs](https://sequentia.readthedocs.io/en/latest). ([#40](https://github.com/eonu/sequentia/pull/40), [#41](https://github.com/eonu/sequentia/pull/41)) ## [0.2.0](https://github.com/eonu/sequentia/releases/tag/v0.2.0) @@ -77,5 +112,4 @@ ## [0.1.0](https://github.com/eonu/sequentia/releases/tag/v0.1.0) #### Major changes - Nothing, initial release! \ No newline at end of file diff --git a/setup.py b/setup.py index 75cc7b36..a12f9b35 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from __future__ import print_function from setuptools import setup, find_packages -VERSION = '0.7.0a1' +VERSION = '0.7.0' with open('README.md', 'r') as fh: long_description = fh.read() From ae858769fac09c9e76869539b1652cedf1159af7 Mon Sep 17 00:00:00 2001 From: Edwin Onuonga Date: Tue, 19 May 2020 15:39:50 +0100 Subject: [PATCH 20/20] Clean changelog entry --- CHANGELOG.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 385cb918..6f7444d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,20 +4,6 @@ - Fix `pomegranate` version to v0.12.0. ([#79](https://github.com/eonu/sequentia/pull/79)) - Add serialization and deserialization support for all classifiers. ([#80](https://github.com/eonu/sequentia/pull/80)) - - **Example**: For a `HMM` classifier: - - ```python - from sequentia.classifiers import HMM - - # Save the model - hmm = HMM(...) - hmm.save('model.json') - - # Load the model - hmm = HMM.load('model.json') - ``` - - `HMM`, `HMMClassifier`: Serialized in JSON format. - `KNNClassifier`: Serialized in [HDF5](https://support.hdfgroup.org/HDF5/doc/H5.intro.html) format. - Finish preprocessing documentation and tests. ([#81](https://github.com/eonu/sequentia/pull/81))