{"id":15645009,"url":"https://github.com/eonu/sequentia","last_synced_at":"2025-10-09T20:43:15.249Z","repository":{"id":37612314,"uuid":"224449328","full_name":"eonu/sequentia","owner":"eonu","description":"Scikit-Learn compatible HMM and DTW based sequence machine learning algorithms in Python.","archived":false,"fork":false,"pushed_at":"2024-04-13T17:54:54.000Z","size":45706,"stargazers_count":58,"open_issues_count":2,"forks_count":7,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-04-14T06:50:19.217Z","etag":null,"topics":["classification-algorithms","dtw","dynamic-time-warping","hidden-markov-models","hmm","k-nearest-neighbor-classifier","knn","machine-learning","multivariate-timeseries","python","sequence-classification","sequential-patterns","time-series","time-series-classification","variable-length"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/sequentia/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eonu.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-27T14:29:45.000Z","updated_at":"2024-04-05T14:14:24.000Z","dependencies_parsed_at":"2024-04-13T17:28:49.994Z","dependency_job_id":"0e50ab4e-88a2-4f94-983c-86d6d343cabb","html_url":"https://github.com/eonu/sequentia","commit_stats":{"total_commits":207,"total_committers":2,"mean_commits":103.5,"dds":0.004830917874396157,"last_synced_commit":"f31918e574173f9ac24a2a750548528e7e51ae61"},"previous_names":[],"tags_count":28,"template":false,"template_full_name":"eonu/template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eonu%2Fsequentia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eonu%2Fsequentia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eonu%2Fsequentia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eonu%2Fsequentia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eonu","download_url":"https://codeload.github.com/eonu/sequentia/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248788733,"owners_count":21161726,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["classification-algorithms","dtw","dynamic-time-warping","hidden-markov-models","hmm","k-nearest-neighbor-classifier","knn","machine-learning","multivariate-timeseries","python","sequence-classification","sequential-patterns","time-series","time-series-classification","variable-length"],"created_at":"2024-10-03T12:03:59.381Z","updated_at":"2025-10-09T20:43:15.151Z","avatar_url":"https://github.com/eonu.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/eonu/sequentia/master/docs/source/_static/images/logo.png\" width=\"75px\"\u003e\u003cbr/\u003e\n    Sequentia\n  \u003c/h1\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eScikit-Learn compatible HMM and DTW based sequence machine learning algorithms in Python.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://pypi.org/project/sequentia\"\u003e\n      \u003cimg src=\"https://img.shields.io/pypi/v/sequentia?logo=pypi\u0026style=flat-square\" alt=\"PyPI\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://pypi.org/project/sequentia\"\u003e\n      \u003cimg src=\"https://img.shields.io/pypi/pyversions/sequentia?logo=python\u0026style=flat-square\" alt=\"PyPI - Python Version\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://sequentia.readthedocs.io/en/latest\"\u003e\n      \u003cimg src=\"https://img.shields.io/readthedocs/sequentia.svg?logo=read-the-docs\u0026style=flat-square\" alt=\"Read The Docs - Documentation\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://coveralls.io/github/eonu/sequentia\"\u003e\n      \u003cimg src=\"https://img.shields.io/coverallsCoverage/github/eonu/sequentia?logo=coveralls\u0026style=flat-square\" alt=\"Coveralls - Coverage\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://raw.githubusercontent.com/eonu/sequentia/master/LICENSE\"\u003e\n      \u003cimg src=\"https://img.shields.io/pypi/l/sequentia?style=flat-square\" alt=\"PyPI - License\"/\u003e\n    \u003c/a\u003e\n  \u003c/div\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003csup\u003e\n    \u003ca href=\"#about\"\u003eAbout\u003c/a\u003e ·\n    \u003ca href=\"#build-status\"\u003eBuild Status\u003c/a\u003e ·\n    \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e ·\n    \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e ·\n    \u003ca href=\"#documentation\"\u003eDocumentation\u003c/a\u003e ·\n    \u003ca href=\"#examples\"\u003eExamples\u003c/a\u003e ·\n    \u003ca href=\"#acknowledgments\"\u003eAcknowledgments\u003c/a\u003e ·\n    \u003ca href=\"#references\"\u003eReferences\u003c/a\u003e ·\n    \u003ca href=\"#contributors\"\u003eContributors\u003c/a\u003e ·\n    \u003ca href=\"#licensing\"\u003eLicensing\u003c/a\u003e\n  \u003c/sup\u003e\n\u003c/p\u003e\n\n## About\n\nSequentia is a Python package that provides various classification and regression algorithms for sequential data, including methods based on hidden Markov models and dynamic time warping.\n\nSome examples of how Sequentia can be used on sequence data include:\n\n- determining a spoken word based on its audio signal or alternative representations such as MFCCs,\n- predicting motion intent for gesture control from sEMG signals,\n- classifying hand-written characters according to their pen-tip trajectories.\n\n### Why Sequentia?\n\n- **Simplicity and interpretability**: Sequentia offers a limited set of machine learning algorithms, chosen specifically to be more interpretable and easier to configure than more complex alternatives such as recurrent neural networks and transformers, while maintaining a high level of effectiveness.\n- **Familiar and user-friendly**: To fit more seamlessly into the workflow of data science practitioners, Sequentia follows the ubiquitous Scikit-Learn API, providing a familiar model development process for many, as well as enabling wider access to the rapidly growing Scikit-Learn ecosystem.\n- **Speed**: Some algorithms offered by Sequentia naturally have restrictive runtime scaling, such as k-nearest neighbors. However, our implementation is \noptimized to the point of being multiple orders of magnitude faster than similar packages — see the [Benchmarks](#benchmarks) section for more information.\n\n## Build Status\n\n| `master`                                                                                                                                                                                                 | `dev`                                                                                                                                                                                                      |\n| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| [![CircleCI Build (Master)](https://img.shields.io/circleci/build/github/eonu/sequentia/master?logo=circleci\u0026style=flat-square)](https://app.circleci.com/pipelines/github/eonu/sequentia?branch=master) | [![CircleCI Build (Development)](https://img.shields.io/circleci/build/github/eonu/sequentia/dev?logo=circleci\u0026style=flat-square)](https://app.circleci.com/pipelines/github/eonu/sequentia?branch=master) |\n\n## Features\n\n### Models\n\n#### [Dynamic Time Warping + k-Nearest Neighbors](https://sequentia.readthedocs.io/en/latest/sections/models/knn/index.html) (via [`dtaidistance`](https://github.com/wannesm/dtaidistance))\n\nDynamic Time Warping (DTW) is a distance measure that can be applied to two sequences of different length.\nWhen used as a distance measure for the k-Nearest Neighbors (kNN) algorithm this results in a simple yet\neffective inference algorithm.\n\n- [x] Classification\n- [x] Regression\n- [x] Variable length sequences\n- [x] Multivariate real-valued observations\n- [x] Sakoe–Chiba band global warping constraint\n- [x] Dependent and independent feature warping (DTWD/DTWI)\n- [x] Custom distance-weighted predictions\n- [x] Multi-processed prediction\n\n#### [Hidden Markov Models](https://sequentia.readthedocs.io/en/latest/sections/models/hmm/index.html) (via [`hmmlearn`](https://github.com/hmmlearn/hmmlearn))\n\nA Hidden Markov Model (HMM) is a state-based statistical model which represents a sequence as \na series of observations that are emitted from a collection of latent hidden states which form\nan underlying Markov chain. Each hidden state has an emission distribution that models its observations.\n\nExpectation-maximization via the Baum-Welch algorithm (or forward-backward algorithm) [[1]](#references) is used to \nderive a maximum likelihood estimate of the Markov chain probabilities and emission distribution parameters \nbased on the provided training sequence data.\n\n- [x] Classification\n- [x] Variable length sequences\n- [x] Multivariate real-valued observations (modeled with Gaussian mixture emissions)\n- [x] Univariate categorical observations (modeled with discrete emissions)\n- [x] Linear, left-right and ergodic topologies\n- [x] Multi-processed training and prediction\n\n### Scikit-Learn compatibility\n\n**Sequentia (≥2.0) is compatible with the Scikit-Learn API (≥1.4), enabling for rapid development and prototyping of sequential models.**\n\nThe integration relies on the use of [metadata routing](https://scikit-learn.org/stable/metadata_routing.html), \nwhich means that in most cases, the only necessary change is to add a `lengths` key-word argument to provide \nsequence length information, e.g. `fit(X, y, lengths=lengths)` instead of `fit(X, y)`.\n\n### Similar libraries\n\nAs DTW k-nearest neighbors is the core algorithm offered by Sequentia, below is a comparison of the DTW k-nearest neighbors algorithm features supported by Sequentia and similar libraries.\n\n||**`sequentia`**|[`aeon`](https://github.com/aeon-toolkit/aeon)|[`tslearn`](https://github.com/tslearn-team/tslearn)|[`sktime`](https://github.com/sktime/sktime)|[`pyts`](https://github.com/johannfaouzi/pyts)|\n|-|:-:|:-:|:-:|:-:|:-:|\n|Scikit-Learn compatible|✅|✅|✅|✅|✅|\n|Multivariate sequences|✅|✅|✅|✅|❌|\n|Variable length sequences|✅|✅|➖\u003csup\u003e1\u003c/sup\u003e|❌\u003csup\u003e2\u003c/sup\u003e|❌\u003csup\u003e3\u003c/sup\u003e|\n|No padding required|✅|❌|➖\u003csup\u003e1\u003c/sup\u003e|❌\u003csup\u003e2\u003c/sup\u003e|❌\u003csup\u003e3\u003c/sup\u003e|\n|Classification|✅|✅|✅|✅|✅|\n|Regression|✅|✅|✅|✅|❌|\n|Preprocessing|✅|✅|✅|✅|✅|\n|Multiprocessing|✅|✅|✅|✅|✅|\n|Custom weighting|✅|✅|✅|✅|✅|\n|Sakoe-Chiba band constraint|✅|✅|✅|✅|✅|\n|Itakura paralellogram constraint|❌|✅|✅|✅|✅|\n|Dependent DTW (DTWD)|✅|✅|✅|✅|❌|\n|Independent DTW (DTWI)|✅|❌|❌|❌|✅|\n|Custom DTW measures|❌\u003csup\u003e4\u003c/sup\u003e|✅|❌|✅|✅|\n\n- \u003csup\u003e1\u003c/sup\u003e`tslearn` supports variable length sequences with padding, but doesn't seem to mask the padding.\n- \u003csup\u003e2\u003c/sup\u003e`sktime` does not support variable length sequences, so they are padded (and padding is not masked).\n- \u003csup\u003e3\u003c/sup\u003e`pyts` does not support variable length sequences, so they are padded (and padding is not masked).\n- \u003csup\u003e4\u003c/sup\u003e`sequentia` only supports [`dtaidistance`](https://github.com/wannesm/dtaidistance), which is one of the fastest DTW libraries as it is written in C.\n\n### Benchmarks\n\nTo compare the above libraries in runtime performance on dynamic time warping k-nearest neighbors classification tasks, a simple benchmark was performed on a univariate sequence dataset.\n\nThe [Free Spoken Digit Dataset](https://sequentia.readthedocs.io/en/latest/sections/datasets/digits.html) was used for benchmarking and consists of:\n\n- 3000 recordings of 10 spoken digits (0-9)\n  - 50 recordings of each digit for each of 6 speakers\n  - 1500 used for training, 1500 used for testing (split via label stratification)\n- 13 features ([MFCCs](https://en.wikipedia.org/wiki/Mel-frequency_cepstrum))\n  - Only the first feature was used as not all of the above libraries support multivariate sequences\n- Sequence length statistics: (min 6, median 17, max 92)\n\nEach result measures the total time taken to complete training and prediction repeated 10 times.\n\nAll of the above libraries support multiprocessing, and prediction was performed using 16 workers.\n\n\u003csup\u003e*\u003c/sup\u003e: `sktime`, `tslearn` and `pyts` seem to not mask padding, which may result in incorrect predictions.\n\n\u003cimg src=\"benchmarks/benchmark.svg\" width=\"100%\"/\u003e\n\n\u003e **Device information**:\n\u003e - Product: Lenovo ThinkPad T14s (Gen 6)\n\u003e - Processor: AMD Ryzen™ AI 7 PRO 360 (8 cores, 16 threads, 2-5GHz)\n\u003e - Memory: 64 GB LPDDR5X-7500MHz\n\u003e - Solid State Drive: 1 TB SSD M.2 2280 PCIe Gen4 Performance TLC Opal \n\u003e - Operating system: Fedora Linux 41 (Workstation Edition)\n\n## Installation\n\nThe latest stable version of Sequentia can be installed with the following command:\n\n```console\npip install sequentia\n```\n\n### C libraries\n\nFor optimal performance when using any of the k-NN based models, it is important that the correct `dtaidistance` C libraries are accessible.\n\nPlease see the [`dtaidistance` installation guide](https://dtaidistance.readthedocs.io/en/latest/usage/installation.html) for troubleshooting if you run into C compilation issues, or if using k-NN based models with `use_c=True` results in a warning.\n\nYou can use the following to check if the appropriate C libraries are available.\n\n```python\nfrom dtaidistance import dtw\ndtw.try_import_c()\n```\n\nIf these libraries are unavailable, Sequentia will fall back to using a Python alternative.\n\n### Development\n\nPlease see the [contribution guidelines](/CONTRIBUTING.md) to see installation instructions for contributing to Sequentia.\n\n## Documentation\n\nDocumentation for the package is available on [Read The Docs](https://sequentia.readthedocs.io/en/latest).\n\n## Examples\n\nDemonstration of classifying multivariate sequences into two classes using the `KNNClassifier`.\n\nThis example also shows a typical preprocessing workflow, as well as compatibility with \nScikit-Learn for pipelining and hyper-parameter optimization.\n\n---\n\nFirst, we create some sample multivariate input data consisting of three sequences with two features.\n\n- Sequentia expects sequences to be concatenated and represented as a single NumPy array.\n- Sequence lengths are provided separately and used to decode the sequences when needed.\n\nThis avoids the need for complex structures such as lists of nested arrays with different lengths, \nor a 3D array with wasteful and annoying padding.\n\n```python\nimport numpy as np\n\n# Sequence data\nX = np.array([\n    # Sequence 1 - Length 3\n    [1.2 , 7.91],\n    [1.34, 6.6 ],\n    [0.92, 8.08],\n    # Sequence 2 - Length 5\n    [2.11, 6.97],\n    [1.83, 7.06],\n    [1.54, 5.98],\n    [0.86, 6.37],\n    [1.21, 5.8 ],\n    # Sequence 3 - Length 2\n    [1.7 , 6.22],\n    [2.01, 5.49],\n])\n\n# Sequence lengths\nlengths = np.array([3, 5, 2])\n\n# Sequence classes\ny = np.array([0, 1, 1])\n```\n\nWith this data, we can train a `KNNClassifier` and use it for prediction and scoring.\n\n**Note**: Each of the `fit()`, `predict()` and `score()` methods require the sequence lengths \nto be provided in addition to the sequence data `X` and labels `y`.\n\n```python\nfrom sequentia.models import KNNClassifier\n\n# Initialize and fit the classifier\nclf = KNNClassifier(k=1)\nclf.fit(X, y, lengths=lengths)\n\n# Make predictions based on the provided sequences\ny_pred = clf.predict(X, lengths=lengths)\n\n# Make predicitons based on the provided sequences and calculate accuracy\nacc = clf.score(X, y, lengths=lengths)\n```\n\nAlternatively, we can use [`sklearn.preprocessing.Pipeline`](https://scikit-learn.org/1.5/modules/generated/sklearn.pipeline.Pipeline.html) to build a more complex preprocessing pipeline:\n\n1. Individually denoise each sequence by applying a [median filter](https://sequentia.readthedocs.io/en/latest/sections/preprocessing/transforms/filters.html#sequentia.preprocessing.transforms.median_filter) to each sequence.\n2. Individually [standardize](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html) each sequence by subtracting the mean and dividing the s.d. for each feature.\n3. Reduce the dimensionality of the data to a single feature by using [PCA](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html).\n4. Pass the resulting transformed data into a `KNNClassifier`.\n\n**Note**: Steps 1 and 2 use [`IndependentFunctionTransformer`](https://sequentia.readthedocs.io/en/latest/sections/preprocessing/transforms/function_transformer.html#sequentia.preprocessing.transforms.IndependentFunctionTransformer) provided by Sequentia to \napply the specified transformation to each sequence in `X` individually, rather than using \n[`FunctionTransformer`](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.FunctionTransformer.html#sklearn.preprocessing.FunctionTransformer) from Scikit-Learn which would transform the entire `X`\narray once, treating it as a single sequence.\n\n```python\nfrom sklearn.preprocessing import scale\nfrom sklearn.decomposition import PCA\nfrom sklearn.pipeline import Pipeline\n\nfrom sequentia.preprocessing import IndependentFunctionTransformer, median_filter\n\n# Create a preprocessing pipeline that feeds into a KNNClassifier\npipeline = Pipeline([\n    ('denoise', IndependentFunctionTransformer(median_filter)),\n    ('scale', IndependentFunctionTransformer(scale)),\n    ('pca', PCA(n_components=1)),\n    ('knn', KNNClassifier(k=1))\n])\n\n# Fit the pipeline to the data\npipeline.fit(X, y, lengths=lengths)\n\n# Predict classes for the sequences and calculate accuracy\ny_pred = pipeline.predict(X, lengths=lengths)\n\n# Make predicitons based on the provided sequences and calculate accuracy\nacc = pipeline.score(X, y, lengths=lengths)\n```\n\nFor hyper-parameter optimization, Sequentia provides a `sequentia.model_selection` sub-package\nthat includes most of the hyper-parameter search and cross-validation methods provided by \n[`sklearn.model_selection`](https://scikit-learn.org/stable/api/sklearn.model_selection.html), \nbut adapted to work with sequences.\n\nFor instance, we can perform a grid search with k-fold cross-validation stratifying over labels\nin order to find an optimal value for the number of neighbors in `KNNClassifier` for the \nabove pipeline.\n\n```python\nfrom sequentia.model_selection import StratifiedKFold, GridSearchCV\n\n# Define hyper-parameter search and specify cross-validation method\nsearch = GridSearchCV(\n    # Re-use the above pipeline\n    estimator=Pipeline([\n        ('denoise', IndependentFunctionTransformer(median_filter)),\n        ('scale', IndependentFunctionTransformer(scale)),\n        ('pca', PCA(n_components=1)),\n        ('knn', KNNClassifier(k=1))\n    ]),\n    # Try a range of values of k\n    param_grid={\"knn__k\": [1, 2, 3, 4, 5]},\n    # Specify k-fold cross-validation with label stratification using 4 splits\n    cv=StratifiedKFold(n_splits=4),\n)\n\n# Perform cross-validation over accuracy and retrieve the best model\nsearch.fit(X, y, lengths=lengths)\nclf = search.best_estimator_\n\n# Make predicitons using the best model and calculate accuracy\nacc = clf.score(X, y, lengths=lengths)\n```\n\n## Acknowledgments\n\nIn earlier versions of the package, an approximate DTW implementation [`fastdtw`](https://github.com/slaypni/fastdtw) was used in hopes of speeding up k-NN predictions, as the authors of the original FastDTW paper [[2]](#references) claim that approximated DTW alignments can be computed in linear memory and time, compared to the O(N\u003csup\u003e2\u003c/sup\u003e) runtime complexity of the usual exact DTW implementation.\n\nI was contacted by [Prof. Eamonn Keogh](https://www.cs.ucr.edu/~eamonn/) whose work makes the surprising revelation that FastDTW is generally slower than the exact DTW algorithm that it approximates [[3]](#references). Upon switching from the `fastdtw` package to [`dtaidistance`](https://github.com/wannesm/dtaidistance) (a very solid implementation of exact DTW with fast pure C compiled functions), DTW k-NN prediction times were indeed reduced drastically.\n\nI would like to thank Prof. Eamonn Keogh for directly reaching out to me regarding this finding.\n\n## References\n\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e[1]\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=https://web.ece.ucsb.edu/Faculty/Rabiner/ece259/Reprints/tutorial%20on%20hmm%20and%20applications.pdf\"\u003eLawrence R. Rabiner. \u003cb\u003e\"A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition\"\u003c/b\u003e \u003cem\u003eProceedings of the IEEE 77 (1989)\u003c/em\u003e, no. 2, 257-86.\u003c/a\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e[2]\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=\"https://pdfs.semanticscholar.org/05a2/0cde15e172fc82f32774dd0cf4fe5827cad2.pdf\"\u003eStan Salvador \u0026 Philip Chan. \u003cb\u003e\"FastDTW: Toward accurate dynamic time warping in linear time and space.\"\u003c/b\u003e \u003cem\u003eIntelligent Data Analysis 11.5 (2007)\u003c/em\u003e, 561-580.\u003c/a\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e[3]\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=\"https://arxiv.org/ftp/arxiv/papers/2003/2003.11246.pdf\"\u003eRenjie Wu \u0026 Eamonn J. Keogh. \u003cb\u003e\"FastDTW is approximate and Generally Slower than the Algorithm it Approximates\"\u003c/b\u003e \u003cem\u003eIEEE Transactions on Knowledge and Data Engineering (2020)\u003c/em\u003e, 1–1.\u003c/a\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n## Contributors\n\nAll contributions to this repository are greatly appreciated. Contribution guidelines can be found [here](/CONTRIBUTING.md).\n\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003cth align=\"center\"\u003e\n        \u003ca href=\"https://github.com/eonu\"\u003e\n          \u003cimg src=\"https://avatars0.githubusercontent.com/u/24795571?s=460\u0026v=4\" alt=\"eonu\" width=\"60px\"\u003e\n          \u003cbr/\u003e\u003csub\u003e\u003cb\u003eeonu\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n\t\t\t\u003c/th\u003e\n      \u003cth align=\"center\"\u003e\n        \u003ca href=\"https://github.com/Prhmma\"\u003e\n          \u003cimg src=\"https://avatars0.githubusercontent.com/u/16954887?s=460\u0026v=4\" alt=\"Prhmma\" width=\"60px\"\u003e\n          \u003cbr/\u003e\u003csub\u003e\u003cb\u003ePrhmma\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n\t\t\t\u003c/th\u003e\n      \u003cth align=\"center\"\u003e\n        \u003ca href=\"https://github.com/manisci\"\u003e\n          \u003cimg src=\"https://avatars.githubusercontent.com/u/30268711?v=4\" alt=\"manisci\" width=\"60px\"\u003e\n          \u003cbr/\u003e\u003csub\u003e\u003cb\u003emanisci\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n      \u003c/th\u003e\n      \u003cth align=\"center\"\u003e\n        \u003ca href=\"https://github.com/jonnor\"\u003e\n          \u003cimg src=\"https://avatars.githubusercontent.com/u/45185?v=4\" alt=\"jonnor\" width=\"60px\"\u003e\n          \u003cbr/\u003e\u003csub\u003e\u003cb\u003ejonnor\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n      \u003c/th\u003e\n\t\t\t\u003c!-- Add more \u003cth\u003e\u003c/th\u003e blocks for more contributors --\u003e\n\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\u003c/table\u003e\n\n## Licensing\n\nSequentia is released under the [MIT](https://opensource.org/licenses/MIT) license.\n\nCertain parts of source code are heavily adapted from [Scikit-Learn](scikit-learn.org/).\nSuch files contain a copy of [their license](https://github.com/scikit-learn/scikit-learn/blob/main/COPYING).\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eSequentia\u003c/b\u003e \u0026copy; 2019, Edwin Onuonga - Released under the \u003ca href=\"https://opensource.org/licenses/MIT\"\u003eMIT\u003c/a\u003e license.\u003cbr/\u003e\n  \u003cem\u003eAuthored and maintained by Edwin Onuonga.\u003c/em\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feonu%2Fsequentia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feonu%2Fsequentia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feonu%2Fsequentia/lists"}