{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/koopman-operator-learning-sharp-spectral","title":"Sharp Spectral Rates for Koopman Operator Learning","arxiv_id":"2302.02004","date":"2023-02-03","proceeding":"NeurIPS 2023 11","authors":[],"abstract":"Nonlinear dynamical systems can be handily described by the associated Koopman operator, whose action evolves every observable of the system forward in time. Learning the Koopman operator and its spectral decomposition from data is enabled by a number of algorithms. In this work we present for the first time non-asymptotic learning bounds for the Koopman eigenvalues and eigenfunctions. We focus on time-reversal-invariant stochastic dynamical systems, including the important example of Langevin dynamics. We analyze two popular estimators: Extended Dynamic Mode Decomposition (EDMD) and Reduced Rank Regression (RRR). Our results critically hinge on novel {minimax} estimation bounds for the operator norm error, that may be of independent interest. Our spectral learning bounds are driven by the simultaneous control of the operator norm error and a novel metric distortion functional of the estimated eigenfunctions. The bounds indicates that both EDMD and RRR have similar variance, but EDMD suffers from a larger bias which might be detrimental to its learning rate. Our results shed new light on the emergence of spurious eigenvalues, an issue which is well known empirically. Numerical experiments illustrate the implications of the bounds in practice.","url_abs":"https://arxiv.org/abs/2302.02004v4","url_pdf":"https://arxiv.org/pdf/2302.02004v4.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"koopman-operator-learning-sharp-spectral","repo_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn","is_official":1,"mentioned_in_paper":0,"mentioned_in_github":0,"framework":"none","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"operator-learning","task_name":"Operator learning"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2302.02004","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2302.02004"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"unverified":16},"by_repo_kind":{"official":{"samples":16,"ran":0,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"c2199443c77a8fa1","entry":"assemble_operators_1d","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/datasets/_overdamped_langevin_generator.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/datasets/_overdamped_langevin_generator.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"c2199443c77a8fa1"}},{"code_sha256_prefix":"3108d99f4689babb","entry":"assemble_operators_2d","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/datasets/_overdamped_langevin_generator.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/datasets/_overdamped_langevin_generator.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"3108d99f4689babb"}},{"code_sha256_prefix":"68ad10e8ef37d022","entry":"build_cosine_basis_1d","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/datasets/_overdamped_langevin_generator.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/datasets/_overdamped_langevin_generator.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"68ad10e8ef37d022"}},{"code_sha256_prefix":"fad015dcf69a86cf","entry":"compute_transition_matrix","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/datasets/_logistic_map.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/datasets/_logistic_map.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"fad015dcf69a86cf"}},{"code_sha256_prefix":"29532cdf3f0299d4","entry":"covariance","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/_linalg.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/_linalg.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"29532cdf3f0299d4"}},{"code_sha256_prefix":"fc5e0c22ee0c97e4","entry":"directed_hausdorff_distance","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/metrics.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/metrics.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"fc5e0c22ee0c97e4"}},{"code_sha256_prefix":"21ca10017842e559","entry":"find_complex_conjugates","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/_utils.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"21ca10017842e559"}},{"code_sha256_prefix":"9e63dcf31d16723c","entry":"fuzzy_parse_complex","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/_utils.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"9e63dcf31d16723c"}},{"code_sha256_prefix":"144f7c9df1753a93","entry":"logistic_map","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/datasets/_logistic_map.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/datasets/_logistic_map.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"144f7c9df1753a93"}},{"code_sha256_prefix":"7e5917ad9b7d91d6","entry":"make_duffing","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/datasets/_samples_generator.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/datasets/_samples_generator.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"7e5917ad9b7d91d6"}},{"code_sha256_prefix":"eb5b8263066395a5","entry":"make_linear_system","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/datasets/_samples_generator.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/datasets/_samples_generator.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"eb5b8263066395a5"}},{"code_sha256_prefix":"b59e7e8dc93e917e","entry":"make_lorenz63","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/datasets/_samples_generator.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/datasets/_samples_generator.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"b59e7e8dc93e917e"}},{"code_sha256_prefix":"38721ec99a7c41f6","entry":"noise_features","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/datasets/_logistic_map.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/datasets/_logistic_map.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"38721ec99a7c41f6"}},{"code_sha256_prefix":"a92bd87a7d27826d","entry":"spd_neg_pow","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/_linalg.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/_linalg.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"a92bd87a7d27826d"}},{"code_sha256_prefix":"fc4666aeadf8fcdb","entry":"stable_topk","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/_utils.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"fc4666aeadf8fcdb"}},{"code_sha256_prefix":"bd99f93761bae48d","entry":"weighted_norm","repo":"Machine-Learning-Dynamical-Systems/kooplearn","repo_kind":"official","path":"src/kooplearn/_linalg.py","file_url":"https://github.com/Machine-Learning-Dynamical-Systems/kooplearn/blob/HEAD/src/kooplearn/_linalg.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"bd99f93761bae48d"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}