PyKoopman
PyKoopman is a Python package for computing data-driven approximations to the Koopman operator.
Table of contents
Data-driven approximation of Koopman operator
Given a nonlinear dynamical system,
x'(t) = f(x(t)),
the Koopman operator governs the temporal evolution of the measurement function. Unfortunately, it is an infinite-dimensional linear operator. Most of the time, one has to project the Koopman operator onto a finite-dimensional subspace that is spanned by user-defined/data-adaptive functions. If the system state is also contained in such subspace, then effectively, the nonlinear dynamical system is (approximately) linearized in a global sense.
Structure of PyKoopman
PyKoopman package is centered around the Koopman
class and KoopmanContinuous
class. It consists of two key components
observables
: a set of observables functions, which spans the subspace for projection.regressor
: the optimization algorithm to find the best fit for the projection of Koopman operator.
After Koopman
/KoopmanContinuous
object has been created, it must be fit to data, similar to a scikit-learn
model.
We design PyKoopman
such that it is compatible to scikit-learn
objects and methods as much as possible.
Example
Installation
Installing with pip
If you are using Linux or macOS you can install PyKoopman with pip:
pip install pykoopman
Installing from source
First clone this repository:
git clone https://github.com/dynamicslab/pykoopman
Then, to install the package, run
pip install .
If you do not have pip you can instead use
python setup.py install
If you do not have root access, you should add the --user
option to the above lines.
Documentation
The documentation for PyKoopman is hosted on Read the Docs.
Community guidelines
Contributing code
We welcome contributions to PyKoopman. To contribute a new feature please submit a pull request. To get started we recommend installing the packages in requirements-dev.txt
via
pip install -r requirements-dev.txt
This will allow you to run unit tests and automatically format your code. To be accepted your code should conform to PEP8 and pass all unit tests. Code can be tested by invoking
pytest
We recommed using pre-commit
to format your code. Once you have staged changes to commit
git add path/to/changed/file.py
you can run the following to automatically reformat your staged code
pre-commit -a -v
Note that you will then need to re-stage any changes pre-commit
made to your code.
Reporting issues or bugs
If you find a bug in the code or want to request a new feature, please open an issue.
References
- Williams, Matthew O., Ioannis G. Kevrekidis, and Clarence W. Rowley. A dataβdriven approximation of the koopman operator: Extending dynamic mode decomposition. Journal of Nonlinear Science 25, no. 6 (2015): 1307-1346. [DOI]
- Williams, Matthew O., Clarence W. Rowley, and Ioannis G. Kevrekidis. A kernel-based approach to data-driven Koopman spectral analysis. arXiv preprint arXiv:1411.2260 (2014). [DOI]
- Brunton, Steven L., et al. Chaos as an intermittently forced linear system. Nature communications 8.1 (2017): 1-9. [DOI]
- Kaiser, Eurika, J. Nathan Kutz, and Steven L. Brunton. Data-driven discovery of Koopman eigenfunctions for control. Machine Learning: Science and Technology 2.3 (2021): 035023. [DOI]
- Lusch, Bethany, J. Nathan Kutz, and Steven L. Brunton. Deep learning for universal linear embeddings of nonlinear dynamics. Nature communications 9.1 (2018): 4950. [DOI]
- Otto, Samuel E., and Clarence W. Rowley. Linearly recurrent autoencoder networks for learning dynamics. SIAM Journal on Applied Dynamical Systems 18.1 (2019): 558-593. [DOI]
- Pan, Shaowu, Nicholas Arnold-Medabalimi, and Karthik Duraisamy. Sparsity-promoting algorithms for the discovery of informative Koopman-invariant subspaces. Journal of Fluid Mechanics 917 (2021). [DOI]