Package: sequentia
SequentiaHMM and DTW-based sequence machine learning algorithms in Python following an sklearn-like interface.About·Build Status·Features·Documentation·Examples·Acknowledgments·References·Contributors·LicensingAboutSequentia 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.Some examples of how Sequentia can be used on sequence data include:determining a spoken word based on its audio signal or alternative representations such as MFCCs,predicting motion intent for gesture control from sEMG signals,classifying hand-written characters according to their pen-tip trajectories.Build StatusmasterdevFeaturesModelsThe following models provided by Sequentia all support variable length sequences.Dynamic Time Warping + k-Nearest Neighbors(viadtaidistance)ClassificationRegressionMultivariate real-valued observationsSakoe–Chiba band global warping constraintDependent and independent feature warping (DTWD/DTWI)Custom distance-weighted predictionsMulti-processed predictionsHidden Markov Models(viahmmlearn)Parameter estimation with the Baum-Welch algorithm and prediction with the forward algorithm[1]ClassificationMultivariate real-valued observations (Gaussian mixture model emissions)Univariate categorical observations (discrete emissions)Linear, left-right and ergodic topologiesMulti-processed predictionsScikit-Learn compatibilitySequentia aims to follow the Scikit-Learn interface for estimators and transformations,
as well as to be largely compatible with three core Scikit-Learn modules to improve the ease of model development:preprocessing,model_selectionandpipeline.While there are many other modules, maintaining full compatibility with Scikit-Learn is challenging and many of its features are inapplicable to sequential data, therefore we only focus on the relevant core modules.Despite some deviation from the Scikit-Learn interface in order to accommodate sequences, the following features are currently compatible with Sequentia.preprocessingFunctionTransformer— via an adapted class definitionFunction-based transformations (stateless)Class-based transformations (stateful)pipelinePipeline— via an adapted class definitionFeatureUnionmodel_selectionInstallationYou can install Sequentia usingpip.StableThe latest stable version of Sequentia can be installed with the following command.pip install sequentiaC library compilationFor optimal performance when using any of the k-NN based models, it is important thatdtaidistanceC libraries are compiled correctly.Please see thedtaidistanceinstallation guidefor troubleshooting if you run into C compilation issues, or if settinguse_c=Trueon k-NN based models results in a warning.You can use the following to check if the appropriate C libraries have been installed.fromdtaidistanceimportdtwdtw.try_import_c()Pre-releasePre-release versions include new features which are in active development and may change unpredictably.The latest pre-release version can be installed with the following command.pip install --pre sequentiaDevelopmentPlease see thecontribution guidelinesto see installation instructions for contributing to Sequentia.DocumentationDocumentation for the package is available onRead The Docs.ExamplesDemonstration of classifying multivariate sequences with two features into two classes using theKNNClassifier.This example also shows a typical preprocessing workflow, as well as compatibility with Scikit-Learn.importnumpyasnpfromsklearn.preprocessingimportscalefromsklearn.decompositionimportPCAfromsequentia.modelsimportKNNClassifierfromsequentia.pipelineimportPipelinefromsequentia.preprocessingimportIndependentFunctionTransformer,mean_filter# Create input data# - Sequentia expects sequences to be concatenated into a single array# - Sequence lengths are provided separately and used to decode the sequences when needed# - This avoids the need for complex structures such as lists of arrays with different lengths# SequencesX=np.array([# Sequence 1 - Length 3[1.2,7.91],[1.34,6.6],[0.92,8.08],# Sequence 2 - Length 5[2.11,6.97],[1.83,7.06],[1.54,5.98],[0.86,6.37],[1.21,5.8],# Sequence 3 - Length 2[1.7,6.22],[2.01,5.49]])# Sequence lengthslengths=np.array([3,5,2])# Sequence classesy=np.array([0,1,1])# Create a transformation pipeline that feeds into a KNNClassifier# 1. Individually denoise each sequence by applying a mean filter for each feature# 2. Individually standardize each sequence by subtracting the mean and dividing the s.d. for each feature# 3. Reduce the dimensionality of the data to a single feature by using PCA# 4. Pass the resulting transformed data into a KNNClassifierpipeline=Pipeline([('denoise',IndependentFunctionTransformer(mean_filter)),('scale',IndependentFunctionTransformer(scale)),('pca',PCA(n_components=1)),('knn',KNNClassifier(k=1))])# Fit the pipeline to the data - lengths must be providedpipeline.fit(X,y,lengths)# Predict classes for the sequences and calculate accuracy - lengths must be providedy_pred=pipeline.predict(X,lengths)acc=pipeline.score(X,y,lengths)AcknowledgmentsIn earlier versions of the package, an approximate DTW implementationfastdtwwas used in hopes of speeding up k-NN predictions, as the authors of the original FastDTW paper[2]claim that approximated DTW alignments can be computed in linear memory and time, compared to the O(N2) runtime complexity of the usual exact DTW implementation.I was contacted byProf. Eamonn Keoghwhose work makes the surprising revelation that FastDTW is generally slower than the exact DTW algorithm that it approximates[3]. Upon switching from thefastdtwpackage todtaidistance(a very solid implementation of exact DTW with fast pure C compiled functions), DTW k-NN prediction times were indeed reduced drastically.I would like to thank Prof. Eamonn Keogh for directly reaching out to me regarding this finding.References[1]Lawrence R. Rabiner."A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition"Proceedings of the IEEE 77 (1989), no. 2, 257-86.[2]Stan Salvador & Philip Chan."FastDTW: Toward accurate dynamic time warping in linear time and space."Intelligent Data Analysis 11.5 (2007), 561-580.[3]Renjie Wu & Eamonn J. Keogh."FastDTW is approximate and Generally Slower than the Algorithm it Approximates"IEEE Transactions on Knowledge and Data Engineering (2020), 1–1.ContributorsAll contributions to this repository are greatly appreciated. Contribution guidelines can be foundhere.eonuPrhmmamaniscijonnorLicensingSequentia is released under theMITlicense.Certain parts of the source code are heavily adapted fromScikit-Learn.
Such files contain copy oftheir license.Sequentia© 2019-2023, Edwin Onuonga - Released under theMITlicense.Authored and maintained by Edwin Onuonga.