From 72fe1a2ad9b1594d392023fc518d342daf4225b8 Mon Sep 17 00:00:00 2001 From: Wilson Rocha Date: Sun, 24 Sep 2023 15:05:02 -0300 Subject: [PATCH 1/3] updating docs for v0.3.3 release --- CHANGELOG | 30 + docs/book/contents/index.html | 4 +- docs/book/preface.md | 6 +- docs/book/preface/index.html | 6 +- docs/book/preface/preface.md | 6 +- docs/changelog/changelog.md | 27 + docs/changelog/changelog/changelog.md | 27 + docs/changelog/changelog/index.html | 4 +- docs/code/aols/index.html | 10 +- docs/code/basis-function/index.html | 10 +- docs/code/entropic-regression/index.html | 18 +- docs/code/frols/index.html | 22 +- docs/code/general-estimators/index.html | 8 +- docs/code/metaheuristics/index.html | 14 +- docs/code/metamss/index.html | 18 +- docs/code/metrics/index.html | 26 +- .../multiobjective-parameter-estimation.md | 8 + .../index.html | 1857 ++++++++++ .../multiobjective-parameter-estimation.md | 8 + docs/code/narmax-base/index.html | 28 +- docs/code/neural-narx/index.html | 18 +- docs/code/parameter-estimation/index.html | 38 +- docs/code/residues/index.html | 4 +- docs/code/simulation/index.html | 12 +- docs/code/utils/index.html | 104 +- docs/events/estatidados/index.html | 4 +- docs/events/events/index.html | 4 +- docs/events/gcom-meetup/index.html | 4 +- .../nubank-meetup-open-source/index.html | 4 +- docs/events/nubank-meetup/index.html | 4 +- .../PV_forecasting_benchmark/index.html | 12 +- .../air_passenger_benchmark/index.html | 32 +- docs/examples/aols/index.html | 6 +- docs/examples/basic_steps/index.html | 12 +- docs/examples/defining_lags/index.html | 4 +- docs/examples/entropic_regression/index.html | 8 +- .../extended_least_squares/index.html | 8 +- docs/examples/f_16_benchmark/index.html | 12 +- .../fourier_basis_function/index.html | 14 +- docs/examples/general_estimators/index.html | 16 +- .../index.html | 10 +- .../information_criteria_examples/index.html | 14 +- .../load_forecasting_benchmark/index.html | 12 +- docs/examples/metamss/index.html | 10 +- .../multiobjective_parameter_estimation.ipynb | 3000 +++++++++++++++++ .../index.html | 1664 +++++++++ .../multiobjective_parameter_estimation.ipynb | 3000 +++++++++++++++++ .../multiple_inputs_example/index.html | 8 +- .../n_steps_ahead_prediction/index.html | 14 +- docs/examples/narx_neural_network/index.html | 8 +- docs/examples/parameter_estimation/index.html | 6 +- docs/examples/save_and_load_models/index.html | 6 +- .../simulating_a_predefined_model/index.html | 8 +- docs/index.html | 9 +- docs/landing-page/about-us/index.html | 4 +- docs/landing-page/attribute/index.html | 4 +- docs/landing-page/basic-usage/index.html | 4 +- docs/landing-page/ch0-narmax-intro/index.html | 4 +- docs/landing-page/contribute/index.html | 4 +- docs/landing-page/get-help/index.html | 4 +- docs/landing-page/getting-started/index.html | 4 +- docs/landing-page/license/index.html | 4 +- docs/landing-page/sponsor/index.html | 4 +- docs/sitemap.xml.gz | Bin 684 -> 684 bytes examples/multiobjective.ipynb | 756 ----- .../multiobjective_parameter_estimation.ipynb | 213 +- mkdocs.yml | 2 + pyproject.toml | 2 +- sysidentpy/__init__.py | 2 +- 69 files changed, 10102 insertions(+), 1135 deletions(-) create mode 100644 docs/code/multiobjective-parameter-estimation.md create mode 100644 docs/code/multiobjective-parameter-estimation/index.html create mode 100644 docs/code/multiobjective-parameter-estimation/multiobjective-parameter-estimation.md create mode 100644 docs/examples/multiobjective_parameter_estimation.ipynb create mode 100644 docs/examples/multiobjective_parameter_estimation/index.html create mode 100644 docs/examples/multiobjective_parameter_estimation/multiobjective_parameter_estimation.ipynb delete mode 100644 examples/multiobjective.ipynb diff --git a/CHANGELOG b/CHANGELOG index 23de52d..18365f8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,36 @@ File for tracking changes in SysIdentPy Changes in SysIdentPy ===================== +v0.3.0 +------ + +CONTRIBUTORS +~~~~~~~~~~~~ + +- wilsonrljr +- gamcorn +- Gabo-Tor + +CHANGES +~~~~~~~ + +- The update **v0.3.3** has been released with additional features, API changes and fixes. + +- MAJOR: Multiobjective Framework: Affine Information Least Squares Algorithm (AILS) + - Now you can use AILS to estimate parameters of NARMAX models (and variants) using a multiobjective approach. + - AILS can be accessed using `from sysidentpy.multiobjective_parameter_estimation import AILS` + - See the docs for a more in depth explanation of how to use AILS. + - This feature is related to Issue #101 + +- API Change: `regressor_code` variable was renamed as `enconding` to avoid using the same name as the method in `narmax_tool` `regressor_code` method. + +- DATASET: Added buck_id.csv and buck_valid.csv dataset to SysIdentPy repository. + +- DOC: Add a Multiobjetive Parameter Optimization Notebook showing how to use the new AILS method + +- DOC: Minor additions and grammar fixes. + + v0.3.2 ------ diff --git a/docs/book/contents/index.html b/docs/book/contents/index.html index 19e8592..5122cc9 100644 --- a/docs/book/contents/index.html +++ b/docs/book/contents/index.html @@ -1,5 +1,5 @@ - Contents - SysIdentPy
Skip to content

Contents

Preface

  1. Introduction
    1. Introduction to System Identification
    2. Linear or Nonlinear System Identification?
    3. NARMAX Methods
    4. What is the Purpose of System Identification?
    5. System Identification and Forecasting
    6. Nonlinear System Identification and Forecasting Applications: Case Studies
    7. Terminology
  2. NARMAX Model Representation
    1. Basis Function
    2. Polynomial NARMAX
    3. Fourier NARMAX
    4. NARX Neural Network
    5. General Model Set Representation
    6. References
  3. Parameter Estimation
    1. Least Squares
    2. Estimator Properties
    3. Regularization: Ridge Regression
    4. Total Least Squares
    5. Statistical Properties of Least Squares Estimators
    6. Extended Least Squares Algorithms
    7. Case Studies
    8. References
  4. Multiobjective Parameter Estimation
    1. Introduction
    2. Affine Information
    3. Multiobjective Optimization Problem
    4. NARX Model Static Behavior
    5. Case Studies
    6. References
  5. Time-Varying System Identification
    1. Nonlinear Time-Varying Model Estimation
    2. Recursive Least Squares
    3. Adaptive Filters
      1. Least Mean Squares
      2. Affine Least Mean Squares
      3. Least Mean Squares Sign Error
      4. Normalized Least Mean Squares
      5. Least Mean Squares Normalized Sign Error
      6. Least Mean Squares Sign Regressor
      7. Least Mean Squares Normalized Sign Regressor
      8. Least Mean Squares Sign Sign
      9. Least Mean Squares Normalized Sign Sign
      10. Least Mean Squares Leaky
      11. Least Mean Squares Normalized Leaky
      12. Least Mean Squares Fourth
      13. Least Mean Squares Mixed Norm
    4. Case Studies
    5. References
  6. Model Structure Selection
    1. Introduction
    2. Forward Regression Orthogonal Least Squares
      1. Case Study
    3. Meta Model Structure Selection
      1. Case Study
    4. Accelerated Orthogonal Least Squares
      1. Case Study
    5. Entropic Regression
      1. Case Study
    6. Case Studies
    7. References
  7. Multiobjective Model Structure Selection
    1. Introduction
    2. Multiobjective Error Reduction Ratio
    3. Multiobjective Meta Model Structure Selection
    4. Case Studies
    5. References
  8. NARX Neural Network
    1. Introduction
    2. NARX Neural Network
    3. NARX Neural Network vs. Recursive Neural Network
    4. Case Studies
    5. References
  9. Severely Nonlinear Systems
    1. Introduction
    2. Systems With Hysteresis
    3. Case Study: Modeling a Magneto-rheological Damper Device
    4. References
  10. Validation
    1. Introduction
    2. Nonlinearity Detection
    3. One-step Ahead Prediction
    4. Infinity-step Ahead Prediction
    5. Statistical Validation
    6. References
  11. Case Studies: System Identification and Forecasting
    1. Full Scale F-16 Aircraft
    2. Modeling a Magneto-rheological Damper Device
    3. Industrial Robot Identification Benchmark
    4. Two-Story Frame with Hysteretic Links
    5. Cortical Responses Evoked by Wrist Joint Manipulation
    6. Coupled Electric Drives
    7. Total quarterly beer production in Australia
    8. Australian Domestic Tourism Demand
    9. Electricity Transformer Dataset
    10. Electric Power Consumption
    11. Hourly Energy Demand
    12. Gas Rate CO2
    13. Number of Patients Seen With Influenza-like Illness
    14. Monthly Sales of Heaters and Ice Cream
    15. Monthly Production of Milk
    16. Half-hourly Electricity Demand in England and Wales
    17. Daily Temperature in Melbourne
    18. Weekly U.S. Product Supplied of Finished Motor Gasoline
    19. Australian Total Wine Sales
    20. Quarterly Production of Woollen Yarn in Australia
    21. Hourly Nuclear Energy Generation
\ No newline at end of file +
Skip to content

Contents

Preface

  1. Introduction
    1. Introduction to System Identification
    2. Linear or Nonlinear System Identification?
    3. NARMAX Methods
    4. What is the Purpose of System Identification?
    5. System Identification and Forecasting
    6. Nonlinear System Identification and Forecasting Applications: Case Studies
    7. Terminology
  2. NARMAX Model Representation
    1. Basis Function
    2. Polynomial NARMAX
    3. Fourier NARMAX
    4. NARX Neural Network
    5. General Model Set Representation
    6. References
  3. Parameter Estimation
    1. Least Squares
    2. Estimator Properties
    3. Regularization: Ridge Regression
    4. Total Least Squares
    5. Statistical Properties of Least Squares Estimators
    6. Extended Least Squares Algorithms
    7. Case Studies
    8. References
  4. Multiobjective Parameter Estimation
    1. Introduction
    2. Affine Information
    3. Multiobjective Optimization Problem
    4. NARX Model Static Behavior
    5. Case Studies
    6. References
  5. Time-Varying System Identification
    1. Nonlinear Time-Varying Model Estimation
    2. Recursive Least Squares
    3. Adaptive Filters
      1. Least Mean Squares
      2. Affine Least Mean Squares
      3. Least Mean Squares Sign Error
      4. Normalized Least Mean Squares
      5. Least Mean Squares Normalized Sign Error
      6. Least Mean Squares Sign Regressor
      7. Least Mean Squares Normalized Sign Regressor
      8. Least Mean Squares Sign Sign
      9. Least Mean Squares Normalized Sign Sign
      10. Least Mean Squares Leaky
      11. Least Mean Squares Normalized Leaky
      12. Least Mean Squares Fourth
      13. Least Mean Squares Mixed Norm
    4. Case Studies
    5. References
  6. Model Structure Selection
    1. Introduction
    2. Forward Regression Orthogonal Least Squares
      1. Case Study
    3. Meta Model Structure Selection
      1. Case Study
    4. Accelerated Orthogonal Least Squares
      1. Case Study
    5. Entropic Regression
      1. Case Study
    6. Case Studies
    7. References
  7. Multiobjective Model Structure Selection
    1. Introduction
    2. Multiobjective Error Reduction Ratio
    3. Multiobjective Meta Model Structure Selection
    4. Case Studies
    5. References
  8. NARX Neural Network
    1. Introduction
    2. NARX Neural Network
    3. NARX Neural Network vs. Recursive Neural Network
    4. Case Studies
    5. References
  9. Severely Nonlinear Systems
    1. Introduction
    2. Systems With Hysteresis
    3. Case Study: Modeling a Magneto-rheological Damper Device
    4. References
  10. Validation
    1. Introduction
    2. Nonlinearity Detection
    3. One-step Ahead Prediction
    4. Infinity-step Ahead Prediction
    5. Statistical Validation
    6. References
  11. Case Studies: System Identification and Forecasting
    1. Full Scale F-16 Aircraft
    2. Modeling a Magneto-rheological Damper Device
    3. Industrial Robot Identification Benchmark
    4. Two-Story Frame with Hysteretic Links
    5. Cortical Responses Evoked by Wrist Joint Manipulation
    6. Coupled Electric Drives
    7. Total quarterly beer production in Australia
    8. Australian Domestic Tourism Demand
    9. Electricity Transformer Dataset
    10. Electric Power Consumption
    11. Hourly Energy Demand
    12. Gas Rate CO2
    13. Number of Patients Seen With Influenza-like Illness
    14. Monthly Sales of Heaters and Ice Cream
    15. Monthly Production of Milk
    16. Half-hourly Electricity Demand in England and Wales
    17. Daily Temperature in Melbourne
    18. Weekly U.S. Product Supplied of Finished Motor Gasoline
    19. Australian Total Wine Sales
    20. Quarterly Production of Woollen Yarn in Australia
    21. Hourly Nuclear Energy Generation
\ No newline at end of file diff --git a/docs/book/preface.md b/docs/book/preface.md index 7680608..55da2ab 100644 --- a/docs/book/preface.md +++ b/docs/book/preface.md @@ -26,4 +26,8 @@ In addition to these resources, we will also reference Luis Antônio Aguirre `In ## Contribute -The `Nonlinear Dynamics: A Journey Through System Identification and Forecasting` is a comprehensive resource on the science of System Identification, offered as an open-source material. Our aim is to make this valuable resource accessible to all, both financially and intellectually. If you have found this book helpful and want to support our endeavor financially, you are referred to the Sponsor page. However, if you are not yet ready to contribute financially, you can still help us by pointing out typos, suggesting edits, or offering feedback on passages that you found difficult to comprehend. Simply navigate to the book's repository and open an issue. Lastly, if you enjoyed our content, please consider sharing it with others who may find it useful and leave us a star on GitHub. \ No newline at end of file +The `Nonlinear Dynamics: A Journey Through System Identification and Forecasting` is a comprehensive resource on the science of System Identification, offered as an open-source material. Our aim is to make this valuable resource accessible to all, both financially and intellectually. If you have found this book helpful and want to support our endeavor financially, you are referred to the Sponsor page. However, if you are not yet ready to contribute financially, you can still help us by pointing out typos, suggesting edits, or offering feedback on passages that you found difficult to comprehend. Simply navigate to the book's repository and open an issue. Lastly, if you enjoyed our content, please consider sharing it with others who may find it useful and leave us a star on GitHub. + +## Note + +The chapters will be released one by one until the book is complete. \ No newline at end of file diff --git a/docs/book/preface/index.html b/docs/book/preface/index.html index d746ab9..5c37cdb 100644 --- a/docs/book/preface/index.html +++ b/docs/book/preface/index.html @@ -1,5 +1,5 @@ - Preface - SysIdentPy
Skip to content

Nonlinear Dynamics: A Journey Through System Identification and Forecasting

Welcome to our companion book on System Identification! This book is a comprehensive yet fun approach to learning about dynamic models and forecasting. We believe that learning doesn't have to be dull and boring, which is why we've made sure to infuse some humor into the material.

Our book is specifically designed for those who are interested in learning system identification and forecasting. We will guide you through the process step-by-step using Python and the SysIdentPy package. With SysIdentPy, you will be able to apply a range of techniques for modeling dynamic systems, making predictions, and exploring different design schemes.

Our approach to teaching is centered around a rigorous curriculum that is designed to provide you with a deep understanding of the subject matter. Learning is an iterative process, which is why our book is organized in a way that allows you to build upon your knowledge gradually.

The best part about our book is that it is open source material, meaning that it is freely available for anyone to use and contribute to. We hope that this will foster a community of like-minded individuals who are passionate about system identification and forecasting.

So, whether you're a student, researcher, data scientist or practitioner, we invite you to embark on this exciting journey with us. Let's dive into the world of system identification and forecasting with SysIdentPy!

All Python examples in the book assume you have loaded the following packages first:

import sysidentpy
+                       

Nonlinear Dynamics: A Journey Through System Identification and Forecasting

Welcome to our companion book on System Identification! This book is a comprehensive yet fun approach to learning about dynamic models and forecasting. We believe that learning doesn't have to be dull and boring, which is why we've made sure to infuse some humor into the material.

Our book is specifically designed for those who are interested in learning system identification and forecasting. We will guide you through the process step-by-step using Python and the SysIdentPy package. With SysIdentPy, you will be able to apply a range of techniques for modeling dynamic systems, making predictions, and exploring different design schemes.

Our approach to teaching is centered around a rigorous curriculum that is designed to provide you with a deep understanding of the subject matter. Learning is an iterative process, which is why our book is organized in a way that allows you to build upon your knowledge gradually.

The best part about our book is that it is open source material, meaning that it is freely available for anyone to use and contribute to. We hope that this will foster a community of like-minded individuals who are passionate about system identification and forecasting.

So, whether you're a student, researcher, data scientist or practitioner, we invite you to embark on this exciting journey with us. Let's dive into the world of system identification and forecasting with SysIdentPy!

All Python examples in the book assume you have loaded the following packages first:

import sysidentpy
 import pandas as pd
 import numpy as np
 import torch
-

Acknowledgments

The System Identification class taught by Samir Martins has been a great source of inspiration for this series. In this book, we will explore Dynamic Systems and learn how to master NARMAX models using Python and the SysIdentPy package. The Stephen A. Billings book, Nonlinear System Identification: NARMAX Methods in the Time, Frequency, and Spatio - Temporal Domains, have been instrumental in showing us how fun and useful System Identification can be.

In addition to these resources, we will also reference Luis Antônio Aguirre Introdução à Identificação de Sistemas. Técnicas Lineares e não Lineares Aplicadas a Sistemas. Teoria e Aplicação (in portuguese), which has proven to be an invaluable tool in introducing complex dynamic modeling concepts in light-hearted way. As an open source material on System Identification and Forecasting, this book aims to provide a accessible yet rigorous approach to learning dynamic models and forecasting.

Contribute

The Nonlinear Dynamics: A Journey Through System Identification and Forecasting is a comprehensive resource on the science of System Identification, offered as an open-source material. Our aim is to make this valuable resource accessible to all, both financially and intellectually. If you have found this book helpful and want to support our endeavor financially, you are referred to the Sponsor page. However, if you are not yet ready to contribute financially, you can still help us by pointing out typos, suggesting edits, or offering feedback on passages that you found difficult to comprehend. Simply navigate to the book's repository and open an issue. Lastly, if you enjoyed our content, please consider sharing it with others who may find it useful and leave us a star on GitHub.

\ No newline at end of file +

Acknowledgments

The System Identification class taught by Samir Martins has been a great source of inspiration for this series. In this book, we will explore Dynamic Systems and learn how to master NARMAX models using Python and the SysIdentPy package. The Stephen A. Billings book, Nonlinear System Identification: NARMAX Methods in the Time, Frequency, and Spatio - Temporal Domains, have been instrumental in showing us how fun and useful System Identification can be.

In addition to these resources, we will also reference Luis Antônio Aguirre Introdução à Identificação de Sistemas. Técnicas Lineares e não Lineares Aplicadas a Sistemas. Teoria e Aplicação (in portuguese), which has proven to be an invaluable tool in introducing complex dynamic modeling concepts in light-hearted way. As an open source material on System Identification and Forecasting, this book aims to provide a accessible yet rigorous approach to learning dynamic models and forecasting.

Contribute

The Nonlinear Dynamics: A Journey Through System Identification and Forecasting is a comprehensive resource on the science of System Identification, offered as an open-source material. Our aim is to make this valuable resource accessible to all, both financially and intellectually. If you have found this book helpful and want to support our endeavor financially, you are referred to the Sponsor page. However, if you are not yet ready to contribute financially, you can still help us by pointing out typos, suggesting edits, or offering feedback on passages that you found difficult to comprehend. Simply navigate to the book's repository and open an issue. Lastly, if you enjoyed our content, please consider sharing it with others who may find it useful and leave us a star on GitHub.

Note

The chapters will be released one by one until the book is complete.

\ No newline at end of file diff --git a/docs/book/preface/preface.md b/docs/book/preface/preface.md index 7680608..55da2ab 100644 --- a/docs/book/preface/preface.md +++ b/docs/book/preface/preface.md @@ -26,4 +26,8 @@ In addition to these resources, we will also reference Luis Antônio Aguirre `In ## Contribute -The `Nonlinear Dynamics: A Journey Through System Identification and Forecasting` is a comprehensive resource on the science of System Identification, offered as an open-source material. Our aim is to make this valuable resource accessible to all, both financially and intellectually. If you have found this book helpful and want to support our endeavor financially, you are referred to the Sponsor page. However, if you are not yet ready to contribute financially, you can still help us by pointing out typos, suggesting edits, or offering feedback on passages that you found difficult to comprehend. Simply navigate to the book's repository and open an issue. Lastly, if you enjoyed our content, please consider sharing it with others who may find it useful and leave us a star on GitHub. \ No newline at end of file +The `Nonlinear Dynamics: A Journey Through System Identification and Forecasting` is a comprehensive resource on the science of System Identification, offered as an open-source material. Our aim is to make this valuable resource accessible to all, both financially and intellectually. If you have found this book helpful and want to support our endeavor financially, you are referred to the Sponsor page. However, if you are not yet ready to contribute financially, you can still help us by pointing out typos, suggesting edits, or offering feedback on passages that you found difficult to comprehend. Simply navigate to the book's repository and open an issue. Lastly, if you enjoyed our content, please consider sharing it with others who may find it useful and leave us a star on GitHub. + +## Note + +The chapters will be released one by one until the book is complete. \ No newline at end of file diff --git a/docs/changelog/changelog.md b/docs/changelog/changelog.md index 1be37cc..5b9ca63 100644 --- a/docs/changelog/changelog.md +++ b/docs/changelog/changelog.md @@ -5,6 +5,33 @@ template: overrides/main.html # Changes in SysIdentPy +## v0.3.3 + +### CONTRIBUTORS + +- wilsonrljr +- GabrielBuenoLeandro +- samirmartins + +### CHANGES + +- The update **v0.3.3** has been released with additional features, API changes and fixes. + +- MAJOR: Multiobjective Framework: Affine Information Least Squares Algorithm (AILS) + - Now you can use AILS to estimate parameters of NARMAX models (and variants) using a multiobjective approach. + - AILS can be accessed using `from sysidentpy.multiobjective_parameter_estimation import AILS` + - See the docs for a more in depth explanation of how to use AILS. + - This feature is related to Issue #101 + - Several new methods were implemented to get the new feature and you can check all of it in sysidentpy -> multiobjective_parameter_estimation. + +- API Change: `regressor_code` variable was renamed as `enconding` to avoid using the same name as the method in `narmax_tool` `regressor_code` method. + +- DATASET: Added buck_id.csv and buck_valid.csv dataset to SysIdentPy repository. + +- DOC: Add a Multiobjetive Parameter Optimization Notebook showing how to use the new AILS method + +- DOC: Minor additions and grammar fixes. + ## v0.3.2 ### CONTRIBUTORS diff --git a/docs/changelog/changelog/changelog.md b/docs/changelog/changelog/changelog.md index 1be37cc..5b9ca63 100644 --- a/docs/changelog/changelog/changelog.md +++ b/docs/changelog/changelog/changelog.md @@ -5,6 +5,33 @@ template: overrides/main.html # Changes in SysIdentPy +## v0.3.3 + +### CONTRIBUTORS + +- wilsonrljr +- GabrielBuenoLeandro +- samirmartins + +### CHANGES + +- The update **v0.3.3** has been released with additional features, API changes and fixes. + +- MAJOR: Multiobjective Framework: Affine Information Least Squares Algorithm (AILS) + - Now you can use AILS to estimate parameters of NARMAX models (and variants) using a multiobjective approach. + - AILS can be accessed using `from sysidentpy.multiobjective_parameter_estimation import AILS` + - See the docs for a more in depth explanation of how to use AILS. + - This feature is related to Issue #101 + - Several new methods were implemented to get the new feature and you can check all of it in sysidentpy -> multiobjective_parameter_estimation. + +- API Change: `regressor_code` variable was renamed as `enconding` to avoid using the same name as the method in `narmax_tool` `regressor_code` method. + +- DATASET: Added buck_id.csv and buck_valid.csv dataset to SysIdentPy repository. + +- DOC: Add a Multiobjetive Parameter Optimization Notebook showing how to use the new AILS method + +- DOC: Minor additions and grammar fixes. + ## v0.3.2 ### CONTRIBUTORS diff --git a/docs/changelog/changelog/index.html b/docs/changelog/changelog/index.html index 9c02829..6157a79 100644 --- a/docs/changelog/changelog/index.html +++ b/docs/changelog/changelog/index.html @@ -1,5 +1,5 @@ - Changes in SysIdentPy - SysIdentPy
Skip to content

Changes in SysIdentPy

v0.3.2

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.3.2 has been released with API changes and fixes.

  • Major:

    • Added Akaike Information Criteria corrected in FROLS. Now the user can use aicc as the information criteria to select the model order when using FROLS algorithm.
  • FIX: Issue #114. Replace yhat with y in root relative squared error. Thanks @miroder

  • TESTS: Minor changes in tests by removing unnecessary data load.

  • Remove unused code and comments.

  • Docs: Minor changes in notebooks. Added AICc method in the information criteria example.

v0.3.1

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.3.1 has been released with API changes and fixes.

  • API Change:

    • MetaMSS was returning the max lag of the final model instead of the maximum lag related to the xlag and ylag. This is not wrong (its related to the issue #55), but this change will be made for all methods at the same time. In this respect, I'm reverted this to return the maximum lag of the xlag and ylag.
  • API Change: Added build_matrix method in BaseMSS. This change improved overall code readability by rewriting if/elif/else clauses in every model structure selection algorithm.

  • API Change: Added bic, aic, fpe, and lilc methods in FROLS. Now the method is selected by using a predefined dictionary with the available options. This change improved overall code readability by rewriting if/elif/else clauses in the FROLS algorithm.

  • TESTS: Added tests for Neural NARX class. The issue with pytorch was fixed and now we have the tests for every model class.

  • Remove unused code and comments.

v0.3.0

CONTRIBUTORS

  • wilsonrljr
  • gamcorn
  • Gabo-Tor

CHANGES

  • The update v0.3.0 has been released with additional features, API changes and fixes.

  • MAJOR: Estimators support in AOLS

    • Now you can use any SysIdentPy estimator in AOLS model structure selection.
  • API Change:

    • Refactored base class for model structure selection. A refactored base class for model structure selection has been introduced in SysIdentPy. This update aims to enhance the system identification process by preparing the package for new features that are currently in development, like multiobjective parameter estimation, new basis functions and more.

    Several methods within the base class have undergone significant restructuring to improve their functionality and optimize their performance. This reorganization will facilitate the incorporation of advanced model selection techniques in the future, which will enable users to obtain dynamic models with robust dynamic and static performance. - Avoid unnecessary inheritance in every MSS method and improve the readability with better structured classes. - Rewritten methods to avoid code duplication. - Improve overall code readability by rewriting if/elif/else clauses.

  • Breaking Change: X_train and y_train were replaced respectively by X and y in fit method in MetaMSS model structure selection algorithm. X_test and y_test were replaced by X and y in predict method in MetaMSS.

  • API Change: Added BaseBasisFunction class, an abstract base class for implementing basis functions.

  • Enhancement: Added support for python 3.11.

  • Future Deprecation Warning: The user will have to define the estimator and pass it to every model structure selection algorithm instead of using a string to define the Estimator. Currently the estimator is defined like "estimator='least_squares'". In version 0.4.0 the definition will be like "estimator=LeastSquares()"

  • FIX: Issue #96. Fix issue with numpy 1.24.* version. Thanks for the contribution @gamcorn.

  • FIX: Issue #91. Fix r2_score metric issue with 2 dimensional arrays.

  • FIX: Issue #90.

  • FIX: Issue #88 .Fix one step ahead prediction error in SimulateNARMAX class (thanks for pointing out, Lalith).

  • FIX: Fix error in selecting the correct regressors in AOLS.

  • Fix: Fix n step ahead prediction method not returning all values of the defined steps-ahead value when passing only the initial condition.

  • FIX: Fix Visible Deprecation Warning raised in get_max_lag method.

  • FIX: Fix deprecation warning in Extended Least Squares Example

  • DATASET: Added air passengers dataset to SysIdentPy repository.

  • DATASET: Added San Francisco Hospital Load dataset to SysIdentPy repository.

  • DATASET: Added San Francisco PV GHI dataset to SysIdentPy repository.

  • DOC: Improved documentation in Setting Specif Lags page. Now we bring an example of how to set specific lags for MISO models.

  • DOC: Minor additions and grammar fixes.

  • DOC: Improve image visualization using mkdocs-glightbox.

  • Update dev packages versions

v0.2.1

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.2.1 has been released with additional feature, minor API changes and fixes.

  • MAJOR: Neural NARX now support CUDA

    • Now the user can build Neural NARX models with CUDA support. Just add device='cuda' to use the GPU benefits.
    • Updated docs to show how to use the new feature.
  • MAJOR: New documentation website

    • The documentation is now entirely based on Markdown (no rst anymore).
    • We use MkDocs and Material for MkDocs theme now.
    • Dark theme option.
    • The Contribute page have more details to help those who wants to contribute with SysIdentPy.
    • New sections (e.g., Blog, Sponsors, etc.)
    • Many improvements under the hood.
  • MAJOR: Github Sponsor

  • Tests:

    • Now there are test for almost every function.
    • Neural NARX tests are raising numpy issues. It'll be fixed til next update.
  • FIX: NFIR models in General Estimators

    • Fix support for NFIR models using sklearn estimators.
  • The setup is now handled by the pyproject.toml file.

  • Remove unused code.

  • Fix docstring variables.

  • Fix code format issues.

  • Fix minor grammatical and spelling mistakes.

  • Fix issues related to html on Jupyter notebooks examples on documentation.

  • Updated Readme.

v0.2.0

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.2.0 has been released with additional feature, minor API changes and fixes.

  • MAJOR: Many new features for General Estimators

    • Now the user can build General NARX models with Fourier basis function.
    • The user can choose which basis they want by importing it from sysidentpy.basis_function. Check the notebooks with examples of how to use it.
    • Now it is possible to build General NAR models. The user just need to pass model_type="NAR" to build NAR models.
    • Now it is possible to build General NFIR models. The user just need to pass model_type="NFIR" to build NAR models.
    • Now it is possible to run n-steps ahead prediction using General Estimators. Until now only infinity-steps ahead were allowed. Now the users can set any steps they want.
    • Polynomial and Fourier are supported for now. New basis functions will be added in next releases.
    • No need to pass the number of inputs anymore.
    • Improved docstring.
    • Fixed minor grammatical and spelling mistakes.
    • many under the hood changes.
  • MAJOR: Many new features for NARX Neural Network

    • Now the user can build Neural NARX models with Fourier basis function.
    • The user can choose which basis they want by importing it from sysidentpy.basis_function. Check the notebooks with examples of how to use it.
    • Now it is possible to build Neural NAR models. The user just need to pass model_type="NAR" to build NAR models.
    • Now it is possible to build Neural NFIR models. The user just need to pass model_type="NFIR" to build NAR models.
    • Now it is possible to run n-steps ahead prediction using Neural NARX. Until now only infinity-steps ahead were allowed. Now the users can set any steps they want.
    • Polynomial and Fourier are supported for now. New basis functions will be added in next releases.
    • No need to pass the number of inputs anymore.
    • Improved docstring.
    • Fixed minor grammatical and spelling mistakes.
    • many under the hood changes.
  • Major: Support for old methods removed.

    • Now the old sysidentpy.PolynomialNarmax is not available anymore. All the old features are included in the new API with a lot of new features and performance improvements.
  • API Change (new): sysidentpy.general_estimators.ModelPrediction

    • ModelPrediction class was adapted to support General Estimators as a stand-alone class.
    • predict: base method for prediction. Support infinity_steps ahead, one-step ahead and n-steps ahead prediction and any basis function.
    • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis function.
    • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial basis.
    • _model_prediction: Perform the infinity-step-ahead prediction for polynomial basis.
    • _narmax_predict: wrapper for NARMAX and NAR models.
    • _nfir_predict: wrapper for NFIR models.
    • _basis_function_predict: Perform the infinity-step-ahead prediction for basis functions other than polynomial.
    • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis functions other than polynomial.
  • API Change (new): sysidentpy.neural_network.ModelPrediction

    • ModelPrediction class was adapted to support Neural NARX as a stand-alone class.
    • predict: base method for prediction. Support infinity_steps ahead, one-step ahead and n-steps ahead prediction and any basis function.
    • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis function.
    • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial basis.
    • _model_prediction: Perform the infinity-step-ahead prediction for polynomial basis.
    • _narmax_predict: wrapper for NARMAX and NAR models.
    • _nfir_predict: wrapper for NFIR models.
    • _basis_function_predict: Perform the infinity-step-ahead prediction for basis functions other than polynomial.
    • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis functions other than polynomial.
  • API Change: Fit method for Neural NARX revamped.

    • No need to convert the data to tensor before calling Fit method anymore.

API Change: Keyword and positional arguments - Now users have to provide parameters with their names, as keyword arguments, instead of positional arguments. This is valid for every model class now.

  • API Change (new): sysidentpy.utils.narmax_tools

    • New functions to help user getting useful information to build model. Now we have the regressor_code helper function to help to build neural NARX models.
  • DOC: Improved Basic Steps notebook with new details about the prediction function.

  • DOC: NARX Neural Network notebook was updated following the new api and showing new features.
  • DOC: General Estimators notebook was updated following the new api and showing new features.
  • DOC: Fixed minor grammatical and spelling mistakes, including Issues #77 and #78.
  • DOC: Fix issues related to html on Jupyter notebooks examples on documentation.

v0.1.9

CONTRIBUTORS

  • wilsonrljr
  • samirmartins

CHANGES

  • The update v0.1.9 has been released with additional feature, minor API changes and fixes of the new features added in v0.1.7.

  • MAJOR: Entropic Regression Algorithm

    • Added the new class ER to build NARX models using the Entropic Regression algorithm.
    • Only the Mutual Information KNN is implemented in this version and it may take too long to run on a high number of regressor, so the user should be careful regarding the number of candidates to put in the model.
  • API: save_load

    • Added a function to save and load models from file.
  • API: Added tests for python 3.9

  • Fix : Change condition for n_info_values in FROLS. Now the value defined by the user is compared against X matrix shape instead of regressor space shape. This fix the Fourier basis function usage with more the 15 regressors in FROLS.

  • DOC: Save and Load models

    • Added a notebook showing how to use the save_load method.
  • DOC: Entropic Regression example

    • Added notebook with a simple example of how to use AOLS
  • DOC: Fourier Basis Function Example

    • Added notebook with a simple example of how to use Fourier Basis Function
  • DOC: PV forecasting benchmark

    • FIX AOLS prediction. The example was using the meta_mss model in prediction, so the results for AOLS were wrong.
  • DOC: Fixed minor grammatical and spelling mistakes.

  • DOC: Fix issues related to html on Jupyter notebooks examples on documentation.

v0.1.8

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.1.8 has been released with additional feature, minor API changes and fixes of the new features added in v0.1.7.

  • MAJOR: Ensemble Basis Functions

    • Now you can use different basis function together. For now we allow to use Fourier combined with Polynomial of different degrees.
  • API change: Add "ensemble" parameter in basis function to combine the features of different basis function.

  • Fix: N-steps ahead prediction for model_type="NAR" is working properly now with different forecast horizon.

  • DOC: Air passenger benchmark

    • Remove unused code.
    • Use default hyperparameter in SysIdentPy models.
  • DOC: Load forecasting benchmark

    • Remove unused code.
    • Use default hyperparameter in SysIdentPy models.
  • DOC: PV forecasting benchmark

    • Remove unused code.
    • Use default hyperparameter in SysIdentPy models.

v0.1.7

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.1.7 has been released with major changes and additional features. There are several API modifications and you will need to change your code to have the new (and upcoming) features. All modifications are meant to make future expansion easier.

  • On the user's side, the changes are not that disruptive, but in the background there are many changes that allowed the inclusion of new features and bug fixes that would be complex to solve without the changes. Check the documentation page <http://sysidentpy.org/notebooks.html>__

  • Many classes were basically rebuild it from scratch, so I suggest to look at the new examples of how to use the new version.

  • I will present the main updates below in order to highlight features and usability and then all API changes will be reported.

  • MAJOR: NARX models with Fourier basis function Issue63 <https://github.com/wilsonrljr/sysidentpy/issues/63>, Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>

    • The user can choose which basis they want by importing it from sysidentpy.basis_function. Check the notebooks with examples of how to use it.
    • Polynomial and Fourier are supported for now. New basis functions will be added in next releases.
  • MAJOR: NAR models Issue58 <https://github.com/wilsonrljr/sysidentpy/issues/58>__

    • It was already possible to build Polynomial NAR models, but with some hacks. Now the user just need to pass model_type="NAR" to build NAR models.
    • The user doesn't need to pass a vector of zeros as input anymore.
    • Works for any model structure selection algorithm (FROLS, AOLS, MetaMSS)
  • Major: NFIR models Issue59 <https://github.com/wilsonrljr/sysidentpy/issues/59>__

    • NFIR models are models where the output depends only on past inputs. It was already possible to build Polynomial NFIR models, but with a lot of code on the user's side (much more than NAR, btw). Now the user just need to pass model_type="NFIR" to build NFIR models.
    • Works for any model structure selection algorithm (FROLS, AOLS, MetaMSS)
  • Major: Select the order for the residues lags to use in Extended Least Squares - elag

    • The user can select the maximum lag of the residues to be used in the Extended Least Squares algorithm. In previous versions sysidentpy used a predefined subset of residual lags.
    • The degree of the lags follows the degree of the basis function
  • Major: Residual analysis methods Issue60 <https://github.com/wilsonrljr/sysidentpy/issues/60>__

    • There are now specific functions to calculate the autocorrelation of the residuals and cross-correlation for the analysis of the residuals. In previous versions the calculation was limited to just two inputs, for example, limiting user usability.
  • Major: Plotting methods Issue61 <https://github.com/wilsonrljr/sysidentpy/issues/61>__

    • The plotting functions are now separated from the models objects, so there are more flexibility regarding what to plot.
    • Residual plots were separated from the forecast plot
  • API Change: sysidentpy.polynomial_basis.PolynomialNarmax is deprecated. Use sysidentpy.model_structure_selection.FROLS instead. Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/62>__

    • Now the user doesn't need to pass the number of inputs as a parameter.
    • Added the elag parameter for unbiased_estimator. Now the user can define the number of lags of the residues for parameter estimation using the Extended Least Squares algorithm.
    • model_type parameter: now the user can select the model type to be built. The options are "NARMAX", "NAR" and "NFIR". "NARMAX" is the default. If you want to build a NAR model without any "hack", just set model_type="NAR". The same for "NFIR" models.
  • API Change: sysidentpy.polynomial_basis.MetaMSS is deprecated. Use sysidentpy.model_structure_selection.MetaMSS instead. Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

    • Now the user doesn't need to pass the number of inputs as a parameter.
    • Added the elag parameter for unbiased_estimator. Now the user can define the number of lags of the residues for parameter estimation using the Extended Least Squares algorithm.
  • API Change: sysidentpy.polynomial_basis.AOLS is deprecated. Use sysidentpy.model_structure_selection.AOLS instead. Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

  • API Change: sysidentpy.polynomial_basis.SimulatePolynomialNarmax is deprecated. Use sysidentpy.simulation.SimulateNARMAX instead.

  • API Change: Introducing sysidentpy.basis_function. Because NARMAX models can be built on different basis function, a new module is added to make easier to implement new basis functions in future updates Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__.

    • Each basis function class must have a fit and predict method to be used in training and prediction respectively.
  • API Change: unbiased_estimator method moved to Estimators class.

    • added elag option
    • change the build_information_matrix method to build_output_matrix
  • API Change (new): sysidentpy.narmax_base

    • This is the new base for building NARMAX models. The classes have been rewritten to make it easier to expand functionality.
  • API Change (new): sysidentpy.narmax_base.GenerateRegressors

    • create_narmax_code: Creates the base coding that allows representation for the NARMAX, NAR, and NFIR models.
    • regressor_space: Creates the encoding representation for the NARMAX, NAR, and NFIR models.
  • API Change (new): sysidentpy.narmax_base.ModelInformation

    • _get_index_from_regressor_code: Get the index of the model code representation in regressor space.
    • _list_output_regressor_code: Create a flattened array of output regressors.
    • _list_input_regressor_code: Create a flattened array of input regressors.
    • _get_lag_from_regressor_code: Get the maximum lag from array of regressors.
    • _get_max_lag_from_model_code: the name says it all.
    • _get_max_lag: Get the maximum lag from ylag and xlag.
  • API Change (new): sysidentpy.narmax_base.InformationMatrix

    • _create_lagged_X: Create a lagged matrix of inputs without combinations.
    • _create_lagged_y: Create a lagged matrix of the output without combinations.
    • build_output_matrix: Build the information matrix of output values.
    • build_input_matrix: Build the information matrix of input values.
    • build_input_output_matrix: Build the information matrix of input and output values.
  • API Change (new): sysidentpy.narmax_base.ModelPrediction

    • predict: base method for prediction. Support infinity_steps ahead, one-step ahead and n-steps ahead prediction and any basis function.
    • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis function.
    • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial basis.
    • _model_prediction: Perform the infinity-step-ahead prediction for polynomial basis.
    • _narmax_predict: wrapper for NARMAX and NAR models.
    • _nfir_predict: wrapper for NFIR models.
    • _basis_function_predict: Perform the infinity-step-ahead prediction for basis functions other than polynomial.
    • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis functions other than polynomial.
  • API Change (new): sysidentpy.model_structure_selection.FROLS Issue62 <https://github.com/wilsonrljr/sysidentpy/issues/62>, Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>

    • Based on the old sysidentpy.polynomial_basis.PolynomialNARMAX. The class has been rebuilt with new functions and optimized code.
    • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
    • Add support for new basis functions.
    • The user can choose the residual lags.
    • No need to pass the number of inputs anymore.
    • Improved docstring.
    • Fixed minor grammatical and spelling mistakes.
    • New prediction method.
    • many under the hood changes.
  • API Change (new): sysidentpy.model_structure_selection.MetaMSS Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

    • Based on the old sysidentpy.polynomial_basis.MetaMSS. The class has been rebuilt with new functions and optimized code.
    • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
    • The user can choose the residual lags.
    • Extended Least Squares support.
    • Add support for new basis functions.
    • No need to pass the number of inputs anymore.
    • Improved docstring.
    • Fixed minor grammatical and spelling mistakes.
    • New prediction method.
    • many under the hood changes.
  • API Change (new): sysidentpy.model_structure_selection.AOLS Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

    • Based on the old sysidentpy.polynomial_basis.AOLS. The class has been rebuilt with new functions and optimized code.
    • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
    • Add support for new basis functions.
    • No need to pass the number of inputs anymore.
    • Improved docstring.
    • Change "l" parameter to "L".
    • Fixed minor grammatical and spelling mistakes.
    • New prediction method.
    • many under the hood changes.
  • API Change (new): sysidentpy.simulation.SimulateNARMAX

    • Based on the old sysidentpy.polynomial_basis.SimulatePolynomialNarmax. The class has been rebuilt with new functions and optimized code.
    • Fix the Extended Least Squares support.
    • Fix n-steps ahead prediction and 1-step ahead prediction.
    • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
    • The user can choose the residual lags.
    • Improved docstring.
    • Fixed minor grammatical and spelling mistakes.
    • New prediction method.
    • Do not inherit from the structure selection algorithm anymore, only from narmax_base. Avoid circular import and other issues.
    • many under the hood changes.
  • API Change (new): sysidentpy.residues

    • compute_residues_autocorrelation: the name says it all.
    • calculate_residues: get the residues from y and yhat.
    • get_unnormalized_e_acf: compute the unnormalized autocorrelation of the residues.
    • compute_cross_correlation: compute cross correlation between two signals.
    • _input_ccf
    • _normalized_correlation: compute the normalized correlation between two signals.
  • API Change (new): sysidentpy.utils.plotting

    • plot_results: plot the forecast
    • plot_residues_correlation: the name says it all.
  • API Change (new): sysidentpy.utils.display_results

    • results: return the model regressors, estimated parameter and ERR index of the fitted model in a table.
  • DOC: Air passenger benchmark Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__

    • Added notebook with Air passenger forecasting benchmark.
    • We compare SysIdentPy against prophet, neuralprophet, autoarima, tbats and many more.
  • DOC: Load forecasting benchmark Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__

    • Added notebook with load forecasting benchmark.
  • DOC: PV forecasting benchmark Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__

    • Added notebook with PV forecasting benchmark.
  • DOC: Presenting main functionality

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Multiple Inputs usage

    • Example rewritten following the new api
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Information Criteria - Examples

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Important notes and examples of how to use Extended Least Squares

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Setting specific lags

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Parameter Estimation

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Using the Meta-Model Structure Selection (MetaMSS) algorithm for building Polynomial NARX models

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Using the Accelerated Orthogonal Least-Squares algorithm for building Polynomial NARX models

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Example: F-16 Ground Vibration Test benchmark

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Building NARX Neural Network using Sysidentpy

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Building NARX models using general estimators

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Simulate a Predefined Model

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: System Identification Using Adaptive Filters

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Identification of an electromechanical system

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Example: N-steps-ahead prediction - F-16 Ground Vibration Test benchmark

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Introduction to NARMAX models

    • Fixed grammatical and spelling mistakes.

v0.1.6

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • MAJOR: Meta-Model Structure Selection Algorithm (Meta-MSS).

    • A new method for build NARMAX models based on metaheuristics. The algorithm uses a Binary hybrid Particle Swarm Optimization and Gravitational Search Algorithm with a new cost function to build parsimonious models.
    • New class for the BPSOGSA algorithm. New algorithms can be adapted in the Meta-MSS framework.
    • Future updates will add NARX models for classification and multiobjective model structure selection.
  • MAJOR: Accelerated Orthogonal Least-Squares algorithm.

    • Added the new class AOLS to build NARX models using the Accelerated Orthogonal Least-Squares algorithm.
    • At the best of my knowledge, this is the first time this algorithm is used in the NARMAX framework. The tests I've made are promising, but use it with caution until the results are formalized into a research paper.
  • Added notebook with a simple example of how to use MetaMSS and a simple model comparison of the Electromechanical system.

  • Added notebook with a simple example of how to use AOLS

  • Added ModelInformation class. This class have methods to return model information such as max_lag of a model code.

    • added _list_output_regressor_code
    • added _list_input_regressor_code
    • added _get_lag_from_regressor_code
    • added _get_max_lag_from_model_code
  • Minor performance improvement: added the argument "predefined_regressors" in build_information_matrix function on base.py to improve the performance of the Simulation method.

  • Pytorch is now an optional dependency. Use pip install sysidentpy['full']

  • Fix code format issues.

  • Fixed minor grammatical and spelling mistakes.

  • Fix issues related to html on Jupyter notebooks examples on documentation.

  • Updated Readme with examples of how to use.

  • Improved descriptions and comments in methods.

  • metaheuristics.bpsogsa (detailed description on code docstring)

    • added evaluate_objective_function
    • added optimize
    • added generate_random_population
    • added mass_calculation
    • added calculate_gravitational_constant
    • added calculate_acceleration
    • added update_velocity_position
  • FIX issue #52

v0.1.5

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • MAJOR: n-steps-ahead prediction.

    • Now you can define the numbers of steps ahead in the predict function.
    • Only for Polynomial models for now. Next update will bring this functionality to Neural NARX and General Estimators.
  • MAJOR: Simulating predefined models.

    • Added the new class SimulatePolynomialNarmax to handle the simulation of known model structures.
    • Now you can simulate predefined models by just passing the model structure codification. Check the notebook examples.
  • Added 4 new notebooks in the example section.

  • Added iterative notebooks. Now you can run the notebooks in Jupyter notebook section of the documentation in Colab.

  • Fix code format issues.

  • Added new tests for SimulatePolynomialNarmax and generate_data.

  • Started changes related to numpy 1.19.4 update. There are still some Deprecation warnings that will be fixed in next update.

  • Fix issues related to html on Jupyter notebooks examples on documentation.

  • Updated Readme with examples of how to use.

v0.1.4

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • MAJOR: Introducing NARX Neural Network in SysIdentPy.

    • Now you can build NARX Neural Network on SysIdentPy.
    • This feature is built on top of Pytorch. See the docs for more details and examples of how to use.
  • MAJOR: Introducing general estimators in SysIdentPy.

    • Now you are able to use any estimator that have Fit/Predict methods (estimators from Sklearn and Catboost, for example) and build NARX models based on those estimators.
    • We use the core functions of SysIdentPy and keep the Fit/Predict approach from those estimators to keep the process easy to use.
    • More estimators are coming soon like XGboost.
  • Added notebooks to show how to build NARX neural Network.

  • Added notebooks to show how to build NARX models using general estimators.

  • Changed the default parameters of the plot_results function.

  • NOTE: We will keeping improving the Polynomial NARX models (new model structure selection algorithms and multiobjective identification is on our roadmap). These recent modifications will allow us to introduce new NARX models like PWARX models very soon.

  • New template for the documentation site.

  • Fix issues related to html on Jupyter notebooks examples on documentation.

  • Updated Readme with examples of how to use.

v0.1.3

CONTRIBUTORS

  • wilsonrljr
  • renard162

CHANGES

  • Fixed a bug concerning the xlag and ylag in multiple input scenarios.
  • Refactored predict function. Improved performance up to 87% depending on the number of regressors.
  • You can set lags with different size for each input.
  • Added a new function to get the max value of xlag and ylag. Work with int, list, nested lists.
  • Fixed tests for information criteria.
  • Added SysIdentPy logo.
  • Refactored code of all classes following PEP 8 guidelines to improve readability.
  • Added Citation information on Readme.
  • Changes on information Criteria tests.
  • Added workflow to run the tests when merge branch into master.
  • Added new site domain.
  • Updated docs.
\ No newline at end of file +
Skip to content

Changes in SysIdentPy

v0.3.3

CONTRIBUTORS

  • wilsonrljr
  • GabrielBuenoLeandro
  • samirmartins

CHANGES

  • The update v0.3.3 has been released with additional features, API changes and fixes.

  • MAJOR: Multiobjective Framework: Affine Information Least Squares Algorithm (AILS)

    • Now you can use AILS to estimate parameters of NARMAX models (and variants) using a multiobjective approach.
    • AILS can be accessed using from sysidentpy.multiobjective_parameter_estimation import AILS
    • See the docs for a more in depth explanation of how to use AILS.
    • This feature is related to Issue #101
    • Several new methods were implemented to get the new feature and you can check all of it in sysidentpy -> multiobjective_parameter_estimation.
  • API Change: regressor_code variable was renamed as enconding to avoid using the same name as the method in narmax_tool regressor_code method.

  • DATASET: Added buck_id.csv and buck_valid.csv dataset to SysIdentPy repository.

  • DOC: Add a Multiobjetive Parameter Optimization Notebook showing how to use the new AILS method

  • DOC: Minor additions and grammar fixes.

v0.3.2

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.3.2 has been released with API changes and fixes.

  • Major:

    • Added Akaike Information Criteria corrected in FROLS. Now the user can use aicc as the information criteria to select the model order when using FROLS algorithm.
  • FIX: Issue #114. Replace yhat with y in root relative squared error. Thanks @miroder

  • TESTS: Minor changes in tests by removing unnecessary data load.

  • Remove unused code and comments.

  • Docs: Minor changes in notebooks. Added AICc method in the information criteria example.

v0.3.1

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.3.1 has been released with API changes and fixes.

  • API Change:

    • MetaMSS was returning the max lag of the final model instead of the maximum lag related to the xlag and ylag. This is not wrong (its related to the issue #55), but this change will be made for all methods at the same time. In this respect, I'm reverted this to return the maximum lag of the xlag and ylag.
  • API Change: Added build_matrix method in BaseMSS. This change improved overall code readability by rewriting if/elif/else clauses in every model structure selection algorithm.

  • API Change: Added bic, aic, fpe, and lilc methods in FROLS. Now the method is selected by using a predefined dictionary with the available options. This change improved overall code readability by rewriting if/elif/else clauses in the FROLS algorithm.

  • TESTS: Added tests for Neural NARX class. The issue with pytorch was fixed and now we have the tests for every model class.

  • Remove unused code and comments.

v0.3.0

CONTRIBUTORS

  • wilsonrljr
  • gamcorn
  • Gabo-Tor

CHANGES

  • The update v0.3.0 has been released with additional features, API changes and fixes.

  • MAJOR: Estimators support in AOLS

    • Now you can use any SysIdentPy estimator in AOLS model structure selection.
  • API Change:

    • Refactored base class for model structure selection. A refactored base class for model structure selection has been introduced in SysIdentPy. This update aims to enhance the system identification process by preparing the package for new features that are currently in development, like multiobjective parameter estimation, new basis functions and more.

    Several methods within the base class have undergone significant restructuring to improve their functionality and optimize their performance. This reorganization will facilitate the incorporation of advanced model selection techniques in the future, which will enable users to obtain dynamic models with robust dynamic and static performance. - Avoid unnecessary inheritance in every MSS method and improve the readability with better structured classes. - Rewritten methods to avoid code duplication. - Improve overall code readability by rewriting if/elif/else clauses.

  • Breaking Change: X_train and y_train were replaced respectively by X and y in fit method in MetaMSS model structure selection algorithm. X_test and y_test were replaced by X and y in predict method in MetaMSS.

  • API Change: Added BaseBasisFunction class, an abstract base class for implementing basis functions.

  • Enhancement: Added support for python 3.11.

  • Future Deprecation Warning: The user will have to define the estimator and pass it to every model structure selection algorithm instead of using a string to define the Estimator. Currently the estimator is defined like "estimator='least_squares'". In version 0.4.0 the definition will be like "estimator=LeastSquares()"

  • FIX: Issue #96. Fix issue with numpy 1.24.* version. Thanks for the contribution @gamcorn.

  • FIX: Issue #91. Fix r2_score metric issue with 2 dimensional arrays.

  • FIX: Issue #90.

  • FIX: Issue #88 .Fix one step ahead prediction error in SimulateNARMAX class (thanks for pointing out, Lalith).

  • FIX: Fix error in selecting the correct regressors in AOLS.

  • Fix: Fix n step ahead prediction method not returning all values of the defined steps-ahead value when passing only the initial condition.

  • FIX: Fix Visible Deprecation Warning raised in get_max_lag method.

  • FIX: Fix deprecation warning in Extended Least Squares Example

  • DATASET: Added air passengers dataset to SysIdentPy repository.

  • DATASET: Added San Francisco Hospital Load dataset to SysIdentPy repository.

  • DATASET: Added San Francisco PV GHI dataset to SysIdentPy repository.

  • DOC: Improved documentation in Setting Specif Lags page. Now we bring an example of how to set specific lags for MISO models.

  • DOC: Minor additions and grammar fixes.

  • DOC: Improve image visualization using mkdocs-glightbox.

  • Update dev packages versions

v0.2.1

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.2.1 has been released with additional feature, minor API changes and fixes.

  • MAJOR: Neural NARX now support CUDA

    • Now the user can build Neural NARX models with CUDA support. Just add device='cuda' to use the GPU benefits.
    • Updated docs to show how to use the new feature.
  • MAJOR: New documentation website

    • The documentation is now entirely based on Markdown (no rst anymore).
    • We use MkDocs and Material for MkDocs theme now.
    • Dark theme option.
    • The Contribute page have more details to help those who wants to contribute with SysIdentPy.
    • New sections (e.g., Blog, Sponsors, etc.)
    • Many improvements under the hood.
  • MAJOR: Github Sponsor

  • Tests:

    • Now there are test for almost every function.
    • Neural NARX tests are raising numpy issues. It'll be fixed til next update.
  • FIX: NFIR models in General Estimators

    • Fix support for NFIR models using sklearn estimators.
  • The setup is now handled by the pyproject.toml file.

  • Remove unused code.

  • Fix docstring variables.

  • Fix code format issues.

  • Fix minor grammatical and spelling mistakes.

  • Fix issues related to html on Jupyter notebooks examples on documentation.

  • Updated Readme.

v0.2.0

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.2.0 has been released with additional feature, minor API changes and fixes.

  • MAJOR: Many new features for General Estimators

    • Now the user can build General NARX models with Fourier basis function.
    • The user can choose which basis they want by importing it from sysidentpy.basis_function. Check the notebooks with examples of how to use it.
    • Now it is possible to build General NAR models. The user just need to pass model_type="NAR" to build NAR models.
    • Now it is possible to build General NFIR models. The user just need to pass model_type="NFIR" to build NAR models.
    • Now it is possible to run n-steps ahead prediction using General Estimators. Until now only infinity-steps ahead were allowed. Now the users can set any steps they want.
    • Polynomial and Fourier are supported for now. New basis functions will be added in next releases.
    • No need to pass the number of inputs anymore.
    • Improved docstring.
    • Fixed minor grammatical and spelling mistakes.
    • many under the hood changes.
  • MAJOR: Many new features for NARX Neural Network

    • Now the user can build Neural NARX models with Fourier basis function.
    • The user can choose which basis they want by importing it from sysidentpy.basis_function. Check the notebooks with examples of how to use it.
    • Now it is possible to build Neural NAR models. The user just need to pass model_type="NAR" to build NAR models.
    • Now it is possible to build Neural NFIR models. The user just need to pass model_type="NFIR" to build NAR models.
    • Now it is possible to run n-steps ahead prediction using Neural NARX. Until now only infinity-steps ahead were allowed. Now the users can set any steps they want.
    • Polynomial and Fourier are supported for now. New basis functions will be added in next releases.
    • No need to pass the number of inputs anymore.
    • Improved docstring.
    • Fixed minor grammatical and spelling mistakes.
    • many under the hood changes.
  • Major: Support for old methods removed.

    • Now the old sysidentpy.PolynomialNarmax is not available anymore. All the old features are included in the new API with a lot of new features and performance improvements.
  • API Change (new): sysidentpy.general_estimators.ModelPrediction

    • ModelPrediction class was adapted to support General Estimators as a stand-alone class.
    • predict: base method for prediction. Support infinity_steps ahead, one-step ahead and n-steps ahead prediction and any basis function.
    • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis function.
    • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial basis.
    • _model_prediction: Perform the infinity-step-ahead prediction for polynomial basis.
    • _narmax_predict: wrapper for NARMAX and NAR models.
    • _nfir_predict: wrapper for NFIR models.
    • _basis_function_predict: Perform the infinity-step-ahead prediction for basis functions other than polynomial.
    • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis functions other than polynomial.
  • API Change (new): sysidentpy.neural_network.ModelPrediction

    • ModelPrediction class was adapted to support Neural NARX as a stand-alone class.
    • predict: base method for prediction. Support infinity_steps ahead, one-step ahead and n-steps ahead prediction and any basis function.
    • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis function.
    • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial basis.
    • _model_prediction: Perform the infinity-step-ahead prediction for polynomial basis.
    • _narmax_predict: wrapper for NARMAX and NAR models.
    • _nfir_predict: wrapper for NFIR models.
    • _basis_function_predict: Perform the infinity-step-ahead prediction for basis functions other than polynomial.
    • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis functions other than polynomial.
  • API Change: Fit method for Neural NARX revamped.

    • No need to convert the data to tensor before calling Fit method anymore.

API Change: Keyword and positional arguments - Now users have to provide parameters with their names, as keyword arguments, instead of positional arguments. This is valid for every model class now.

  • API Change (new): sysidentpy.utils.narmax_tools

    • New functions to help user getting useful information to build model. Now we have the regressor_code helper function to help to build neural NARX models.
  • DOC: Improved Basic Steps notebook with new details about the prediction function.

  • DOC: NARX Neural Network notebook was updated following the new api and showing new features.
  • DOC: General Estimators notebook was updated following the new api and showing new features.
  • DOC: Fixed minor grammatical and spelling mistakes, including Issues #77 and #78.
  • DOC: Fix issues related to html on Jupyter notebooks examples on documentation.

v0.1.9

CONTRIBUTORS

  • wilsonrljr
  • samirmartins

CHANGES

  • The update v0.1.9 has been released with additional feature, minor API changes and fixes of the new features added in v0.1.7.

  • MAJOR: Entropic Regression Algorithm

    • Added the new class ER to build NARX models using the Entropic Regression algorithm.
    • Only the Mutual Information KNN is implemented in this version and it may take too long to run on a high number of regressor, so the user should be careful regarding the number of candidates to put in the model.
  • API: save_load

    • Added a function to save and load models from file.
  • API: Added tests for python 3.9

  • Fix : Change condition for n_info_values in FROLS. Now the value defined by the user is compared against X matrix shape instead of regressor space shape. This fix the Fourier basis function usage with more the 15 regressors in FROLS.

  • DOC: Save and Load models

    • Added a notebook showing how to use the save_load method.
  • DOC: Entropic Regression example

    • Added notebook with a simple example of how to use AOLS
  • DOC: Fourier Basis Function Example

    • Added notebook with a simple example of how to use Fourier Basis Function
  • DOC: PV forecasting benchmark

    • FIX AOLS prediction. The example was using the meta_mss model in prediction, so the results for AOLS were wrong.
  • DOC: Fixed minor grammatical and spelling mistakes.

  • DOC: Fix issues related to html on Jupyter notebooks examples on documentation.

v0.1.8

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.1.8 has been released with additional feature, minor API changes and fixes of the new features added in v0.1.7.

  • MAJOR: Ensemble Basis Functions

    • Now you can use different basis function together. For now we allow to use Fourier combined with Polynomial of different degrees.
  • API change: Add "ensemble" parameter in basis function to combine the features of different basis function.

  • Fix: N-steps ahead prediction for model_type="NAR" is working properly now with different forecast horizon.

  • DOC: Air passenger benchmark

    • Remove unused code.
    • Use default hyperparameter in SysIdentPy models.
  • DOC: Load forecasting benchmark

    • Remove unused code.
    • Use default hyperparameter in SysIdentPy models.
  • DOC: PV forecasting benchmark

    • Remove unused code.
    • Use default hyperparameter in SysIdentPy models.

v0.1.7

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • The update v0.1.7 has been released with major changes and additional features. There are several API modifications and you will need to change your code to have the new (and upcoming) features. All modifications are meant to make future expansion easier.

  • On the user's side, the changes are not that disruptive, but in the background there are many changes that allowed the inclusion of new features and bug fixes that would be complex to solve without the changes. Check the documentation page <http://sysidentpy.org/notebooks.html>__

  • Many classes were basically rebuild it from scratch, so I suggest to look at the new examples of how to use the new version.

  • I will present the main updates below in order to highlight features and usability and then all API changes will be reported.

  • MAJOR: NARX models with Fourier basis function Issue63 <https://github.com/wilsonrljr/sysidentpy/issues/63>, Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>

    • The user can choose which basis they want by importing it from sysidentpy.basis_function. Check the notebooks with examples of how to use it.
    • Polynomial and Fourier are supported for now. New basis functions will be added in next releases.
  • MAJOR: NAR models Issue58 <https://github.com/wilsonrljr/sysidentpy/issues/58>__

    • It was already possible to build Polynomial NAR models, but with some hacks. Now the user just need to pass model_type="NAR" to build NAR models.
    • The user doesn't need to pass a vector of zeros as input anymore.
    • Works for any model structure selection algorithm (FROLS, AOLS, MetaMSS)
  • Major: NFIR models Issue59 <https://github.com/wilsonrljr/sysidentpy/issues/59>__

    • NFIR models are models where the output depends only on past inputs. It was already possible to build Polynomial NFIR models, but with a lot of code on the user's side (much more than NAR, btw). Now the user just need to pass model_type="NFIR" to build NFIR models.
    • Works for any model structure selection algorithm (FROLS, AOLS, MetaMSS)
  • Major: Select the order for the residues lags to use in Extended Least Squares - elag

    • The user can select the maximum lag of the residues to be used in the Extended Least Squares algorithm. In previous versions sysidentpy used a predefined subset of residual lags.
    • The degree of the lags follows the degree of the basis function
  • Major: Residual analysis methods Issue60 <https://github.com/wilsonrljr/sysidentpy/issues/60>__

    • There are now specific functions to calculate the autocorrelation of the residuals and cross-correlation for the analysis of the residuals. In previous versions the calculation was limited to just two inputs, for example, limiting user usability.
  • Major: Plotting methods Issue61 <https://github.com/wilsonrljr/sysidentpy/issues/61>__

    • The plotting functions are now separated from the models objects, so there are more flexibility regarding what to plot.
    • Residual plots were separated from the forecast plot
  • API Change: sysidentpy.polynomial_basis.PolynomialNarmax is deprecated. Use sysidentpy.model_structure_selection.FROLS instead. Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/62>__

    • Now the user doesn't need to pass the number of inputs as a parameter.
    • Added the elag parameter for unbiased_estimator. Now the user can define the number of lags of the residues for parameter estimation using the Extended Least Squares algorithm.
    • model_type parameter: now the user can select the model type to be built. The options are "NARMAX", "NAR" and "NFIR". "NARMAX" is the default. If you want to build a NAR model without any "hack", just set model_type="NAR". The same for "NFIR" models.
  • API Change: sysidentpy.polynomial_basis.MetaMSS is deprecated. Use sysidentpy.model_structure_selection.MetaMSS instead. Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

    • Now the user doesn't need to pass the number of inputs as a parameter.
    • Added the elag parameter for unbiased_estimator. Now the user can define the number of lags of the residues for parameter estimation using the Extended Least Squares algorithm.
  • API Change: sysidentpy.polynomial_basis.AOLS is deprecated. Use sysidentpy.model_structure_selection.AOLS instead. Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

  • API Change: sysidentpy.polynomial_basis.SimulatePolynomialNarmax is deprecated. Use sysidentpy.simulation.SimulateNARMAX instead.

  • API Change: Introducing sysidentpy.basis_function. Because NARMAX models can be built on different basis function, a new module is added to make easier to implement new basis functions in future updates Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__.

    • Each basis function class must have a fit and predict method to be used in training and prediction respectively.
  • API Change: unbiased_estimator method moved to Estimators class.

    • added elag option
    • change the build_information_matrix method to build_output_matrix
  • API Change (new): sysidentpy.narmax_base

    • This is the new base for building NARMAX models. The classes have been rewritten to make it easier to expand functionality.
  • API Change (new): sysidentpy.narmax_base.GenerateRegressors

    • create_narmax_code: Creates the base coding that allows representation for the NARMAX, NAR, and NFIR models.
    • regressor_space: Creates the encoding representation for the NARMAX, NAR, and NFIR models.
  • API Change (new): sysidentpy.narmax_base.ModelInformation

    • _get_index_from_regressor_code: Get the index of the model code representation in regressor space.
    • _list_output_regressor_code: Create a flattened array of output regressors.
    • _list_input_regressor_code: Create a flattened array of input regressors.
    • _get_lag_from_regressor_code: Get the maximum lag from array of regressors.
    • _get_max_lag_from_model_code: the name says it all.
    • _get_max_lag: Get the maximum lag from ylag and xlag.
  • API Change (new): sysidentpy.narmax_base.InformationMatrix

    • _create_lagged_X: Create a lagged matrix of inputs without combinations.
    • _create_lagged_y: Create a lagged matrix of the output without combinations.
    • build_output_matrix: Build the information matrix of output values.
    • build_input_matrix: Build the information matrix of input values.
    • build_input_output_matrix: Build the information matrix of input and output values.
  • API Change (new): sysidentpy.narmax_base.ModelPrediction

    • predict: base method for prediction. Support infinity_steps ahead, one-step ahead and n-steps ahead prediction and any basis function.
    • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis function.
    • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial basis.
    • _model_prediction: Perform the infinity-step-ahead prediction for polynomial basis.
    • _narmax_predict: wrapper for NARMAX and NAR models.
    • _nfir_predict: wrapper for NFIR models.
    • _basis_function_predict: Perform the infinity-step-ahead prediction for basis functions other than polynomial.
    • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis functions other than polynomial.
  • API Change (new): sysidentpy.model_structure_selection.FROLS Issue62 <https://github.com/wilsonrljr/sysidentpy/issues/62>, Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>

    • Based on the old sysidentpy.polynomial_basis.PolynomialNARMAX. The class has been rebuilt with new functions and optimized code.
    • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
    • Add support for new basis functions.
    • The user can choose the residual lags.
    • No need to pass the number of inputs anymore.
    • Improved docstring.
    • Fixed minor grammatical and spelling mistakes.
    • New prediction method.
    • many under the hood changes.
  • API Change (new): sysidentpy.model_structure_selection.MetaMSS Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

    • Based on the old sysidentpy.polynomial_basis.MetaMSS. The class has been rebuilt with new functions and optimized code.
    • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
    • The user can choose the residual lags.
    • Extended Least Squares support.
    • Add support for new basis functions.
    • No need to pass the number of inputs anymore.
    • Improved docstring.
    • Fixed minor grammatical and spelling mistakes.
    • New prediction method.
    • many under the hood changes.
  • API Change (new): sysidentpy.model_structure_selection.AOLS Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

    • Based on the old sysidentpy.polynomial_basis.AOLS. The class has been rebuilt with new functions and optimized code.
    • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
    • Add support for new basis functions.
    • No need to pass the number of inputs anymore.
    • Improved docstring.
    • Change "l" parameter to "L".
    • Fixed minor grammatical and spelling mistakes.
    • New prediction method.
    • many under the hood changes.
  • API Change (new): sysidentpy.simulation.SimulateNARMAX

    • Based on the old sysidentpy.polynomial_basis.SimulatePolynomialNarmax. The class has been rebuilt with new functions and optimized code.
    • Fix the Extended Least Squares support.
    • Fix n-steps ahead prediction and 1-step ahead prediction.
    • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
    • The user can choose the residual lags.
    • Improved docstring.
    • Fixed minor grammatical and spelling mistakes.
    • New prediction method.
    • Do not inherit from the structure selection algorithm anymore, only from narmax_base. Avoid circular import and other issues.
    • many under the hood changes.
  • API Change (new): sysidentpy.residues

    • compute_residues_autocorrelation: the name says it all.
    • calculate_residues: get the residues from y and yhat.
    • get_unnormalized_e_acf: compute the unnormalized autocorrelation of the residues.
    • compute_cross_correlation: compute cross correlation between two signals.
    • _input_ccf
    • _normalized_correlation: compute the normalized correlation between two signals.
  • API Change (new): sysidentpy.utils.plotting

    • plot_results: plot the forecast
    • plot_residues_correlation: the name says it all.
  • API Change (new): sysidentpy.utils.display_results

    • results: return the model regressors, estimated parameter and ERR index of the fitted model in a table.
  • DOC: Air passenger benchmark Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__

    • Added notebook with Air passenger forecasting benchmark.
    • We compare SysIdentPy against prophet, neuralprophet, autoarima, tbats and many more.
  • DOC: Load forecasting benchmark Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__

    • Added notebook with load forecasting benchmark.
  • DOC: PV forecasting benchmark Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__

    • Added notebook with PV forecasting benchmark.
  • DOC: Presenting main functionality

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Multiple Inputs usage

    • Example rewritten following the new api
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Information Criteria - Examples

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Important notes and examples of how to use Extended Least Squares

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Setting specific lags

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Parameter Estimation

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Using the Meta-Model Structure Selection (MetaMSS) algorithm for building Polynomial NARX models

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Using the Accelerated Orthogonal Least-Squares algorithm for building Polynomial NARX models

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Example: F-16 Ground Vibration Test benchmark

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Building NARX Neural Network using Sysidentpy

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Building NARX models using general estimators

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Simulate a Predefined Model

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: System Identification Using Adaptive Filters

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Identification of an electromechanical system

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Example: N-steps-ahead prediction - F-16 Ground Vibration Test benchmark

    • Example rewritten following the new api.
    • Fixed minor grammatical and spelling mistakes.
  • DOC: Introduction to NARMAX models

    • Fixed grammatical and spelling mistakes.

v0.1.6

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • MAJOR: Meta-Model Structure Selection Algorithm (Meta-MSS).

    • A new method for build NARMAX models based on metaheuristics. The algorithm uses a Binary hybrid Particle Swarm Optimization and Gravitational Search Algorithm with a new cost function to build parsimonious models.
    • New class for the BPSOGSA algorithm. New algorithms can be adapted in the Meta-MSS framework.
    • Future updates will add NARX models for classification and multiobjective model structure selection.
  • MAJOR: Accelerated Orthogonal Least-Squares algorithm.

    • Added the new class AOLS to build NARX models using the Accelerated Orthogonal Least-Squares algorithm.
    • At the best of my knowledge, this is the first time this algorithm is used in the NARMAX framework. The tests I've made are promising, but use it with caution until the results are formalized into a research paper.
  • Added notebook with a simple example of how to use MetaMSS and a simple model comparison of the Electromechanical system.

  • Added notebook with a simple example of how to use AOLS

  • Added ModelInformation class. This class have methods to return model information such as max_lag of a model code.

    • added _list_output_regressor_code
    • added _list_input_regressor_code
    • added _get_lag_from_regressor_code
    • added _get_max_lag_from_model_code
  • Minor performance improvement: added the argument "predefined_regressors" in build_information_matrix function on base.py to improve the performance of the Simulation method.

  • Pytorch is now an optional dependency. Use pip install sysidentpy['full']

  • Fix code format issues.

  • Fixed minor grammatical and spelling mistakes.

  • Fix issues related to html on Jupyter notebooks examples on documentation.

  • Updated Readme with examples of how to use.

  • Improved descriptions and comments in methods.

  • metaheuristics.bpsogsa (detailed description on code docstring)

    • added evaluate_objective_function
    • added optimize
    • added generate_random_population
    • added mass_calculation
    • added calculate_gravitational_constant
    • added calculate_acceleration
    • added update_velocity_position
  • FIX issue #52

v0.1.5

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • MAJOR: n-steps-ahead prediction.

    • Now you can define the numbers of steps ahead in the predict function.
    • Only for Polynomial models for now. Next update will bring this functionality to Neural NARX and General Estimators.
  • MAJOR: Simulating predefined models.

    • Added the new class SimulatePolynomialNarmax to handle the simulation of known model structures.
    • Now you can simulate predefined models by just passing the model structure codification. Check the notebook examples.
  • Added 4 new notebooks in the example section.

  • Added iterative notebooks. Now you can run the notebooks in Jupyter notebook section of the documentation in Colab.

  • Fix code format issues.

  • Added new tests for SimulatePolynomialNarmax and generate_data.

  • Started changes related to numpy 1.19.4 update. There are still some Deprecation warnings that will be fixed in next update.

  • Fix issues related to html on Jupyter notebooks examples on documentation.

  • Updated Readme with examples of how to use.

v0.1.4

CONTRIBUTORS

  • wilsonrljr

CHANGES

  • MAJOR: Introducing NARX Neural Network in SysIdentPy.

    • Now you can build NARX Neural Network on SysIdentPy.
    • This feature is built on top of Pytorch. See the docs for more details and examples of how to use.
  • MAJOR: Introducing general estimators in SysIdentPy.

    • Now you are able to use any estimator that have Fit/Predict methods (estimators from Sklearn and Catboost, for example) and build NARX models based on those estimators.
    • We use the core functions of SysIdentPy and keep the Fit/Predict approach from those estimators to keep the process easy to use.
    • More estimators are coming soon like XGboost.
  • Added notebooks to show how to build NARX neural Network.

  • Added notebooks to show how to build NARX models using general estimators.

  • Changed the default parameters of the plot_results function.

  • NOTE: We will keeping improving the Polynomial NARX models (new model structure selection algorithms and multiobjective identification is on our roadmap). These recent modifications will allow us to introduce new NARX models like PWARX models very soon.

  • New template for the documentation site.

  • Fix issues related to html on Jupyter notebooks examples on documentation.

  • Updated Readme with examples of how to use.

v0.1.3

CONTRIBUTORS

  • wilsonrljr
  • renard162

CHANGES

  • Fixed a bug concerning the xlag and ylag in multiple input scenarios.
  • Refactored predict function. Improved performance up to 87% depending on the number of regressors.
  • You can set lags with different size for each input.
  • Added a new function to get the max value of xlag and ylag. Work with int, list, nested lists.
  • Fixed tests for information criteria.
  • Added SysIdentPy logo.
  • Refactored code of all classes following PEP 8 guidelines to improve readability.
  • Added Citation information on Readme.
  • Changes on information Criteria tests.
  • Added workflow to run the tests when merge branch into master.
  • Added new site domain.
  • Updated docs.
\ No newline at end of file diff --git a/docs/code/aols/index.html b/docs/code/aols/index.html index a4e1abf..a30b5c6 100644 --- a/docs/code/aols/index.html +++ b/docs/code/aols/index.html @@ -1,5 +1,5 @@ - AOLS - SysIdentPy
Skip to content

Documentation for AOLS

NARMAX Models using the Accelerated Orthogonal Least-Squares algorithm

AOLS

Bases: Estimators, BaseMSS

Accelerated Orthogonal Least Squares Algorithm

Build Polynomial NARMAX model using the Accelerated Orthogonal Least-Squares ([1]_). This algorithm is based on the Matlab code available on: https://github.com/realabolfazl/AOLS/

The NARMAX model is described as:

\[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

where \(n_y\in \mathbb{N}^*\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

Parameters:

Name Type Description Default
ylag int, default

The maximum lag of the output.

2
xlag int, default

The maximum lag of the input.

2
k int, default

The sparsity level.

1
L int, default

Number of selected indices per iteration.

1
threshold float, default

The desired accuracy.

1e-09

Examples:

>>> import numpy as np
+                        

Documentation for AOLS

NARMAX Models using the Accelerated Orthogonal Least-Squares algorithm

AOLS

Bases: Estimators, BaseMSS

Accelerated Orthogonal Least Squares Algorithm

Build Polynomial NARMAX model using the Accelerated Orthogonal Least-Squares ([1]_). This algorithm is based on the Matlab code available on: https://github.com/realabolfazl/AOLS/

The NARMAX model is described as:

\[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

where \(n_y\in \mathbb{N}^*\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

Parameters:

Name Type Description Default
ylag int

The maximum lag of the output.

2
xlag int

The maximum lag of the input.

2
k int

The sparsity level.

1
L int

Number of selected indices per iteration.

1
threshold float

The desired accuracy.

10e10

Examples:

>>> import numpy as np
 >>> import matplotlib.pyplot as plt
 >>> from sysidentpy.model_structure_selection import AOLS
 >>> from sysidentpy.basis_function._basis_function import Polynomial
@@ -1116,7 +1116,7 @@
             X, y, steps_ahead, forecast_horizon
         )
         return yhat.reshape(-1, 1)
-

aols(psi, y)

Perform the Accelerated Orthogonal Least-Squares algorithm.

Parameters:

Name Type Description Default
y array-like of shape

The target data used in the identification process.

required
psi ndarray of floats

The information matrix of the model.

required

Returns:

Name Type Description
theta array-like of shape

The respective ERR calculated for each regressor.

piv array-like of shape

Contains the index to put the regressors in the correct order based on err values.

residual_norm float

The final residual norm.

References
Source code in sysidentpy\model_structure_selection\accelerated_orthogonal_least_squares.py
186
+

aols(psi, y)

Perform the Accelerated Orthogonal Least-Squares algorithm.

Parameters:

Name Type Description Default
y array-like of shape = n_samples

The target data used in the identification process.

required
psi ndarray of floats

The information matrix of the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The respective ERR calculated for each regressor.

piv array-like of shape = number_of_model_elements

Contains the index to put the regressors in the correct order based on err values.

residual_norm float

The final residual norm.

References
Source code in sysidentpy\model_structure_selection\accelerated_orthogonal_least_squares.py
186
 187
 188
 189
@@ -1271,7 +1271,7 @@
     pivv = np.argwhere(theta.ravel() != 0).ravel()
     theta = theta[theta != 0]
     return theta.reshape(-1, 1), pivv, residual_norm
-

fit(*, X=None, y=None)

Fit polynomial NARMAX model using AOLS algorithm.

The 'fit' function allows a friendly usage by the user. Given two arguments, X and y, fit training data.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the training process.

None
y ndarray of floats

The output data to be used in the training process.

None

Returns:

Name Type Description
model ndarray of int

The model code representation.

piv array-like of shape

Contains the index to put the regressors in the correct order based on err values.

theta array-like of shape

The estimated parameters of the model.

err array-like of shape

The respective ERR calculated for each regressor.

info_values array-like of shape

Vector with values of akaike's information criterion for models with N terms (where N is the vector position + 1).

Source code in sysidentpy\model_structure_selection\accelerated_orthogonal_least_squares.py
265
+

fit(*, X=None, y=None)

Fit polynomial NARMAX model using AOLS algorithm.

The 'fit' function allows a friendly usage by the user. Given two arguments, X and y, fit training data.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the training process.

None
y ndarray of floats

The output data to be used in the training process.

None

Returns:

Name Type Description
model ndarray of int

The model code representation.

piv array-like of shape = number_of_model_elements

Contains the index to put the regressors in the correct order based on err values.

theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

err array-like of shape = number_of_model_elements

The respective ERR calculated for each regressor.

info_values array-like of shape = n_regressor

Vector with values of akaike's information criterion for models with N terms (where N is the vector position + 1).

Source code in sysidentpy\model_structure_selection\accelerated_orthogonal_least_squares.py
265
 266
 267
 268
@@ -1430,7 +1430,7 @@
         0
     ]  # just to use the `results` method. Will be changed in next update.
     return self
-

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted values given an input.

The predict function allows a friendly usage by the user. Given a previously trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future)

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None
steps_ahead int (default

The user can use free run simulation, one-step ahead prediction and n-step ahead prediction.

None
forecast_horizon int, default

The number of predictions over the time.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\model_structure_selection\accelerated_orthogonal_least_squares.py
346
+

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted values given an input.

The predict function allows a friendly usage by the user. Given a previously trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future)

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None
steps_ahead int(default=None)

The user can use free run simulation, one-step ahead prediction and n-step ahead prediction.

None
forecast_horizon int

The number of predictions over the time.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\model_structure_selection\accelerated_orthogonal_least_squares.py
346
 347
 348
 349
diff --git a/docs/code/basis-function/index.html b/docs/code/basis-function/index.html
index 1b98a45..978f791 100644
--- a/docs/code/basis-function/index.html
+++ b/docs/code/basis-function/index.html
@@ -1,5 +1,5 @@
 
- Basis Functions - SysIdentPy        

Documentation for Basis Functions

Basis Function for NARMAX models

Fourier

Build Fourier basis function. Generate a new feature matrix consisting of all Fourier features with respect to the number of harmonics.

Parameters:

Name Type Description Default
degree int(max_degree), default

The maximum degree of the polynomial features.

1

Notes

Be aware that the number of features in the output array scales significantly as the number of inputs, the max lag of the input and output.

Source code in sysidentpy\basis_function\_basis_function.py
 96
+                        

Documentation for Basis Functions

Basis Function for NARMAX models

Fourier

Build Fourier basis function. Generate a new feature matrix consisting of all Fourier features with respect to the number of harmonics.

Parameters:

Name Type Description Default
degree int(max_degree)

The maximum degree of the polynomial features.

2

Notes

Be aware that the number of features in the output array scales significantly as the number of inputs, the max lag of the input and output.

Source code in sysidentpy\basis_function\_basis_function.py
 96
  97
  98
  99
@@ -203,7 +203,7 @@
         predefined_regressors: Union[np.ndarray, None] = None,
     ):
         return self.fit(data, max_lag, predefined_regressors)
-

fit(data, max_lag=1, predefined_regressors=None)

Build the Polynomial information matrix.

Each columns of the information matrix represents a candidate regressor. The set of candidate regressors are based on xlag, ylag, and degree defined by the user.

Parameters:

Name Type Description Default
data ndarray of floats

The lagged matrix built with respect to each lag and column.

required
max_lag int

Target data used on training phase.

1
predefined_regressors ndarray of int

The index of the selected regressors by the Model Structure Selection algorithm.

None

Returns:

Type Description
psi

The lagged matrix built in respect with each lag and column.

Source code in sysidentpy\basis_function\_basis_function.py
129
+

fit(data, max_lag=1, predefined_regressors=None)

Build the Polynomial information matrix.

Each columns of the information matrix represents a candidate regressor. The set of candidate regressors are based on xlag, ylag, and degree defined by the user.

Parameters:

Name Type Description Default
data ndarray of floats

The lagged matrix built with respect to each lag and column.

required
max_lag int

Target data used on training phase.

1
predefined_regressors ndarray of int

The index of the selected regressors by the Model Structure Selection algorithm.

None

Returns:

Type Description
psi = ndarray of floats

The lagged matrix built in respect with each lag and column.

Source code in sysidentpy\basis_function\_basis_function.py
129
 130
 131
 132
@@ -314,7 +314,7 @@
         return psi, self.ensemble
 
     return psi[:, predefined_regressors], self.ensemble
-

Polynomial

Bases: BaseBasisFunction

Build polynomial basis function. Generate a new feature matrix consisting of all polynomial combinations of the features with degree less than or equal to the specified degree.

\[ y_k = \sum_{i=1}^{p}\Theta_i \times \prod_{j=0}^{n_x}u_{k-j}^{b_i, j} \prod_{l=1}^{n_e}e_{k-l}^{d_i, l}\prod_{m=1}^{n_y}y_{k-m}^{a_i, m} \]

where \(p\) is the number of regressors, \(\Theta_i\) are the model parameters, and \(a_i, m, b_i, j\) and \(d_i, l \in \mathbb{N}\) are the exponents of the output, input and noise terms, respectively.

Parameters:

Name Type Description Default
degree int(max_degree), default

The maximum degree of the polynomial features.

2

Notes

Be aware that the number of features in the output array scales significantly as the number of inputs, the max lag of the input and output, and degree increases. High degrees can cause overfitting.

Source code in sysidentpy\basis_function\_basis_function.py
11
+

Polynomial

Bases: BaseBasisFunction

Build polynomial basis function. Generate a new feature matrix consisting of all polynomial combinations of the features with degree less than or equal to the specified degree.

\[ y_k = \sum_{i=1}^{p}\Theta_i \times \prod_{j=0}^{n_x}u_{k-j}^{b_i, j} \prod_{l=1}^{n_e}e_{k-l}^{d_i, l}\prod_{m=1}^{n_y}y_{k-m}^{a_i, m} \]

where \(p\) is the number of regressors, \(\Theta_i\) are the model parameters, and \(a_i, m, b_i, j\) and \(d_i, l \in \mathbb{N}\) are the exponents of the output, input and noise terms, respectively.

Parameters:

Name Type Description Default
degree int(max_degree)

The maximum degree of the polynomial features.

2

Notes

Be aware that the number of features in the output array scales significantly as the number of inputs, the max lag of the input and output, and degree increases. High degrees can cause overfitting.

Source code in sysidentpy\basis_function\_basis_function.py
11
 12
 13
 14
@@ -479,7 +479,7 @@
         predefined_regressors: Union[np.ndarray, None] = None,
     ):
         return self.fit(data, max_lag, predefined_regressors)
-

fit(data, max_lag=1, predefined_regressors=None)

Build the Polynomial information matrix.

Each columns of the information matrix represents a candidate regressor. The set of candidate regressors are based on xlag, ylag, and degree defined by the user.

Parameters:

Name Type Description Default
data ndarray of floats

The lagged matrix built with respect to each lag and column.

required
max_lag int

Target data used on training phase.

1
predefined_regressors ndarray of int

The index of the selected regressors by the Model Structure Selection algorithm.

None

Returns:

Type Description
psi

The lagged matrix built in respect with each lag and column.

Source code in sysidentpy\basis_function\_basis_function.py
44
+

fit(data, max_lag=1, predefined_regressors=None)

Build the Polynomial information matrix.

Each columns of the information matrix represents a candidate regressor. The set of candidate regressors are based on xlag, ylag, and degree defined by the user.

Parameters:

Name Type Description Default
data ndarray of floats

The lagged matrix built with respect to each lag and column.

required
max_lag int

Target data used on training phase.

1
predefined_regressors ndarray of int

The index of the selected regressors by the Model Structure Selection algorithm.

None

Returns:

Type Description
psi = ndarray of floats

The lagged matrix built in respect with each lag and column.

Source code in sysidentpy\basis_function\_basis_function.py
44
 45
 46
 47
diff --git a/docs/code/entropic-regression/index.html b/docs/code/entropic-regression/index.html
index 2b7303f..d7148ed 100644
--- a/docs/code/entropic-regression/index.html
+++ b/docs/code/entropic-regression/index.html
@@ -1,5 +1,5 @@
 
- Entropic Regression - SysIdentPy        

Documentation for Entropic Regression

Build Polynomial NARMAX Models using the Entropic Regression algorithm

ER

Bases: Estimators, BaseMSS

Entropic Regression Algorithm

Build Polynomial NARMAX model using the Entropic Regression Algorithm ([1]_). This algorithm is based on the Matlab package available on: https://github.com/almomaa/ERFit-Package

The NARMAX model is described as:

\[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

where \(n_y\in \mathbb{N}^*\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

Parameters:

Name Type Description Default
ylag int, default

The maximum lag of the output.

1
xlag int, default

The maximum lag of the input.

1
k int, default

The kth nearest neighbor to be used in estimation.

2
q float, default

Quantile to compute, which must be between 0 and 1 inclusive.

0.99
p default

Lp Measure of the distance in Knn estimator.

np.inf
n_perm int

Number of permutation to be used in shuffle test

200
estimator str, default

The parameter estimation method.

'least_squares'
skip_forward bool

To be used for difficult and highly uncertain problems. Skipping the forward selection results in more accurate solution, but comes with higher computational cost.

False
lam float, default

Forgetting factor of the Recursive Least Squares method.

0.98
delta float, default

Normalization factor of the P matrix.

0.01
offset_covariance float, default

The offset covariance factor of the affine least mean squares filter.

0.2
mu float, default

The convergence coefficient (learning rate) of the filter.

0.01
eps float

Normalization factor of the normalized filters.

np.finfo(np.float64).eps
gama float, default

The leakage factor of the Leaky LMS method.

0.2
weight float, default

Weight factor to control the proportions of the error norms and offers an extra degree of freedom within the adaptation of the LMS mixed norm method.

0.02
model_type str

The user can choose "NARMAX", "NAR" and "NFIR" models

'NARMAX'

Examples:

>>> import numpy as np
+                        

Documentation for Entropic Regression

Build Polynomial NARMAX Models using the Entropic Regression algorithm

ER

Bases: Estimators, BaseMSS

Entropic Regression Algorithm

Build Polynomial NARMAX model using the Entropic Regression Algorithm ([1]_). This algorithm is based on the Matlab package available on: https://github.com/almomaa/ERFit-Package

The NARMAX model is described as:

\[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

where \(n_y\in \mathbb{N}^*\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

Parameters:

Name Type Description Default
ylag int

The maximum lag of the output.

2
xlag int

The maximum lag of the input.

2
k int

The kth nearest neighbor to be used in estimation.

2
q float

Quantile to compute, which must be between 0 and 1 inclusive.

0.99
p default=inf,

Lp Measure of the distance in Knn estimator.

inf
n_perm int

Number of permutation to be used in shuffle test

200
estimator str

The parameter estimation method.

"least_squares"
skip_forward bool

To be used for difficult and highly uncertain problems. Skipping the forward selection results in more accurate solution, but comes with higher computational cost.

False
lam float

Forgetting factor of the Recursive Least Squares method.

0.98
delta float

Normalization factor of the P matrix.

0.01
offset_covariance float

The offset covariance factor of the affine least mean squares filter.

0.2
mu float

The convergence coefficient (learning rate) of the filter.

0.01
eps float

Normalization factor of the normalized filters.

eps
gama float

The leakage factor of the Leaky LMS method.

0.2
weight float

Weight factor to control the proportions of the error norms and offers an extra degree of freedom within the adaptation of the LMS mixed norm method.

0.02
model_type str

The user can choose "NARMAX", "NAR" and "NFIR" models

'NARMAX'

Examples:

>>> import numpy as np
 >>> import matplotlib.pyplot as plt
 >>> from sysidentpy.model_structure_selection import ER
 >>> from sysidentpy.basis_function._basis_function import Polynomial
@@ -1770,7 +1770,7 @@
             X, y, steps_ahead, forecast_horizon
         )
         return yhat.reshape(-1, 1)
-

conditional_mutual_information(y, f1, f2)

Finds the conditional mutual information. Finds the conditioned mutual information between \(y\) and \(f1\) given \(f2\).

This code is based on Matlab Entropic Regression package. https://github.com/almomaa/ERFit-Package

Parameters:

Name Type Description Default
y ndarray of floats

The source signal.

required
f1 ndarray of floats

The destination signal.

required
f2 ndarray of floats

The condition set.

required

Returns:

Name Type Description
vp_estimation float

The conditioned mutual information.

References
  • Abd AlRahman R. AlMomani, Jie Sun, and Erik Bollt. How Entropic Regression Beats the Outliers Problem in Nonlinear System Identification. Chaos 30, 013107 (2020).
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
Source code in sysidentpy\model_structure_selection\entropic_regression.py
426
+

conditional_mutual_information(y, f1, f2)

Finds the conditional mutual information. Finds the conditioned mutual information between \(y\) and \(f1\) given \(f2\).

This code is based on Matlab Entropic Regression package. https://github.com/almomaa/ERFit-Package

Parameters:

Name Type Description Default
y ndarray of floats

The source signal.

required
f1 ndarray of floats

The destination signal.

required
f2 ndarray of floats

The condition set.

required

Returns:

Name Type Description
vp_estimation float

The conditioned mutual information.

References
  • Abd AlRahman R. AlMomani, Jie Sun, and Erik Bollt. How Entropic Regression Beats the Outliers Problem in Nonlinear System Identification. Chaos 30, 013107 (2020).
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
Source code in sysidentpy\model_structure_selection\entropic_regression.py
426
 427
 428
 429
@@ -1907,7 +1907,7 @@
     arr = psi(y_f2 + 1) + psi(f1_f2 + 1) - psi(f2_f2 + 1)
     vp_estimation = psi(self.k) - np.nanmean(arr[np.isfinite(arr)])
     return vp_estimation
-

entropic_regression_backward(reg_matrix, y, piv)

Entropic Regression Backward Greedy Feature Elimination.

This algorithm is based on the Matlab package available on: https://github.com/almomaa/ERFit-Package

Parameters:

Name Type Description Default
reg_matrix ndarray of floats

The input data to be used in the prediction process.

required
y ndarray of floats

The output data to be used in the prediction process.

required
piv ndarray of ints

The set of indices to investigate

required

Returns:

Name Type Description
piv ndarray of ints

The set of remaining indices after the Backward Greedy Feature Elimination.

Source code in sysidentpy\model_structure_selection\entropic_regression.py
302
+

entropic_regression_backward(reg_matrix, y, piv)

Entropic Regression Backward Greedy Feature Elimination.

This algorithm is based on the Matlab package available on: https://github.com/almomaa/ERFit-Package

Parameters:

Name Type Description Default
reg_matrix ndarray of floats

The input data to be used in the prediction process.

required
y ndarray of floats

The output data to be used in the prediction process.

required
piv ndarray of ints

The set of indices to investigate

required

Returns:

Name Type Description
piv ndarray of ints

The set of remaining indices after the Backward Greedy Feature Elimination.

Source code in sysidentpy\model_structure_selection\entropic_regression.py
302
 303
 304
 305
@@ -1984,7 +1984,7 @@
         piv = np.delete(piv, ix)
 
     return piv
-

entropic_regression_forward(reg_matrix, y)

Entropic Regression Forward Greedy Feature Selection.

This algorithm is based on the Matlab package available on: https://github.com/almomaa/ERFit-Package

Parameters:

Name Type Description Default
reg_matrix ndarray of floats

The input data to be used in the prediction process.

required
y ndarray of floats

The output data to be used in the prediction process.

required

Returns:

Name Type Description
selected_terms ndarray of ints

The set of selected regressors after the Forward Greedy Feature Selection.

success boolean

Indicate if the forward selection succeed. If high degree of uncertainty is detected, and many parameters are selected, the success flag will be set to false. Then, the backward elimination will be applied for all indices.

Source code in sysidentpy\model_structure_selection\entropic_regression.py
342
+

entropic_regression_forward(reg_matrix, y)

Entropic Regression Forward Greedy Feature Selection.

This algorithm is based on the Matlab package available on: https://github.com/almomaa/ERFit-Package

Parameters:

Name Type Description Default
reg_matrix ndarray of floats

The input data to be used in the prediction process.

required
y ndarray of floats

The output data to be used in the prediction process.

required

Returns:

Name Type Description
selected_terms ndarray of ints

The set of selected regressors after the Forward Greedy Feature Selection.

success boolean

Indicate if the forward selection succeed. If high degree of uncertainty is detected, and many parameters are selected, the success flag will be set to false. Then, the backward elimination will be applied for all indices.

Source code in sysidentpy\model_structure_selection\entropic_regression.py
342
 343
 344
 345
@@ -2149,7 +2149,7 @@
             stop_criteria = True
 
     return selected_terms, success
-

fit(*, X=None, y=None)

Fit polynomial NARMAX model using AOLS algorithm.

The 'fit' function allows a friendly usage by the user. Given two arguments, X and y, fit training data.

The Entropic Regression algorithm is based on the Matlab package available on: https://github.com/almomaa/ERFit-Package

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the training process.

None
y ndarray of floats

The output data to be used in the training process.

None

Returns:

Name Type Description
model ndarray of int

The model code representation.

theta array-like of shape

The estimated parameters of the model.

References
  • Abd AlRahman R. AlMomani, Jie Sun, and Erik Bollt. How Entropic Regression Beats the Outliers Problem in Nonlinear System Identification. Chaos 30, 013107 (2020).
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
Source code in sysidentpy\model_structure_selection\entropic_regression.py
544
+

fit(*, X=None, y=None)

Fit polynomial NARMAX model using AOLS algorithm.

The 'fit' function allows a friendly usage by the user. Given two arguments, X and y, fit training data.

The Entropic Regression algorithm is based on the Matlab package available on: https://github.com/almomaa/ERFit-Package

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the training process.

None
y ndarray of floats

The output data to be used in the training process.

None

Returns:

Name Type Description
model ndarray of int

The model code representation.

theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

References
  • Abd AlRahman R. AlMomani, Jie Sun, and Erik Bollt. How Entropic Regression Beats the Outliers Problem in Nonlinear System Identification. Chaos 30, 013107 (2020).
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
Source code in sysidentpy\model_structure_selection\entropic_regression.py
544
 545
 546
 547
@@ -2416,7 +2416,7 @@
     ]  # just to use the `results` method. Will be changed in next update.
     self.pivv = final_model
     return self
-

mutual_information_knn(y, y_perm)

Finds the mutual information.

Finds the mutual information between \(x\) and \(y\) given \(z\).

This code is based on Matlab Entropic Regression package.

Parameters:

Name Type Description Default
y ndarray of floats

The source signal.

required
y_perm ndarray of floats

The destination signal.

required

Returns:

Name Type Description
ksg_estimation float

The conditioned mutual information.

References
  • Abd AlRahman R. AlMomani, Jie Sun, and Erik Bollt. How Entropic Regression Beats the Outliers Problem in Nonlinear System Identification. Chaos 30, 013107 (2020).
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
Source code in sysidentpy\model_structure_selection\entropic_regression.py
251
+

mutual_information_knn(y, y_perm)

Finds the mutual information.

Finds the mutual information between \(x\) and \(y\) given \(z\).

This code is based on Matlab Entropic Regression package.

Parameters:

Name Type Description Default
y ndarray of floats

The source signal.

required
y_perm ndarray of floats

The destination signal.

required

Returns:

Name Type Description
ksg_estimation float

The conditioned mutual information.

References
  • Abd AlRahman R. AlMomani, Jie Sun, and Erik Bollt. How Entropic Regression Beats the Outliers Problem in Nonlinear System Identification. Chaos 30, 013107 (2020).
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
Source code in sysidentpy\model_structure_selection\entropic_regression.py
251
 252
 253
 254
@@ -2515,7 +2515,7 @@
         psi(self.k) + psi(y.shape[0]) - np.nanmean(arr[np.isfinite(arr)])
     )
     return ksg_estimation
-

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted values given an input.

The predict function allows a friendly usage by the user. Given a previously trained model, predict values given a new set of data.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None
steps_ahead int (default

The user can use free run simulation, one-step ahead prediction and n-step ahead prediction.

None
forecast_horizon int, default

The number of predictions over the time.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\model_structure_selection\entropic_regression.py
679
+

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted values given an input.

The predict function allows a friendly usage by the user. Given a previously trained model, predict values given a new set of data.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None
steps_ahead int(default=None)

The user can use free run simulation, one-step ahead prediction and n-step ahead prediction.

None
forecast_horizon int

The number of predictions over the time.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\model_structure_selection\entropic_regression.py
679
 680
 681
 682
@@ -2622,7 +2622,7 @@
     )
     yhat = np.concatenate([y[: self.max_lag], yhat], axis=0)
     return yhat
-

tolerance_estimator(y)

Tolerance Estimation for mutual independence test. Finds the conditioned mutual information between \(y\) and \(f1\) given \(f2\).

This code is based on Matlab Entropic Regression package. https://github.com/almomaa/ERFit-Package

Parameters:

Name Type Description Default
y ndarray of floats

The source signal.

required

Returns:

Name Type Description
tol float

The tolerance value given q.

References
  • Abd AlRahman R. AlMomani, Jie Sun, and Erik Bollt. How Entropic Regression Beats the Outliers Problem in Nonlinear System Identification. Chaos 30, 013107 (2020).
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
Source code in sysidentpy\model_structure_selection\entropic_regression.py
496
+

tolerance_estimator(y)

Tolerance Estimation for mutual independence test. Finds the conditioned mutual information between \(y\) and \(f1\) given \(f2\).

This code is based on Matlab Entropic Regression package. https://github.com/almomaa/ERFit-Package

Parameters:

Name Type Description Default
y ndarray of floats

The source signal.

required

Returns:

Name Type Description
tol float

The tolerance value given q.

References
  • Abd AlRahman R. AlMomani, Jie Sun, and Erik Bollt. How Entropic Regression Beats the Outliers Problem in Nonlinear System Identification. Chaos 30, 013107 (2020).
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
  • Alexander Kraskov, Harald St¨ogbauer, and Peter Grassberger. Estimating mutual information. Physical Review E, 69:066-138,2004
Source code in sysidentpy\model_structure_selection\entropic_regression.py
496
 497
 498
 499
diff --git a/docs/code/frols/index.html b/docs/code/frols/index.html
index af09a82..cf9669a 100644
--- a/docs/code/frols/index.html
+++ b/docs/code/frols/index.html
@@ -1,5 +1,5 @@
 
- FROLS - SysIdentPy        

Documentation for FROLS

Build Polynomial NARMAX Models using FROLS algorithm

FROLS

Bases: Estimators, BaseMSS

Forward Regression Orthogonal Least Squares algorithm.

This class uses the FROLS algorithm ([1], [2]) to build NARMAX models. The NARMAX model is described as:

\[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

where \(n_y\in \mathbb{N}^*\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); $e_k \in \mathbb{R}^{n_e}4 stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

Parameters:

Name Type Description Default
ylag int, default

The maximum lag of the output.

2
xlag int, default

The maximum lag of the input.

2
elag int, default

The maximum lag of the residues.

2
order_selection bool

Whether to use information criteria for order selection.

False
info_criteria str, default

The information criteria method to be used.

'aic'
n_terms int, default

The number of the model terms to be selected. Note that n_terms overwrite the information criteria values.

None
n_info_values int, default

The number of iterations of the information criteria method.

10
estimator str, default

The parameter estimation method.

'recursive_least_squares'
extended_least_squares bool, default

Whether to use extended least squares method for parameter estimation. Note that we define a specific set of noise regressors.

False
lam float, default

Forgetting factor of the Recursive Least Squares method.

0.98
delta float, default

Normalization factor of the P matrix.

0.01
offset_covariance float, default

The offset covariance factor of the affine least mean squares filter.

0.2
mu float, default

The convergence coefficient (learning rate) of the filter.

0.01
eps float

Normalization factor of the normalized filters.

np.finfo(np.float64).eps
gama float, default

The leakage factor of the Leaky LMS method.

0.2
weight float, default

Weight factor to control the proportions of the error norms and offers an extra degree of freedom within the adaptation of the LMS mixed norm method.

0.02
model_type str

The user can choose "NARMAX", "NAR" and "NFIR" models

'NARMAX'

Examples:

>>> import numpy as np
+                        

Documentation for FROLS

Build Polynomial NARMAX Models using FROLS algorithm

FROLS

Bases: Estimators, BaseMSS

Forward Regression Orthogonal Least Squares algorithm.

This class uses the FROLS algorithm ([1], [2]) to build NARMAX models. The NARMAX model is described as:

\[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

where \(n_y\in \mathbb{N}^*\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); $e_k \in \mathbb{R}^{n_e}4 stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

Parameters:

Name Type Description Default
ylag int

The maximum lag of the output.

2
xlag int

The maximum lag of the input.

2
elag int

The maximum lag of the residues.

2
order_selection bool

Whether to use information criteria for order selection.

False
info_criteria str

The information criteria method to be used.

"aic"
n_terms int

The number of the model terms to be selected. Note that n_terms overwrite the information criteria values.

None
n_info_values int

The number of iterations of the information criteria method.

10
estimator str

The parameter estimation method.

"least_squares"
extended_least_squares bool

Whether to use extended least squares method for parameter estimation. Note that we define a specific set of noise regressors.

False
lam float

Forgetting factor of the Recursive Least Squares method.

0.98
delta float

Normalization factor of the P matrix.

0.01
offset_covariance float

The offset covariance factor of the affine least mean squares filter.

0.2
mu float

The convergence coefficient (learning rate) of the filter.

0.01
eps float

Normalization factor of the normalized filters.

eps
gama float

The leakage factor of the Leaky LMS method.

0.2
weight float

Weight factor to control the proportions of the error norms and offers an extra degree of freedom within the adaptation of the LMS mixed norm method.

0.02
model_type str

The user can choose "NARMAX", "NAR" and "NFIR" models

'NARMAX'

Examples:

>>> import numpy as np
 >>> import matplotlib.pyplot as plt
 >>> from sysidentpy.model_structure_selection import FROLS
 >>> from sysidentpy.basis_function._basis_function import Polynomial
@@ -1651,7 +1651,7 @@
             X, y, steps_ahead, forecast_horizon
         )
         return yhat.reshape(-1, 1)
-

aic(n_theta, n_samples, e_var)

Compute the Akaike information criteria value.

Parameters:

Name Type Description Default
n_theta int

Number of parameters of the model.

required
n_samples int

Number of samples given the maximum lag.

required
e_var float

Variance of the residues

required

Returns:

Name Type Description
info_criteria_value float

The computed value given the information criteria selected by the user.

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
413
+

aic(n_theta, n_samples, e_var)

Compute the Akaike information criteria value.

Parameters:

Name Type Description Default
n_theta int

Number of parameters of the model.

required
n_samples int

Number of samples given the maximum lag.

required
e_var float

Variance of the residues

required

Returns:

Name Type Description
info_criteria_value float

The computed value given the information criteria selected by the user.

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
413
 414
 415
 416
@@ -1698,7 +1698,7 @@
     info_criteria_value = e_factor + model_factor
 
     return info_criteria_value
-

aicc(n_theta, n_samples, e_var)

Compute the Akaike information Criteria corrected value.

Parameters:

Name Type Description Default
n_theta int

Number of parameters of the model.

required
n_samples int

Number of samples given the maximum lag.

required
e_var float

Variance of the residues

required

Returns:

Name Type Description
aicc float

The computed aicc value.

References
Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
438
+

aicc(n_theta, n_samples, e_var)

Compute the Akaike information Criteria corrected value.

Parameters:

Name Type Description Default
n_theta int

Number of parameters of the model.

required
n_samples int

Number of samples given the maximum lag.

required
e_var float

Variance of the residues

required

Returns:

Name Type Description
aicc float

The computed aicc value.

References
Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
438
 439
 440
 441
@@ -1749,7 +1749,7 @@
     aicc = aic + (2 * n_theta * (n_theta + 1) / (n_samples - n_theta - 1))
 
     return aicc
-

bic(n_theta, n_samples, e_var)

Compute the Bayesian information criteria value.

Parameters:

Name Type Description Default
n_theta int

Number of parameters of the model.

required
n_samples int

Number of samples given the maximum lag.

required
e_var float

Variance of the residues

required

Returns:

Name Type Description
info_criteria_value float

The computed value given the information criteria selected by the user.

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
388
+

bic(n_theta, n_samples, e_var)

Compute the Bayesian information criteria value.

Parameters:

Name Type Description Default
n_theta int

Number of parameters of the model.

required
n_samples int

Number of samples given the maximum lag.

required
e_var float

Variance of the residues

required

Returns:

Name Type Description
info_criteria_value float

The computed value given the information criteria selected by the user.

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
388
 389
 390
 391
@@ -1796,7 +1796,7 @@
     info_criteria_value = e_factor + model_factor
 
     return info_criteria_value
-

error_reduction_ratio(psi, y, process_term_number)

Perform the Error Reduction Ration algorithm.

Parameters:

Name Type Description Default
y array-like of shape

The target data used in the identification process.

required
psi ndarray of floats

The information matrix of the model.

required
process_term_number int

Number of Process Terms defined by the user.

required

Returns:

Name Type Description
err array-like of shape

The respective ERR calculated for each regressor.

piv array-like of shape

Contains the index to put the regressors in the correct order based on err values.

psi_orthogonal ndarray of floats

The updated and orthogonal information matrix.

References
  • Manuscript: Orthogonal least squares methods and their application to non-linear system identification https://eprints.soton.ac.uk/251147/1/778742007_content.pdf
  • Manuscript (portuguese): Identificação de Sistemas não Lineares Utilizando Modelos NARMAX Polinomiais – Uma Revisão e Novos Resultados
Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
252
+

error_reduction_ratio(psi, y, process_term_number)

Perform the Error Reduction Ration algorithm.

Parameters:

Name Type Description Default
y array-like of shape = n_samples

The target data used in the identification process.

required
psi ndarray of floats

The information matrix of the model.

required
process_term_number int

Number of Process Terms defined by the user.

required

Returns:

Name Type Description
err array-like of shape = number_of_model_elements

The respective ERR calculated for each regressor.

piv array-like of shape = number_of_model_elements

Contains the index to put the regressors in the correct order based on err values.

psi_orthogonal ndarray of floats

The updated and orthogonal information matrix.

References
  • Manuscript: Orthogonal least squares methods and their application to non-linear system identification https://eprints.soton.ac.uk/251147/1/778742007_content.pdf
  • Manuscript (portuguese): Identificação de Sistemas não Lineares Utilizando Modelos NARMAX Polinomiais – Uma Revisão e Novos Resultados
Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
252
 253
 254
 255
@@ -1931,7 +1931,7 @@
     tmp_piv = piv[0:process_term_number]
     psi_orthogonal = psi[:, tmp_piv]
     return err, piv, psi_orthogonal
-

fit(*, X=None, y=None)

Fit polynomial NARMAX model.

This is an 'alpha' version of the 'fit' function which allows a friendly usage by the user. Given two arguments, X and y, fit training data.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the training process.

None
y ndarray of floats

The output data to be used in the training process.

None

Returns:

Name Type Description
model ndarray of int

The model code representation.

piv array-like of shape

Contains the index to put the regressors in the correct order based on err values.

theta array-like of shape

The estimated parameters of the model.

err array-like of shape

The respective ERR calculated for each regressor.

info_values array-like of shape

Vector with values of akaike's information criterion for models with N terms (where N is the vector position + 1).

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
515
+

fit(*, X=None, y=None)

Fit polynomial NARMAX model.

This is an 'alpha' version of the 'fit' function which allows a friendly usage by the user. Given two arguments, X and y, fit training data.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the training process.

None
y ndarray of floats

The output data to be used in the training process.

None

Returns:

Name Type Description
model ndarray of int

The model code representation.

piv array-like of shape = number_of_model_elements

Contains the index to put the regressors in the correct order based on err values.

theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

err array-like of shape = number_of_model_elements

The respective ERR calculated for each regressor.

info_values array-like of shape = n_regressor

Vector with values of akaike's information criterion for models with N terms (where N is the vector position + 1).

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
515
 516
 517
 518
@@ -2126,7 +2126,7 @@
             psi, y, self.theta, self.elag, self.max_lag, self.estimator
         )
     return self
-

fpe(n_theta, n_samples, e_var)

Compute the Final Error Prediction value.

Parameters:

Name Type Description Default
n_theta int

Number of parameters of the model.

required
n_samples int

Number of samples given the maximum lag.

required
e_var float

Variance of the residues

required

Returns:

Name Type Description
info_criteria_value float

The computed value given the information criteria selected by the user.

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
465
+

fpe(n_theta, n_samples, e_var)

Compute the Final Error Prediction value.

Parameters:

Name Type Description Default
n_theta int

Number of parameters of the model.

required
n_samples int

Number of samples given the maximum lag.

required
e_var float

Variance of the residues

required

Returns:

Name Type Description
info_criteria_value float

The computed value given the information criteria selected by the user.

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
465
 466
 467
 468
@@ -2192,7 +2192,7 @@
         "lilc": self.lilc,
     }
     return info_criteria_options.get(info_criteria)
-

information_criterion(X_base, y)

Determine the model order.

This function uses a information criterion to determine the model size. 'Akaike'- Akaike's Information Criterion with critical value 2 (AIC) (default). 'Bayes' - Bayes Information Criterion (BIC). 'FPE' - Final Prediction Error (FPE). 'LILC' - Khundrin’s law ofiterated logarithm criterion (LILC).

Parameters:

Name Type Description Default
y array-like of shape

Target values of the system.

required
X_base array-like of shape

Input system values measured by the user.

required

Returns:

Name Type Description
output_vector array-like of shape

Vector with values of akaike's information criterion for models with N terms (where N is the vector position + 1).

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
321
+

information_criterion(X_base, y)

Determine the model order.

This function uses a information criterion to determine the model size. 'Akaike'- Akaike's Information Criterion with critical value 2 (AIC) (default). 'Bayes' - Bayes Information Criterion (BIC). 'FPE' - Final Prediction Error (FPE). 'LILC' - Khundrin’s law ofiterated logarithm criterion (LILC).

Parameters:

Name Type Description Default
y array-like of shape = n_samples

Target values of the system.

required
X_base array-like of shape = n_samples

Input system values measured by the user.

required

Returns:

Name Type Description
output_vector array-like of shape = n_regressor

Vector with values of akaike's information criterion for models with N terms (where N is the vector position + 1).

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
321
 322
 323
 324
@@ -2301,7 +2301,7 @@
         output_vector[i] = self.info_criteria_function(n_theta, n_samples, e_var)
 
     return output_vector
-

lilc(n_theta, n_samples, e_var)

Compute the Lilc information criteria value.

Parameters:

Name Type Description Default
n_theta int

Number of parameters of the model.

required
n_samples int

Number of samples given the maximum lag.

required
e_var float

Variance of the residues

required

Returns:

Name Type Description
info_criteria_value float

The computed value given the information criteria selected by the user.

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
490
+

lilc(n_theta, n_samples, e_var)

Compute the Lilc information criteria value.

Parameters:

Name Type Description Default
n_theta int

Number of parameters of the model.

required
n_samples int

Number of samples given the maximum lag.

required
e_var float

Variance of the residues

required

Returns:

Name Type Description
info_criteria_value float

The computed value given the information criteria selected by the user.

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
490
 491
 492
 493
@@ -2348,7 +2348,7 @@
     info_criteria_value = e_factor + model_factor
 
     return info_criteria_value
-

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted values given an input.

The predict function allows a friendly usage by the user. Given a previously trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future)

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None
steps_ahead int (default

The user can use free run simulation, one-step ahead prediction and n-step ahead prediction.

None
forecast_horizon int, default

The number of predictions over the time.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
614
+

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted values given an input.

The predict function allows a friendly usage by the user. Given a previously trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future)

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None
steps_ahead int(default=None)

The user can use free run simulation, one-step ahead prediction and n-step ahead prediction.

None
forecast_horizon int

The number of predictions over the time.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\model_structure_selection\forward_regression_orthogonal_least_squares.py
614
 615
 616
 617
diff --git a/docs/code/general-estimators/index.html b/docs/code/general-estimators/index.html
index db34332..0538da1 100644
--- a/docs/code/general-estimators/index.html
+++ b/docs/code/general-estimators/index.html
@@ -1,5 +1,5 @@
 
- General Estimators - SysIdentPy        

Documentation for General Estimators

Build NARX Models Using general estimators

NARX

Bases: BaseMSS

NARX model build on top of general estimators

Currently is possible to use any estimator that have a fit/predict as an Autoregressive Model. We use our GenerateRegressors and InformationMatrix classes to handle the creation of the lagged features and we are able to use a simple fit and prediction function to run infinity-steps-ahead prediction.

Parameters:

Name Type Description Default
ylag int, default

The maximum lag of the output.

1
xlag int, default

The maximum lag of the input.

1
fit_params dict, default

Optional parameters of the fit function of the baseline estimator

None
base_estimator default

The defined base estimator of the sklearn

None

Examples:

>>> import numpy as np
+                        

Documentation for General Estimators

Build NARX Models Using general estimators

NARX

Bases: BaseMSS

NARX model build on top of general estimators

Currently is possible to use any estimator that have a fit/predict as an Autoregressive Model. We use our GenerateRegressors and InformationMatrix classes to handle the creation of the lagged features and we are able to use a simple fit and prediction function to run infinity-steps-ahead prediction.

Parameters:

Name Type Description Default
ylag int

The maximum lag of the output.

2
xlag int

The maximum lag of the input.

2
fit_params dict

Optional parameters of the fit function of the baseline estimator

None
base_estimator default=None

The defined base estimator of the sklearn

None

Examples:

>>> import numpy as np
 >>> import pandas as pd
 >>> import matplotlib.pyplot as plt
 >>> from sysidentpy.metrics import mean_squared_error
@@ -1182,7 +1182,7 @@
 
         yhat = yhat.ravel()
         return yhat[self.max_lag : :].reshape(-1, 1)
-

fit(*, X=None, y=None)

Train a NARX Neural Network model.

This is an training pipeline that allows a friendly usage by the user. All the lagged features are built using the SysIdentPy classes and we use the fit method of the base estimator of the sklearn to fit the model.

Parameters:

Name Type Description Default
X ndarrays of floats

The input data to be used in the training process.

None
y ndarrays of floats

The output data to be used in the training process.

None

Returns:

Name Type Description
base_estimator sklearn estimator

The model fitted.

Source code in sysidentpy\general_estimators\narx.py
133
+

fit(*, X=None, y=None)

Train a NARX Neural Network model.

This is an training pipeline that allows a friendly usage by the user. All the lagged features are built using the SysIdentPy classes and we use the fit method of the base estimator of the sklearn to fit the model.

Parameters:

Name Type Description Default
X ndarrays of floats

The input data to be used in the training process.

None
y ndarrays of floats

The output data to be used in the training process.

None

Returns:

Name Type Description
base_estimator sklearn estimator

The model fitted.

Source code in sysidentpy\general_estimators\narx.py
133
 134
 135
 136
@@ -1344,7 +1344,7 @@
 
     yhat = yhat.ravel()[self.max_lag : :]
     return yhat.reshape(-1, 1)
-

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted given an input and initial values.

The predict function allows a friendly usage by the user. Given a trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future).

Currently we only support infinity-steps-ahead prediction, but run 1-step-ahead prediction manually is straightforward.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\general_estimators\narx.py
180
+

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted given an input and initial values.

The predict function allows a friendly usage by the user. Given a trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future).

Currently we only support infinity-steps-ahead prediction, but run 1-step-ahead prediction manually is straightforward.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\general_estimators\narx.py
180
 181
 182
 183
diff --git a/docs/code/metaheuristics/index.html b/docs/code/metaheuristics/index.html
index f1756b2..e75ce64 100644
--- a/docs/code/metaheuristics/index.html
+++ b/docs/code/metaheuristics/index.html
@@ -1,5 +1,5 @@
 
- Metaheuristics - SysIdentPy        

Documentation for Metaheuristics

Binary Hybrid Particle Swarm Optimization and Gravitational Search Algorithm

BPSOGSA

Binary Hybrid Particle Swarm Optimization and Gravitational Search Algorithm

Parameters:

Name Type Description Default
maxiter int, default

The maximum number of iterations.

30
alpha int, default

The descending coefficient of the gravitational constant.

23
g_zero int, default

The initial value of the gravitational constant.

100
k_agents_percent

Percent of agents applying force to the others in the last iteration.

2
norm int, default

The information criteria method to be used.

-2
power int, default

The number of the model terms to be selected. Note that n_terms overwrite the information criteria values.

2
n_agents int, default

The number of agents to search the optimal solution.

10
dimension int, default

The dimension of the search space. criteria method.

15
p_zeros float, default

The probability of getting ones in the construction of the population.

0.5
p_zeros float, default

The probability of getting zeros in the construction of the population.

0.5

Examples:

>>> import numpy as np
+                        

Documentation for Metaheuristics

Binary Hybrid Particle Swarm Optimization and Gravitational Search Algorithm

BPSOGSA

Binary Hybrid Particle Swarm Optimization and Gravitational Search Algorithm

Parameters:

Name Type Description Default
maxiter int

The maximum number of iterations.

30
alpha int

The descending coefficient of the gravitational constant.

23
g_zero int

The initial value of the gravitational constant.

100
k_agents_percent

Percent of agents applying force to the others in the last iteration.

2
norm int

The information criteria method to be used.

-2
power int

The number of the model terms to be selected. Note that n_terms overwrite the information criteria values.

2
n_agents int

The number of agents to search the optimal solution.

10
dimension int

The dimension of the search space. criteria method.

15
p_zeros float

The probability of getting ones in the construction of the population.

0.5
p_zeros float

The probability of getting zeros in the construction of the population.

0.5

Examples:

>>> import numpy as np
 >>> import matplotlib.pyplot as plt
 >>> from sysidentpy.metaheuristics import BPSOGSA
 >>> opt = BPSOGSA(maxiter=100,
@@ -629,7 +629,7 @@
         ind = np.where(r < transform_to_binary)
         population[ind] = 1 - population[ind]
         return velocity, population
-

calculate_acceleration(population, agent_mass, gravitational_constant, iteration)

Calculate the acceleration of each agent.

Parameters:

Name Type Description Default
population ndarray of zeros and ones

The population defined by the agents.

required
agent_mass ndarray of floats

The mass of each agent.

required
gravitational_constant float

The gravitational_constant at time defined by the iteration.

required
iteration int

The current iteration.

required

Returns:

Name Type Description
acceleration ndarray of floats

The acceleration of each agent.

Source code in sysidentpy\metaheuristics\bpsogsa.py
221
+

calculate_acceleration(population, agent_mass, gravitational_constant, iteration)

Calculate the acceleration of each agent.

Parameters:

Name Type Description Default
population ndarray of zeros and ones

The population defined by the agents.

required
agent_mass ndarray of floats

The mass of each agent.

required
gravitational_constant float

The gravitational_constant at time defined by the iteration.

required
iteration int

The current iteration.

required

Returns:

Name Type Description
acceleration ndarray of floats

The acceleration of each agent.

Source code in sysidentpy\metaheuristics\bpsogsa.py
221
 222
 223
 224
@@ -726,7 +726,7 @@
 
     acceleration = gravitational_force * gravitational_constant
     return acceleration
-

calculate_gravitational_constant(iteration)

Update the gravitational constant.

Parameters:

Name Type Description Default
iteration int

The specific time.

required

Returns:

Name Type Description
gravitational_constant float

The gravitational_constant at time defined by the iteration.

Source code in sysidentpy\metaheuristics\bpsogsa.py
201
+

calculate_gravitational_constant(iteration)

Update the gravitational constant.

Parameters:

Name Type Description Default
iteration int

The specific time.

required

Returns:

Name Type Description
gravitational_constant float

The gravitational_constant at time defined by the iteration.

Source code in sysidentpy\metaheuristics\bpsogsa.py
201
 202
 203
 204
@@ -774,7 +774,7 @@
     for candidate in candidate_solution:
         total += candidate**2
     return total
-

generate_random_population(random_state=None)

Generate the initial population of agents randomly

Returns:

Name Type Description
population ndarray of zeros and ones

The initial population of agents.

Source code in sysidentpy\metaheuristics\bpsogsa.py
155
+

generate_random_population(random_state=None)

Generate the initial population of agents randomly

Returns:

Name Type Description
population ndarray of zeros and ones

The initial population of agents.

Source code in sysidentpy\metaheuristics\bpsogsa.py
155
 156
 157
 158
@@ -801,7 +801,7 @@
         [0, 1], size=(self.dimension, self.n_agents), p=[self.p_zeros, self.p_ones]
     )
     return population
-

mass_calculation(fitness_value)

Calculate the inertial masses of the agents.

Parameters:

Name Type Description Default
fitness_value ndarray

The fitness value of each agent.

required

Returns:

Name Type Description
agent_mass ndarray of floats

The mass of each agent.

Source code in sysidentpy\metaheuristics\bpsogsa.py
170
+

mass_calculation(fitness_value)

Calculate the inertial masses of the agents.

Parameters:

Name Type Description Default
fitness_value ndarray

The fitness value of each agent.

required

Returns:

Name Type Description
agent_mass ndarray of floats

The mass of each agent.

Source code in sysidentpy\metaheuristics\bpsogsa.py
170
 171
 172
 173
@@ -959,7 +959,7 @@
         )
 
     return self
-

update_velocity_position(population, acceleration, velocity, iteration)

Update the velocity and position of each agent.

Parameters:

Name Type Description Default
population ndarray of zeros and ones

The population defined by the agents.

required
acceleration ndarray of floats

The acceleration of each agent.

required
velocity ndarray of floats

The velocity of each agent.

required
iteration int

The current iteration.

required

Returns:

Name Type Description
velocity ndarray of floats

The updated velocity of each agent.

population ndarray of zeros and ones

The updated population defined by the agents.

Source code in sysidentpy\metaheuristics\bpsogsa.py
271
+

update_velocity_position(population, acceleration, velocity, iteration)

Update the velocity and position of each agent.

Parameters:

Name Type Description Default
population ndarray of zeros and ones

The population defined by the agents.

required
acceleration ndarray of floats

The acceleration of each agent.

required
velocity ndarray of floats

The velocity of each agent.

required
iteration int

The current iteration.

required

Returns:

Name Type Description
velocity ndarray of floats

The updated velocity of each agent.

population ndarray of zeros and ones

The updated population defined by the agents.

Source code in sysidentpy\metaheuristics\bpsogsa.py
271
 272
 273
 274
diff --git a/docs/code/metamss/index.html b/docs/code/metamss/index.html
index 155c1c3..dc18c07 100644
--- a/docs/code/metamss/index.html
+++ b/docs/code/metamss/index.html
@@ -1,5 +1,5 @@
 
- MetaMSS - SysIdentPy        

Documentation for MetaMSS

Meta Model Structure Selection

MetaMSS

Bases: SimulateNARMAX, BPSOGSA

Meta-Model Structure Selection: Building Polynomial NARMAX model

This class uses the MetaMSS ([1], [2], [3]_) algorithm to build NARMAX models. The NARMAX model is described as:

\[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

where \(n_y\in \mathbb{N}^*\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

Parameters:

Name Type Description Default
ylag int, default

The maximum lag of the output.

1
xlag int, default

The maximum lag of the input.

1
loss_func str, default

The loss function to be minimized.

'metamss_loss'
estimator str, default

The parameter estimation method.

'least_squares'
estimate_parameter bool, default

Whether to estimate the model parameters.

True
extended_least_squares bool, default

Whether to use extended least squares method for parameter estimation. Note that we define a specific set of noise regressors.

False
lam float, default

Forgetting factor of the Recursive Least Squares method.

0.98
delta float, default

Normalization factor of the P matrix.

0.01
offset_covariance float, default

The offset covariance factor of the affine least mean squares filter.

0.2
mu float, default

The convergence coefficient (learning rate) of the filter.

0.01
eps float

Normalization factor of the normalized filters.

np.finfo(np.float64).eps
gama float, default

The leakage factor of the Leaky LMS method.

0.2
weight float, default

Weight factor to control the proportions of the error norms and offers an extra degree of freedom within the adaptation of the LMS mixed norm method.

0.02
maxiter int, default

The maximum number of iterations.

30
alpha int, default

The descending coefficient of the gravitational constant.

23
g_zero int, default

The initial value of the gravitational constant.

100
k_agents_percent int

Percent of agents applying force to the others in the last iteration.

2
norm int, default

The information criteria method to be used.

-2
power int, default

The number of the model terms to be selected. Note that n_terms overwrite the information criteria values.

2
n_agents int, default

The number of agents to search the optimal solution.

10
p_zeros float, default

The probability of getting ones in the construction of the population.

0.5
p_zeros float, default

The probability of getting zeros in the construction of the population.

0.5

Examples:

>>> import numpy as np
+                        

Documentation for MetaMSS

Meta Model Structure Selection

MetaMSS

Bases: SimulateNARMAX, BPSOGSA

Meta-Model Structure Selection: Building Polynomial NARMAX model

This class uses the MetaMSS ([1], [2], [3]_) algorithm to build NARMAX models. The NARMAX model is described as:

\[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

where \(n_y\in \mathbb{N}^*\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

Parameters:

Name Type Description Default
ylag int

The maximum lag of the output.

2
xlag int

The maximum lag of the input.

2
loss_func str

The loss function to be minimized.

"metamss_loss"
estimator str

The parameter estimation method.

"least_squares"
estimate_parameter bool

Whether to estimate the model parameters.

True
extended_least_squares bool

Whether to use extended least squares method for parameter estimation. Note that we define a specific set of noise regressors.

False
lam float

Forgetting factor of the Recursive Least Squares method.

0.98
delta float

Normalization factor of the P matrix.

0.01
offset_covariance float

The offset covariance factor of the affine least mean squares filter.

0.2
mu float

The convergence coefficient (learning rate) of the filter.

0.01
eps float

Normalization factor of the normalized filters.

eps
gama float

The leakage factor of the Leaky LMS method.

0.2
weight float

Weight factor to control the proportions of the error norms and offers an extra degree of freedom within the adaptation of the LMS mixed norm method.

0.02
maxiter int

The maximum number of iterations.

30
alpha int

The descending coefficient of the gravitational constant.

23
g_zero int

The initial value of the gravitational constant.

100
k_agents_percent int

Percent of agents applying force to the others in the last iteration.

2
norm int

The information criteria method to be used.

-2
power int

The number of the model terms to be selected. Note that n_terms overwrite the information criteria values.

2
n_agents int

The number of agents to search the optimal solution.

10
p_zeros float

The probability of getting ones in the construction of the population.

0.5
p_zeros float

The probability of getting zeros in the construction of the population.

0.5

Examples:

>>> import numpy as np
 >>> import matplotlib.pyplot as plt
 >>> from sysidentpy.model_structure_selection import MetaMSS
 >>> from sysidentpy.metrics import root_relative_squared_error
@@ -1438,7 +1438,7 @@
         raise NotImplementedError(
             "You can only use Polynomial Basis Function in MetaMSS for now."
         )
-

aic(y_test, yhat, n_theta)

Calculate the Akaike Information Criterion

Parameters:

Name Type Description Default
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

required
yhat ndarray of floats

The n-steps-ahead predicted values of the model.

required
n_theta ndarray of floats

The number of model parameters.

required

Returns:

Name Type Description
aic float

The Akaike Information Criterion

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
476
+

aic(y_test, yhat, n_theta)

Calculate the Akaike Information Criterion

Parameters:

Name Type Description Default
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

required
yhat ndarray of floats

The n-steps-ahead predicted values of the model.

required
n_theta ndarray of floats

The number of model parameters.

required

Returns:

Name Type Description
aic float

The Akaike Information Criterion

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
476
 477
 478
 479
@@ -1479,7 +1479,7 @@
     mse = mean_squared_error(y_test, yhat)
     n = y_test.shape[0]
     return n * np.log(mse) + 2 * n_theta
-

bic(y_test, yhat, n_theta)

Calculate the Bayesian Information Criterion

Parameters:

Name Type Description Default
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

required
yhat ndarray of floats

The n-steps-ahead predicted values of the model.

required
n_theta ndarray of floats

The number of model parameters.

required

Returns:

Name Type Description
bic float

The Bayesian Information Criterion

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
498
+

bic(y_test, yhat, n_theta)

Calculate the Bayesian Information Criterion

Parameters:

Name Type Description Default
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

required
yhat ndarray of floats

The n-steps-ahead predicted values of the model.

required
n_theta ndarray of floats

The number of model parameters.

required

Returns:

Name Type Description
bic float

The Bayesian Information Criterion

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
498
 499
 500
 501
@@ -1520,7 +1520,7 @@
     mse = mean_squared_error(y_test, yhat)
     n = y_test.shape[0]
     return n * np.log(mse) + n_theta + np.log(n)
-

evaluate_objective_function(X_train, y_train, X_test, y_test, population)

Fit the polynomial NARMAX model.

Parameters:

Name Type Description Default
X_train ndarray of floats

The input data to be used in the training process.

required
y_train ndarray of floats

The output data to be used in the training process.

required
X_test ndarray of floats

The input data to be used in the prediction process.

required
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

required
population ndarray of zeros and ones

The initial population of agents.

required

Returns:

Name Type Description
fitness_value ndarray

The fitness value of each agent.

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
348
+

evaluate_objective_function(X_train, y_train, X_test, y_test, population)

Fit the polynomial NARMAX model.

Parameters:

Name Type Description Default
X_train ndarray of floats

The input data to be used in the training process.

required
y_train ndarray of floats

The output data to be used in the training process.

required
X_test ndarray of floats

The input data to be used in the prediction process.

required
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

required
population ndarray of zeros and ones

The initial population of agents.

required

Returns:

Name Type Description
fitness_value ndarray

The fitness value of each agent.

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
348
 349
 350
 351
@@ -1671,7 +1671,7 @@
         fitness.append(d)
 
     return fitness
-

fit(*, X=None, y=None, X_test=None, y_test=None)

Fit the polynomial NARMAX model.

Parameters:

Name Type Description Default
X_train ndarray of floats

The input data to be used in the training process.

required
y_train ndarray of floats

The output data to be used in the training process.

required
X_test ndarray of floats

The input data to be used in the prediction process.

None
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

None

Returns:

Name Type Description
self returns an instance of self.
Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
257
+

fit(*, X=None, y=None, X_test=None, y_test=None)

Fit the polynomial NARMAX model.

Parameters:

Name Type Description Default
X_train ndarray of floats

The input data to be used in the training process.

required
y_train ndarray of floats

The output data to be used in the training process.

required
X_test ndarray of floats

The input data to be used in the prediction process.

None
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

None

Returns:

Name Type Description
self returns an instance of self.
Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
257
 258
 259
 260
@@ -1850,7 +1850,7 @@
     )
     self.max_lag = self._get_max_lag()
     return self
-

metamss_loss(y_test, yhat, n_terms)

Calculate the MetaMSS loss function

Parameters:

Name Type Description Default
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

required
yhat ndarray of floats

The n-steps-ahead predicted values of the model.

required
n_terms ndarray of floats

The number of model parameters.

required

Returns:

Name Type Description
metamss_loss float

The MetaMSS loss function

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
520
+

metamss_loss(y_test, yhat, n_terms)

Calculate the MetaMSS loss function

Parameters:

Name Type Description Default
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

required
yhat ndarray of floats

The n-steps-ahead predicted values of the model.

required
n_terms ndarray of floats

The number of model parameters.

required

Returns:

Name Type Description
metamss_loss float

The MetaMSS loss function

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
520
 521
 522
 523
@@ -2023,7 +2023,7 @@
 
     # t_test and tail2P will be returned in future updates
     return pos_insignificant_terms, t_test, tail2P
-

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted values given an input.

The predict function allows a friendly usage by the user. Given a previously trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future)

Parameters:

Name Type Description Default
X_test ndarray of floats

The input data to be used in the prediction process.

required
y_test ndarray of floats

The output data to be used in the prediction process.

required
steps_ahead int (default

The user can use free run simulation, one-step ahead prediction and n-step ahead prediction.

None
forecast_horizon int, default

The number of predictions over the time.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
579
+

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted values given an input.

The predict function allows a friendly usage by the user. Given a previously trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future)

Parameters:

Name Type Description Default
X_test ndarray of floats

The input data to be used in the prediction process.

required
y_test ndarray of floats

The output data to be used in the prediction process.

required
steps_ahead int(default=None)

The user can use free run simulation, one-step ahead prediction and n-step ahead prediction.

None
forecast_horizon int

The number of predictions over the time.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
579
 580
 581
 582
@@ -2114,7 +2114,7 @@
     raise NotImplementedError(
         "MetaMSS doesn't support basis functions other than polynomial yet.",
     )
-

sigmoid_linear_unit_derivative(x, c, a)

Calculate the derivative of the Sigmoid Linear Unit function.

The derivative of Sigmoid Linear Unit (dSiLU) function can be viewed as a overshooting version of the sigmoid function.

Parameters:

Name Type Description Default
x ndarray

The range of the regressors space.

required
a float

The rate of change.

required
c int

Corresponds to the x value where y = 0.5.

required

Returns:

Name Type Description
penalty ndarray of floats

The values of the penalty function

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
552
+

sigmoid_linear_unit_derivative(x, c, a)

Calculate the derivative of the Sigmoid Linear Unit function.

The derivative of Sigmoid Linear Unit (dSiLU) function can be viewed as a overshooting version of the sigmoid function.

Parameters:

Name Type Description Default
x ndarray

The range of the regressors space.

required
a float

The rate of change.

required
c int

Corresponds to the x value where y = 0.5.

required

Returns:

Name Type Description
penalty ndarray of floats

The values of the penalty function

Source code in sysidentpy\model_structure_selection\meta_model_structure_selection.py
552
 553
 554
 555
diff --git a/docs/code/metrics/index.html b/docs/code/metrics/index.html
index 0deb214..4bbc5ad 100644
--- a/docs/code/metrics/index.html
+++ b/docs/code/metrics/index.html
@@ -1,5 +1,5 @@
 
- Metrics - SysIdentPy        

Documentation for Metrics

Common metrics to assess performance on NARX models.

explained_variance_score(y, yhat)

Calculate the Explained Variance Score.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

EVS output is non-negative values. Becoming 1.0 means your model outputs are exactly matched by true target values. Lower values means worse results.

References

Examples:

>>> y = [3, -0.5, 2, 7]
+                        

Documentation for Metrics

Common metrics to assess performance on NARX models.

explained_variance_score(y, yhat)

Calculate the Explained Variance Score.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

EVS output is non-negative values. Becoming 1.0 means your model outputs are exactly matched by true target values. Lower values means worse results.

References

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> explained_variance_score(y, yhat)
 0.957
@@ -95,7 +95,7 @@
     output_scores[valid_score] = 1 - (numerator[valid_score] / denominator[valid_score])
     output_scores[nonzero_numerator & ~nonzero_denominator] = 0.0
     return np.average(output_scores)
-

forecast_error(y, yhat)

Calculate the forecast error in a regression model.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss ndarray of floats

The difference between the true target values and the predicted or forecast value in regression or any other phenomenon.

References

Examples:

>>> y = [3, -0.5, 2, 7]
+

forecast_error(y, yhat)

Calculate the forecast error in a regression model.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss ndarray of floats

The difference between the true target values and the predicted or forecast value in regression or any other phenomenon.

References

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> forecast_error(y, yhat)
 [0.5, -0.5, 0, -1]
@@ -158,7 +158,7 @@
 
     """
     return np.array(y - yhat)
-

mean_absolute_error(y, yhat)

Calculate the Mean absolute error.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float or ndarray of floats

MAE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

References

Examples:

>>> y = [3, -0.5, 2, 7]
+

mean_absolute_error(y, yhat)

Calculate the Mean absolute error.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float or ndarray of floats

MAE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

References

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> mean_absolute_error(y, yhat)
 0.5
@@ -223,7 +223,7 @@
     """
     output_errors = np.average(np.abs(y - yhat))
     return np.average(output_errors)
-

mean_forecast_error(y, yhat)

Calculate the mean of forecast error of a regression model.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

The mean value of the difference between the true target values and the predicted or forecast value in regression or any other phenomenon.

References

Examples:

>>> y = [3, -0.5, 2, 7]
+

mean_forecast_error(y, yhat)

Calculate the mean of forecast error of a regression model.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

The mean value of the difference between the true target values and the predicted or forecast value in regression or any other phenomenon.

References

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> mean_forecast_error(y, yhat)
 -0.25
@@ -288,7 +288,7 @@
 
     """
     return np.average(y - yhat)
-

mean_squared_error(y, yhat)

Calculate the Mean Squared Error.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

MSE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

References

Examples:

>>> y = [3, -0.5, 2, 7]
+

mean_squared_error(y, yhat)

Calculate the Mean Squared Error.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

MSE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

References

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> mean_squared_error(y, yhat)
 0.375
@@ -353,7 +353,7 @@
     """
     output_error = np.average((y - yhat) ** 2)
     return np.average(output_error)
-

mean_squared_log_error(y, yhat)

Calculate the Mean Squared Logarithmic Error.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

MSLE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

Examples:

>>> y = [3, 5, 2.5, 7]
+

mean_squared_log_error(y, yhat)

Calculate the Mean Squared Logarithmic Error.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

MSLE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

Examples:

>>> y = [3, 5, 2.5, 7]
 >>> yhat = [2.5, 5, 4, 8]
 >>> mean_squared_log_error(y, yhat)
 0.039
@@ -406,7 +406,7 @@
 
     """
     return mean_squared_error(np.log1p(y), np.log1p(yhat))
-

median_absolute_error(y, yhat)

Calculate the Median Absolute Error.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

MdAE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

References

Examples:

>>> y = [3, -0.5, 2, 7]
+

median_absolute_error(y, yhat)

Calculate the Median Absolute Error.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

MdAE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

References

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> median_absolute_error(y, yhat)
 0.5
@@ -469,7 +469,7 @@
 
     """
     return np.median(np.abs(y - yhat))
-

normalized_root_mean_squared_error(y, yhat)

Calculate the normalized Root Mean Squared Error.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

nRMSE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

References

Examples:

>>> y = [3, -0.5, 2, 7]
+

normalized_root_mean_squared_error(y, yhat)

Calculate the normalized Root Mean Squared Error.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

nRMSE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

References

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> normalized_root_mean_squared_error(y, yhat)
 0.081
@@ -532,7 +532,7 @@
 
     """
     return root_mean_squared_error(y, yhat) / (y.max() - y.min())
-

r2_score(y, yhat)

Calculate the R2 score. Based on sklearn solution.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

R2 output can be non-negative values or negative value. Becoming 1.0 means your model outputs are exactly matched by true target values. Lower values means worse results.

Notes

This is not a symmetric function.

References

Examples:

>>> y = [3, -0.5, 2, 7]
+

r2_score(y, yhat)

Calculate the R2 score. Based on sklearn solution.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

R2 output can be non-negative values or negative value. Becoming 1.0 means your model outputs are exactly matched by true target values. Lower values means worse results.

Notes

This is not a symmetric function.

References

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> explained_variance_score(y, yhat)
 0.948
@@ -625,7 +625,7 @@
     # y_true is not interesting for scoring a regression anyway
     output_scores[nonzero_numerator & ~nonzero_denominator] = 0.0
     return np.average(output_scores)
-

root_mean_squared_error(y, yhat)

Calculate the Root Mean Squared Error.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

RMSE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

References

Examples:

>>> y = [3, -0.5, 2, 7]
+

root_mean_squared_error(y, yhat)

Calculate the Root Mean Squared Error.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

RMSE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

References

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> root_mean_squared_error(y, yhat)
 0.612
@@ -688,7 +688,7 @@
 
     """
     return np.sqrt(mean_squared_error(y, yhat))
-

root_relative_squared_error(y, yhat)

Calculate the Root Relative Mean Squared Error.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

RRSE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

Examples:

>>> y = [3, -0.5, 2, 7]
+

root_relative_squared_error(y, yhat)

Calculate the Root Relative Mean Squared Error.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

RRSE output is non-negative values. Becoming 0.0 means your model outputs are exactly matched by true target values.

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> root_relative_mean_squared_error(y, yhat)
 0.206
@@ -745,7 +745,7 @@
     numerator = np.sum(np.square((yhat - y)))
     denominator = np.sum(np.square((y - np.mean(y, axis=0))))
     return np.sqrt(np.divide(numerator, denominator))
-

symmetric_mean_absolute_percentage_error(y, yhat)

Calculate the SMAPE score.

Parameters:

Name Type Description Default
y array-like of shape

Represent the target values.

required
yhat array-like of shape

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

SMAPE output is a non-negative value. The results are percentages values.

Notes

One supposed problem with SMAPE is that it is not symmetric since over-forecasts and under-forecasts are not treated equally.

References

Examples:

>>> y = [3, -0.5, 2, 7]
+

symmetric_mean_absolute_percentage_error(y, yhat)

Calculate the SMAPE score.

Parameters:

Name Type Description Default
y array-like of shape = number_of_outputs

Represent the target values.

required
yhat array-like of shape = number_of_outputs

Target values predicted by the model.

required

Returns:

Name Type Description
loss float

SMAPE output is a non-negative value. The results are percentages values.

Notes

One supposed problem with SMAPE is that it is not symmetric since over-forecasts and under-forecasts are not treated equally.

References

Examples:

>>> y = [3, -0.5, 2, 7]
 >>> yhat = [2.5, 0.0, 2, 8]
 >>> symmetric_mean_absolute_percentage_error(y, yhat)
 57.87
diff --git a/docs/code/multiobjective-parameter-estimation.md b/docs/code/multiobjective-parameter-estimation.md
new file mode 100644
index 0000000..7f0c141
--- /dev/null
+++ b/docs/code/multiobjective-parameter-estimation.md
@@ -0,0 +1,8 @@
+---
+template: overrides/main.html
+---
+
+# Documentation for `Multiobjective Parameter Estimation`
+
+::: sysidentpy.multiobjective_parameter_estimation.estimators
+      show_root_heading: false
\ No newline at end of file
diff --git a/docs/code/multiobjective-parameter-estimation/index.html b/docs/code/multiobjective-parameter-estimation/index.html
new file mode 100644
index 0000000..2d82a6e
--- /dev/null
+++ b/docs/code/multiobjective-parameter-estimation/index.html
@@ -0,0 +1,1857 @@
+
+ Multiobjective Parameter Estimation - SysIdentPy        

Documentation for Multiobjective Parameter Estimation

Affine Information Least Squares for NARMAX models

AILS

Affine Information Least Squares (AILS) for NARMAX Parameter Estimation.

AILS is a non-iterative multiobjective Least Squares technique used for finding Pareto-set solutions in NARMAX (Nonlinear AutoRegressive Moving Average with eXogenous inputs) model parameter estimation. This method is suitable for linear-in-the-parameter model structures.

Two types of auxiliary information can be incorporated: static function and steady-state gain.

Parameters:

Name Type Description Default
static_gain bool

Flag indicating the presence of data related to steady-state gain.

True
static_function bool

Flag indicating the presence of data concerning static function.

True
final_model ndarray

Model code representation.

[[0], [0]]

References

  1. Nepomuceno, E. G., Takahashi, R. H. C., & Aguirre, L. A. (2007). "Multiobjective parameter estimation for nonlinear systems: Affine information and least-squares formulation." International Journal of Control, 80, 863-871.
Source code in sysidentpy\multiobjective_parameter_estimation\estimators.py
 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
class AILS:
+    """Affine Information Least Squares (AILS) for NARMAX Parameter Estimation.
+
+    AILS is a non-iterative multiobjective Least Squares technique used for finding
+    Pareto-set solutions in NARMAX (Nonlinear AutoRegressive Moving Average with
+    eXogenous inputs) model parameter estimation. This method is suitable for
+    linear-in-the-parameter model structures.
+
+    Two types of auxiliary information can be incorporated: static function and
+    steady-state gain.
+
+    Parameters
+    ----------
+    static_gain : bool, default=True
+        Flag indicating the presence of data related to steady-state gain.
+    static_function : bool, default=True
+        Flag indicating the presence of data concerning static function.
+    final_model : ndarray, default=[[0], [0]]
+        Model code representation.
+
+    References
+    ----------
+    1. Nepomuceno, E. G., Takahashi, R. H. C., & Aguirre, L. A. (2007).
+    "Multiobjective parameter estimation for nonlinear systems: Affine information and
+    least-squares formulation."
+    International Journal of Control, 80, 863-871.
+    """
+
+    def __init__(
+        self,
+        static_gain: bool = True,
+        static_function: bool = True,
+        final_model: np.ndarray = np.zeros((1, 1)),
+        normalize: bool = True,
+    ):
+        self.n_inputs = np.max(final_model // 1000) - 1
+        self.degree = np.shape(final_model)[1]
+        self.max_lag = 1
+        self.final_model = final_model
+        self.static_gain = static_gain
+        self.static_function = static_function
+        self.normalize = normalize
+
+    def get_term_clustering(self, qit: np.ndarray) -> np.ndarray:
+        """
+        Get the term clustering of the model.
+
+        This function takes a matrix `qit` and compute the term clustering based
+        on their values. It calculates the number of occurrences of each value
+        for each row in the matrix.
+
+        Parameters
+        ----------
+        qit : ndarray
+            Input matrix containing terms clustering to be sorted.
+
+        Returns
+        -------
+        N_aux : ndarray
+            A new matrix with rows representing the number of occurrences of each value
+            for each row in the input matrix `qit`. The columns correspond to different
+            values.
+
+        Examples
+        --------
+        >>> qit = np.array([[1, 2, 2],
+        ...                 [1, 3, 1],
+        ...                 [2, 2, 3]])
+        >>> result = get_term_clustering(qit)
+        >>> print(result)
+        [[1. 2. 0. 0.]
+        [2. 0. 1. 0.]
+        [0. 2. 1. 0.]]
+
+        Notes
+        -----
+        The function calculates the number of occurrences of each value (from 1 to
+        the maximum value in the input matrix `qit`) for each row and returns a matrix
+        where rows represent rows of the input matrix `qit`, and columns represent
+        different values.
+
+        """
+        max_value = int(np.max(qit))
+        counts_matrix = np.zeros((qit.shape[0], max_value))
+
+        for k in range(1, max_value + 1):
+            counts_matrix[:, k - 1] = np.sum(qit == k, axis=1)
+
+        return counts_matrix.astype(int)
+
+    def build_linear_mapping(self):
+        """
+        Assemble the linear mapping matrix R using the regressor-space method.
+
+        This function constructs the linear mapping matrix R, which plays a key role in
+        mapping the parameter vector to the cluster coefficients. It also generates a
+        row matrix qit that assists in locating terms within the linear mapping matrix.
+        This qit matrix is later used in creating the static regressor matrix (Q).
+
+        Returns
+        -------
+        R : ndarray of int
+            A constant matrix of ones and zeros that maps the parameter vector to
+            cluster coefficients.
+        qit : ndarray of int
+            A row matrix that helps locate terms within the linear mapping matrix R and
+            is used in the creation of the static regressor matrix (Q).
+
+        Notes
+        -----
+        The linear mapping matrix R is constructed using the regressor-space method.
+        It plays a crucial role in the parameter estimation process, facilitating the
+        mapping of parameter values to cluster coefficients. The qit matrix aids in
+        term localization within the linear mapping matrix R and is subsequently used
+        to build the static regressor matrix (Q).
+
+        """
+        xlag = [1] * self.n_inputs
+
+        object_qit = RegressorDictionary(xlag=xlag, ylag=[1])
+        # Given xlag and ylag equal to 1, there is no repetition of terms, which is
+        # ideal for building qit.
+        qit = object_qit.regressor_space(n_inputs=self.n_inputs) // 1000
+        model = self.final_model // 1000
+        R = np.all(qit[:, None, :] == model, axis=2).astype(int)
+        # Find rows with all zeros in R (sum of row elements is 0)
+        null_rows = list(np.where(np.sum(R, axis=1) == 0)[0])
+
+        R = np.delete(R, null_rows, axis=0)
+        qit = np.delete(qit, null_rows, axis=0)
+        return R, self.get_term_clustering(qit)
+
+    def build_static_function_information(
+        self, X_static: np.ndarray, y_static: np.ndarray
+    ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
+        """
+        Construct a matrix of static regressors for a NARMAX model.
+
+        Parameters
+        ----------
+        y_static : array-like, shape (n_samples_static_function,)
+            Output of the static function.
+        X_static : array-like, shape (n_samples_static_function,)
+            Static function input.
+
+        Returns
+        -------
+        Q_dot_R : ndarray of floats, shape (n_samples_static_function, n_parameters)
+            The result of multiplying the matrix of static regressors (Q) with the
+            linear mapping matrix (R), where n_parameters is the number of model
+            parameters.
+        static_covariance: ndarray of floats, shape (n_parameters, n_parameters)
+            The covariance QR'QR
+        static_response: ndarray of floats, shape (n_parameters,)
+            The response QR'y
+
+        Notes
+        -----
+        This function constructs a matrix of static regressors (Q) based on the provided
+        static function outputs (y_static) and inputs (X_static). The linear mapping
+        matrix (R) should be precomputed before calling this function. The result
+        Q_dot_R represents the static regressors for the NARMAX model.
+
+        """
+        R, qit = self.build_linear_mapping()
+        Q = y_static ** qit[:, 0]
+        for k in range(self.n_inputs):
+            Q *= X_static ** qit[:, 1 + k]
+
+        Q = Q.reshape(len(y_static), len(qit))
+
+        QR = Q.dot(R)
+        static_covariance = (QR.T).dot(QR)
+        static_response = (QR.T).dot(y_static)
+        return QR, static_covariance, static_response
+
+    def build_static_gain_information(
+        self, X_static: np.ndarray, y_static: np.ndarray, gain: np.ndarray
+    ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
+        """
+        Construct a matrix of static regressors referring to the derivative (gain).
+
+        Parameters
+        ----------
+        y_static : array-like, shape (n_samples_static_function,)
+            Output of the static function.
+        X_static : array-like, shape (n_samples_static_function,)
+            Static function input.
+        gain : array-like, shape (n_samples_static_gain,)
+            Static gain input.
+
+        Returns
+        -------
+        HR : ndarray of floats, shape (n_samples_static_function, n_parameters)
+            The matrix of static regressors for the derivative (gain) multiplied by the
+            linear mapping matrix R.
+        gain_covariance : ndarray of floats, shape (n_parameters, n_parameters)
+            The covariance matrix (HR'HR) for the gain-related regressors.
+        gain_response : ndarray of floats, shape (n_parameters,)
+            The response vector (HR'y) for the gain-related regressors.
+
+        Notes
+        -----
+        This function constructs a matrix of static regressors (G+H) for the derivative
+        (gain) based on the provided static function outputs (y_static), inputs
+        (X_static), and gain values. The linear mapping matrix (R) should be
+        precomputed before calling this function.
+
+        """
+        R, qit = self.build_linear_mapping()
+        H = np.zeros((len(y_static), len(qit)))
+        G = np.zeros((len(y_static), len(qit)))
+        for i in range(0, len(y_static)):
+            for j in range(1, len(qit)):
+                if y_static[i, 0] == 0:
+                    if (qit[j, 0]) == 1:
+                        H[i, j] = gain[i]
+                    else:
+                        H[i, j] = 0
+                else:
+                    H[i, j] = gain[i] * qit[j, 0] * y_static[i, 0] ** (qit[j, 0] - 1)
+                for k in range(0, self.n_inputs):
+                    if X_static[i, k] == 0:
+                        if (qit[j, 1 + k]) == 1:
+                            G[i, j] = 1
+                        else:
+                            G[i, j] = 0
+                    else:
+                        G[i, j] = qit[j, 1 + k] * X_static[i, k] ** (qit[j, 1 + k] - 1)
+
+        HR = (G + H).dot(R)
+        gain_covariance = (HR.T).dot(HR)
+        gain_response = (HR.T).dot(gain)
+        return HR, gain_covariance, gain_response
+
+    def get_cost_function(
+        self, y: np.ndarray, psi: np.ndarray, theta: np.ndarray
+    ) -> np.ndarray:
+        """
+        Calculate the cost function based on residuals.
+
+        Parameters
+        ----------
+        y : ndarray of floats
+            The target data used in the identification process.
+        psi : ndarray of floats, shape (n_samples, n_parameters)
+            The matrix of regressors.
+        theta : ndarray of floats
+            The parameter vector.
+
+        Returns
+        -------
+        cost_function : float
+            The calculated cost function value.
+
+        Notes
+        -----
+        This method computes the cost function value based on the residuals between
+        the target data (y) and the predicted values using the regressors (dynamic
+        and static) and parameter vector (theta). It quantifies the error in the
+        model's predictions.
+
+        """
+        residuals = y - psi.dot(theta)
+        return residuals.T.dot(residuals)
+
+    def build_system_data(
+        self,
+        y: np.ndarray,
+        static_gain: np.ndarray,
+        static_function: np.ndarray,
+    ) -> List[np.ndarray]:
+        """
+        Construct a list of output data components for the NARMAX system.
+
+        Parameters
+        ----------
+        y : ndarray of floats
+            The target data used in the identification process.
+        static_gain : ndarray of floats
+            Static gain output data.
+        static_function : ndarray of floats
+            Static function output data.
+
+        Returns
+        -------
+        system_data : list of ndarrays
+            A list containing data components, including the target data (y),
+            static gain data (if present), and static function data (if present).
+
+        Notes
+        -----
+        This method constructs a list of data components that are used in the NARMAX
+        system identification process. The components may include the target data (y),
+        static gain data (if enabled), and static function data (if enabled).
+
+        """
+        if not self.static_gain:
+            return [y] + [static_function]
+
+        if not self.static_function:
+            return [y] + [static_gain]
+
+        return [y] + [static_gain] + [static_function]
+
+    def build_affine_data(
+        self, psi: np.ndarray, HR: np.ndarray, QR: np.ndarray
+    ) -> List[np.ndarray]:
+        """
+        Construct a list of affine data components for NARMAX modeling.
+
+        Parameters
+        ----------
+        psi : ndarray of floats, shape (n_samples, n_parameters)
+            The matrix of dynamic regressors.
+        HR : ndarray of floats, shape (n_samples_static_gain, n_parameters)
+            The matrix of static gain regressors.
+        QR : ndarray of floats, shape (n_samples_static_function, n_parameters)
+            The matrix of static function regressors.
+
+        Returns
+        -------
+        affine_data : list of ndarrays
+            A list containing affine data components, including the matrix of static
+            regressors (psi), static gain regressors (if present), and static function
+            regressors (if present).
+
+        Notes
+        -----
+        This method constructs a list of affine data components used in the NARMAX
+        modeling process. The components may include the matrix of static regressors
+        (psi), static gain regressors (if enabled), and static function regressors
+        (if enabled).
+
+        """
+        if not self.static_gain:
+            return [psi] + [QR]
+
+        if not self.static_function:
+            return [psi] + [HR]
+
+        return [psi] + [HR] + [QR]
+
+    def build_psi(self, X: np.ndarray, y: np.ndarray) -> np.ndarray:
+        """
+        Build the matrix of dynamic regressor for NARMAX modeling.
+
+        Parameters
+        ----------
+        X : ndarray of floats
+            The input data to be used in the training process.
+        y : ndarray of floats
+            The output data to be used in the training process.
+
+        Returns
+        -------
+        psi : ndarray of floats, shape (n_samples, n_parameters)
+            The matrix of dynamic regressors.
+
+        """
+        psi_builder = RegressorDictionary()
+        xlag_code = psi_builder._list_input_regressor_code(self.final_model)
+        ylag_code = psi_builder._list_output_regressor_code(self.final_model)
+        xlag = psi_builder._get_lag_from_regressor_code(xlag_code)
+        ylag = psi_builder._get_lag_from_regressor_code(ylag_code)
+        self.max_lag = psi_builder._get_max_lag_from_model_code(self.final_model)
+        if self.n_inputs != 1:
+            xlag = self.n_inputs * [list(range(1, self.max_lag + 1))]
+
+        psi_builder.xlag = xlag
+        psi_builder.ylag = ylag
+        regressor_code = psi_builder.regressor_space(self.n_inputs)
+        pivv = psi_builder._get_index_from_regressor_code(
+            regressor_code, self.final_model
+        )
+        self.final_model = regressor_code[pivv]
+
+        lagged_data = InformationMatrix(xlag=xlag, ylag=ylag).build_input_output_matrix(
+            X=X, y=y
+        )
+
+        psi = Polynomial(degree=self.degree).fit(
+            lagged_data, max_lag=self.max_lag, predefined_regressors=pivv
+        )
+        return psi
+
+    def estimate(
+        self,
+        y_static: np.ndarray = np.zeros(1),
+        X_static: np.ndarray = np.zeros(1),
+        gain: np.ndarray = np.zeros(1),
+        y: np.ndarray = np.zeros(1),
+        X: np.ndarray = np.zeros((1, 1)),
+        weighing_matrix: np.ndarray = np.zeros((1, 1)),
+    ) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.int64]:
+        """Calculation of parameters via multi-objective techniques.
+
+        Parameters
+        ----------
+        y_static : array-like of shape = n_samples_static_function, default = ([0])
+            Output of static function.
+        X_static : array-like of shape = n_samples_static_function, default = ([0])
+            Static function input.
+        gain : array-like of shape = n_samples_static_gain, default = ([0])
+            Static gain input.
+        y : array-like of shape = n_samples, default = ([0])
+            The target data used in the identification process.
+        psi : ndarray of floats, default = ([[0],[0]])
+            Matrix of static regressors.
+
+        Returns
+        -------
+        J : ndarray
+            Matrix referring to the objectives.
+        euclidean_norm : ndarray
+            Matrix of the Euclidean norm.
+        theta : ndarray
+            Matrix with parameters for each weight.
+        HR : ndarray
+            H matrix multiplied by R.
+        QR : ndarray
+            Q matrix multiplied by R.
+        position : ndarray, default = ([[0],[0]])
+            Position of the best theta set.
+        """
+        psi = self.build_psi(X, y)
+        y = y[self.max_lag :]
+        HR, QR = np.zeros((1, 1)), np.zeros((1, 1))
+        n_parameters = weighing_matrix.shape[1]
+        num_objectives = self.static_function + self.static_gain + 1
+        euclidean_norm = np.zeros(n_parameters)
+        theta = np.zeros((n_parameters, self.final_model.shape[0]))
+        dynamic_covariance = psi.T.dot(psi)
+        dynamic_response = psi.T.dot(y)
+
+        if self.static_function:
+            QR, static_covariance, static_response = (
+                self.build_static_function_information(X_static, y_static)
+            )
+        if self.static_gain:
+            HR, gain_covariance, gain_response = self.build_static_gain_information(
+                X_static, y_static, gain
+            )
+        J = np.zeros((num_objectives, n_parameters))
+        system_data = self.build_system_data(y, gain, y_static)
+        affine_information_data = self.build_affine_data(psi, HR, QR)
+        for i in range(n_parameters):
+            theta1 = weighing_matrix[0, i] * dynamic_covariance
+            theta2 = weighing_matrix[0, i] * dynamic_response
+
+            w = 1
+            if self.static_function:
+                theta1 += weighing_matrix[w, i] * static_covariance
+                theta2 += weighing_matrix[w, i] * static_response.reshape(-1, 1)
+                w += 1
+
+            if self.static_gain:
+                theta1 += weighing_matrix[w, i] * gain_covariance
+                theta2 += weighing_matrix[w, i] * gain_response.reshape(-1, 1)
+                w += 1
+
+            tmp_theta = np.linalg.lstsq(theta1, theta2, rcond=None)[0]
+            theta[i, :] = tmp_theta.T
+
+            for j in range(num_objectives):
+                residuals = self.get_cost_function(
+                    system_data[j], affine_information_data[j], tmp_theta
+                )
+                J[j, i] = residuals
+
+            euclidean_norm[i] = np.linalg.norm(J[:, i])
+
+        if self.normalize is True:
+            J /= np.max(J, axis=1)[:, np.newaxis]
+            euclidean_norm /= np.max(euclidean_norm)
+
+            euclidean_norm = euclidean_norm / np.max(euclidean_norm)
+
+        position = np.argmin(euclidean_norm)
+        return (
+            J,
+            euclidean_norm,
+            theta,
+            HR,
+            QR,
+            position,
+        )
+

build_affine_data(psi, HR, QR)

Construct a list of affine data components for NARMAX modeling.

Parameters:

Name Type Description Default
psi ndarray of floats, shape (n_samples, n_parameters)

The matrix of dynamic regressors.

required
HR ndarray of floats, shape (n_samples_static_gain, n_parameters)

The matrix of static gain regressors.

required
QR ndarray of floats, shape (n_samples_static_function, n_parameters)

The matrix of static function regressors.

required

Returns:

Name Type Description
affine_data list of ndarrays

A list containing affine data components, including the matrix of static regressors (psi), static gain regressors (if present), and static function regressors (if present).

Notes

This method constructs a list of affine data components used in the NARMAX modeling process. The components may include the matrix of static regressors (psi), static gain regressors (if enabled), and static function regressors (if enabled).

Source code in sysidentpy\multiobjective_parameter_estimation\estimators.py
def build_affine_data(
+    self, psi: np.ndarray, HR: np.ndarray, QR: np.ndarray
+) -> List[np.ndarray]:
+    """
+    Construct a list of affine data components for NARMAX modeling.
+
+    Parameters
+    ----------
+    psi : ndarray of floats, shape (n_samples, n_parameters)
+        The matrix of dynamic regressors.
+    HR : ndarray of floats, shape (n_samples_static_gain, n_parameters)
+        The matrix of static gain regressors.
+    QR : ndarray of floats, shape (n_samples_static_function, n_parameters)
+        The matrix of static function regressors.
+
+    Returns
+    -------
+    affine_data : list of ndarrays
+        A list containing affine data components, including the matrix of static
+        regressors (psi), static gain regressors (if present), and static function
+        regressors (if present).
+
+    Notes
+    -----
+    This method constructs a list of affine data components used in the NARMAX
+    modeling process. The components may include the matrix of static regressors
+    (psi), static gain regressors (if enabled), and static function regressors
+    (if enabled).
+
+    """
+    if not self.static_gain:
+        return [psi] + [QR]
+
+    if not self.static_function:
+        return [psi] + [HR]
+
+    return [psi] + [HR] + [QR]
+

build_linear_mapping()

Assemble the linear mapping matrix R using the regressor-space method.

This function constructs the linear mapping matrix R, which plays a key role in mapping the parameter vector to the cluster coefficients. It also generates a row matrix qit that assists in locating terms within the linear mapping matrix. This qit matrix is later used in creating the static regressor matrix (Q).

Returns:

Name Type Description
R ndarray of int

A constant matrix of ones and zeros that maps the parameter vector to cluster coefficients.

qit ndarray of int

A row matrix that helps locate terms within the linear mapping matrix R and is used in the creation of the static regressor matrix (Q).

Notes

The linear mapping matrix R is constructed using the regressor-space method. It plays a crucial role in the parameter estimation process, facilitating the mapping of parameter values to cluster coefficients. The qit matrix aids in term localization within the linear mapping matrix R and is subsequently used to build the static regressor matrix (Q).

Source code in sysidentpy\multiobjective_parameter_estimation\estimators.py
def build_linear_mapping(self):
+    """
+    Assemble the linear mapping matrix R using the regressor-space method.
+
+    This function constructs the linear mapping matrix R, which plays a key role in
+    mapping the parameter vector to the cluster coefficients. It also generates a
+    row matrix qit that assists in locating terms within the linear mapping matrix.
+    This qit matrix is later used in creating the static regressor matrix (Q).
+
+    Returns
+    -------
+    R : ndarray of int
+        A constant matrix of ones and zeros that maps the parameter vector to
+        cluster coefficients.
+    qit : ndarray of int
+        A row matrix that helps locate terms within the linear mapping matrix R and
+        is used in the creation of the static regressor matrix (Q).
+
+    Notes
+    -----
+    The linear mapping matrix R is constructed using the regressor-space method.
+    It plays a crucial role in the parameter estimation process, facilitating the
+    mapping of parameter values to cluster coefficients. The qit matrix aids in
+    term localization within the linear mapping matrix R and is subsequently used
+    to build the static regressor matrix (Q).
+
+    """
+    xlag = [1] * self.n_inputs
+
+    object_qit = RegressorDictionary(xlag=xlag, ylag=[1])
+    # Given xlag and ylag equal to 1, there is no repetition of terms, which is
+    # ideal for building qit.
+    qit = object_qit.regressor_space(n_inputs=self.n_inputs) // 1000
+    model = self.final_model // 1000
+    R = np.all(qit[:, None, :] == model, axis=2).astype(int)
+    # Find rows with all zeros in R (sum of row elements is 0)
+    null_rows = list(np.where(np.sum(R, axis=1) == 0)[0])
+
+    R = np.delete(R, null_rows, axis=0)
+    qit = np.delete(qit, null_rows, axis=0)
+    return R, self.get_term_clustering(qit)
+

build_psi(X, y)

Build the matrix of dynamic regressor for NARMAX modeling.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the training process.

required
y ndarray of floats

The output data to be used in the training process.

required

Returns:

Name Type Description
psi ndarray of floats, shape (n_samples, n_parameters)

The matrix of dynamic regressors.

Source code in sysidentpy\multiobjective_parameter_estimation\estimators.py
def build_psi(self, X: np.ndarray, y: np.ndarray) -> np.ndarray:
+    """
+    Build the matrix of dynamic regressor for NARMAX modeling.
+
+    Parameters
+    ----------
+    X : ndarray of floats
+        The input data to be used in the training process.
+    y : ndarray of floats
+        The output data to be used in the training process.
+
+    Returns
+    -------
+    psi : ndarray of floats, shape (n_samples, n_parameters)
+        The matrix of dynamic regressors.
+
+    """
+    psi_builder = RegressorDictionary()
+    xlag_code = psi_builder._list_input_regressor_code(self.final_model)
+    ylag_code = psi_builder._list_output_regressor_code(self.final_model)
+    xlag = psi_builder._get_lag_from_regressor_code(xlag_code)
+    ylag = psi_builder._get_lag_from_regressor_code(ylag_code)
+    self.max_lag = psi_builder._get_max_lag_from_model_code(self.final_model)
+    if self.n_inputs != 1:
+        xlag = self.n_inputs * [list(range(1, self.max_lag + 1))]
+
+    psi_builder.xlag = xlag
+    psi_builder.ylag = ylag
+    regressor_code = psi_builder.regressor_space(self.n_inputs)
+    pivv = psi_builder._get_index_from_regressor_code(
+        regressor_code, self.final_model
+    )
+    self.final_model = regressor_code[pivv]
+
+    lagged_data = InformationMatrix(xlag=xlag, ylag=ylag).build_input_output_matrix(
+        X=X, y=y
+    )
+
+    psi = Polynomial(degree=self.degree).fit(
+        lagged_data, max_lag=self.max_lag, predefined_regressors=pivv
+    )
+    return psi
+

build_static_function_information(X_static, y_static)

Construct a matrix of static regressors for a NARMAX model.

Parameters:

Name Type Description Default
y_static (array - like, shape(n_samples_static_function))

Output of the static function.

required
X_static (array - like, shape(n_samples_static_function))

Static function input.

required

Returns:

Name Type Description
Q_dot_R ndarray of floats, shape (n_samples_static_function, n_parameters)

The result of multiplying the matrix of static regressors (Q) with the linear mapping matrix (R), where n_parameters is the number of model parameters.

static_covariance ndarray of floats, shape (n_parameters, n_parameters)

The covariance QR'QR

static_response ndarray of floats, shape (n_parameters,)

The response QR'y

Notes

This function constructs a matrix of static regressors (Q) based on the provided static function outputs (y_static) and inputs (X_static). The linear mapping matrix (R) should be precomputed before calling this function. The result Q_dot_R represents the static regressors for the NARMAX model.

Source code in sysidentpy\multiobjective_parameter_estimation\estimators.py
def build_static_function_information(
+    self, X_static: np.ndarray, y_static: np.ndarray
+) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
+    """
+    Construct a matrix of static regressors for a NARMAX model.
+
+    Parameters
+    ----------
+    y_static : array-like, shape (n_samples_static_function,)
+        Output of the static function.
+    X_static : array-like, shape (n_samples_static_function,)
+        Static function input.
+
+    Returns
+    -------
+    Q_dot_R : ndarray of floats, shape (n_samples_static_function, n_parameters)
+        The result of multiplying the matrix of static regressors (Q) with the
+        linear mapping matrix (R), where n_parameters is the number of model
+        parameters.
+    static_covariance: ndarray of floats, shape (n_parameters, n_parameters)
+        The covariance QR'QR
+    static_response: ndarray of floats, shape (n_parameters,)
+        The response QR'y
+
+    Notes
+    -----
+    This function constructs a matrix of static regressors (Q) based on the provided
+    static function outputs (y_static) and inputs (X_static). The linear mapping
+    matrix (R) should be precomputed before calling this function. The result
+    Q_dot_R represents the static regressors for the NARMAX model.
+
+    """
+    R, qit = self.build_linear_mapping()
+    Q = y_static ** qit[:, 0]
+    for k in range(self.n_inputs):
+        Q *= X_static ** qit[:, 1 + k]
+
+    Q = Q.reshape(len(y_static), len(qit))
+
+    QR = Q.dot(R)
+    static_covariance = (QR.T).dot(QR)
+    static_response = (QR.T).dot(y_static)
+    return QR, static_covariance, static_response
+

build_static_gain_information(X_static, y_static, gain)

Construct a matrix of static regressors referring to the derivative (gain).

Parameters:

Name Type Description Default
y_static (array - like, shape(n_samples_static_function))

Output of the static function.

required
X_static (array - like, shape(n_samples_static_function))

Static function input.

required
gain (array - like, shape(n_samples_static_gain))

Static gain input.

required

Returns:

Name Type Description
HR ndarray of floats, shape (n_samples_static_function, n_parameters)

The matrix of static regressors for the derivative (gain) multiplied by the linear mapping matrix R.

gain_covariance ndarray of floats, shape (n_parameters, n_parameters)

The covariance matrix (HR'HR) for the gain-related regressors.

gain_response ndarray of floats, shape (n_parameters,)

The response vector (HR'y) for the gain-related regressors.

Notes

This function constructs a matrix of static regressors (G+H) for the derivative (gain) based on the provided static function outputs (y_static), inputs (X_static), and gain values. The linear mapping matrix (R) should be precomputed before calling this function.

Source code in sysidentpy\multiobjective_parameter_estimation\estimators.py
def build_static_gain_information(
+    self, X_static: np.ndarray, y_static: np.ndarray, gain: np.ndarray
+) -> Tuple[np.ndarray, np.ndarray, np.ndarray]:
+    """
+    Construct a matrix of static regressors referring to the derivative (gain).
+
+    Parameters
+    ----------
+    y_static : array-like, shape (n_samples_static_function,)
+        Output of the static function.
+    X_static : array-like, shape (n_samples_static_function,)
+        Static function input.
+    gain : array-like, shape (n_samples_static_gain,)
+        Static gain input.
+
+    Returns
+    -------
+    HR : ndarray of floats, shape (n_samples_static_function, n_parameters)
+        The matrix of static regressors for the derivative (gain) multiplied by the
+        linear mapping matrix R.
+    gain_covariance : ndarray of floats, shape (n_parameters, n_parameters)
+        The covariance matrix (HR'HR) for the gain-related regressors.
+    gain_response : ndarray of floats, shape (n_parameters,)
+        The response vector (HR'y) for the gain-related regressors.
+
+    Notes
+    -----
+    This function constructs a matrix of static regressors (G+H) for the derivative
+    (gain) based on the provided static function outputs (y_static), inputs
+    (X_static), and gain values. The linear mapping matrix (R) should be
+    precomputed before calling this function.
+
+    """
+    R, qit = self.build_linear_mapping()
+    H = np.zeros((len(y_static), len(qit)))
+    G = np.zeros((len(y_static), len(qit)))
+    for i in range(0, len(y_static)):
+        for j in range(1, len(qit)):
+            if y_static[i, 0] == 0:
+                if (qit[j, 0]) == 1:
+                    H[i, j] = gain[i]
+                else:
+                    H[i, j] = 0
+            else:
+                H[i, j] = gain[i] * qit[j, 0] * y_static[i, 0] ** (qit[j, 0] - 1)
+            for k in range(0, self.n_inputs):
+                if X_static[i, k] == 0:
+                    if (qit[j, 1 + k]) == 1:
+                        G[i, j] = 1
+                    else:
+                        G[i, j] = 0
+                else:
+                    G[i, j] = qit[j, 1 + k] * X_static[i, k] ** (qit[j, 1 + k] - 1)
+
+    HR = (G + H).dot(R)
+    gain_covariance = (HR.T).dot(HR)
+    gain_response = (HR.T).dot(gain)
+    return HR, gain_covariance, gain_response
+

build_system_data(y, static_gain, static_function)

Construct a list of output data components for the NARMAX system.

Parameters:

Name Type Description Default
y ndarray of floats

The target data used in the identification process.

required
static_gain ndarray of floats

Static gain output data.

required
static_function ndarray of floats

Static function output data.

required

Returns:

Name Type Description
system_data list of ndarrays

A list containing data components, including the target data (y), static gain data (if present), and static function data (if present).

Notes

This method constructs a list of data components that are used in the NARMAX system identification process. The components may include the target data (y), static gain data (if enabled), and static function data (if enabled).

Source code in sysidentpy\multiobjective_parameter_estimation\estimators.py
def build_system_data(
+    self,
+    y: np.ndarray,
+    static_gain: np.ndarray,
+    static_function: np.ndarray,
+) -> List[np.ndarray]:
+    """
+    Construct a list of output data components for the NARMAX system.
+
+    Parameters
+    ----------
+    y : ndarray of floats
+        The target data used in the identification process.
+    static_gain : ndarray of floats
+        Static gain output data.
+    static_function : ndarray of floats
+        Static function output data.
+
+    Returns
+    -------
+    system_data : list of ndarrays
+        A list containing data components, including the target data (y),
+        static gain data (if present), and static function data (if present).
+
+    Notes
+    -----
+    This method constructs a list of data components that are used in the NARMAX
+    system identification process. The components may include the target data (y),
+    static gain data (if enabled), and static function data (if enabled).
+
+    """
+    if not self.static_gain:
+        return [y] + [static_function]
+
+    if not self.static_function:
+        return [y] + [static_gain]
+
+    return [y] + [static_gain] + [static_function]
+

estimate(y_static=np.zeros(1), X_static=np.zeros(1), gain=np.zeros(1), y=np.zeros(1), X=np.zeros((1, 1)), weighing_matrix=np.zeros((1, 1)))

Calculation of parameters via multi-objective techniques.

Parameters:

Name Type Description Default
y_static array-like of shape = n_samples_static_function

Output of static function.

= ([0])
X_static array-like of shape = n_samples_static_function

Static function input.

= ([0])
gain array-like of shape = n_samples_static_gain

Static gain input.

= ([0])
y array-like of shape = n_samples

The target data used in the identification process.

= ([0])
psi ndarray of floats

Matrix of static regressors.

= ([[0],[0]])

Returns:

Name Type Description
J ndarray

Matrix referring to the objectives.

euclidean_norm ndarray

Matrix of the Euclidean norm.

theta ndarray

Matrix with parameters for each weight.

HR ndarray

H matrix multiplied by R.

QR ndarray

Q matrix multiplied by R.

position ndarray, default = ([[0],[0]])

Position of the best theta set.

Source code in sysidentpy\multiobjective_parameter_estimation\estimators.py
def estimate(
+    self,
+    y_static: np.ndarray = np.zeros(1),
+    X_static: np.ndarray = np.zeros(1),
+    gain: np.ndarray = np.zeros(1),
+    y: np.ndarray = np.zeros(1),
+    X: np.ndarray = np.zeros((1, 1)),
+    weighing_matrix: np.ndarray = np.zeros((1, 1)),
+) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.int64]:
+    """Calculation of parameters via multi-objective techniques.
+
+    Parameters
+    ----------
+    y_static : array-like of shape = n_samples_static_function, default = ([0])
+        Output of static function.
+    X_static : array-like of shape = n_samples_static_function, default = ([0])
+        Static function input.
+    gain : array-like of shape = n_samples_static_gain, default = ([0])
+        Static gain input.
+    y : array-like of shape = n_samples, default = ([0])
+        The target data used in the identification process.
+    psi : ndarray of floats, default = ([[0],[0]])
+        Matrix of static regressors.
+
+    Returns
+    -------
+    J : ndarray
+        Matrix referring to the objectives.
+    euclidean_norm : ndarray
+        Matrix of the Euclidean norm.
+    theta : ndarray
+        Matrix with parameters for each weight.
+    HR : ndarray
+        H matrix multiplied by R.
+    QR : ndarray
+        Q matrix multiplied by R.
+    position : ndarray, default = ([[0],[0]])
+        Position of the best theta set.
+    """
+    psi = self.build_psi(X, y)
+    y = y[self.max_lag :]
+    HR, QR = np.zeros((1, 1)), np.zeros((1, 1))
+    n_parameters = weighing_matrix.shape[1]
+    num_objectives = self.static_function + self.static_gain + 1
+    euclidean_norm = np.zeros(n_parameters)
+    theta = np.zeros((n_parameters, self.final_model.shape[0]))
+    dynamic_covariance = psi.T.dot(psi)
+    dynamic_response = psi.T.dot(y)
+
+    if self.static_function:
+        QR, static_covariance, static_response = (
+            self.build_static_function_information(X_static, y_static)
+        )
+    if self.static_gain:
+        HR, gain_covariance, gain_response = self.build_static_gain_information(
+            X_static, y_static, gain
+        )
+    J = np.zeros((num_objectives, n_parameters))
+    system_data = self.build_system_data(y, gain, y_static)
+    affine_information_data = self.build_affine_data(psi, HR, QR)
+    for i in range(n_parameters):
+        theta1 = weighing_matrix[0, i] * dynamic_covariance
+        theta2 = weighing_matrix[0, i] * dynamic_response
+
+        w = 1
+        if self.static_function:
+            theta1 += weighing_matrix[w, i] * static_covariance
+            theta2 += weighing_matrix[w, i] * static_response.reshape(-1, 1)
+            w += 1
+
+        if self.static_gain:
+            theta1 += weighing_matrix[w, i] * gain_covariance
+            theta2 += weighing_matrix[w, i] * gain_response.reshape(-1, 1)
+            w += 1
+
+        tmp_theta = np.linalg.lstsq(theta1, theta2, rcond=None)[0]
+        theta[i, :] = tmp_theta.T
+
+        for j in range(num_objectives):
+            residuals = self.get_cost_function(
+                system_data[j], affine_information_data[j], tmp_theta
+            )
+            J[j, i] = residuals
+
+        euclidean_norm[i] = np.linalg.norm(J[:, i])
+
+    if self.normalize is True:
+        J /= np.max(J, axis=1)[:, np.newaxis]
+        euclidean_norm /= np.max(euclidean_norm)
+
+        euclidean_norm = euclidean_norm / np.max(euclidean_norm)
+
+    position = np.argmin(euclidean_norm)
+    return (
+        J,
+        euclidean_norm,
+        theta,
+        HR,
+        QR,
+        position,
+    )
+

get_cost_function(y, psi, theta)

Calculate the cost function based on residuals.

Parameters:

Name Type Description Default
y ndarray of floats

The target data used in the identification process.

required
psi ndarray of floats, shape (n_samples, n_parameters)

The matrix of regressors.

required
theta ndarray of floats

The parameter vector.

required

Returns:

Name Type Description
cost_function float

The calculated cost function value.

Notes

This method computes the cost function value based on the residuals between the target data (y) and the predicted values using the regressors (dynamic and static) and parameter vector (theta). It quantifies the error in the model's predictions.

Source code in sysidentpy\multiobjective_parameter_estimation\estimators.py
def get_cost_function(
+    self, y: np.ndarray, psi: np.ndarray, theta: np.ndarray
+) -> np.ndarray:
+    """
+    Calculate the cost function based on residuals.
+
+    Parameters
+    ----------
+    y : ndarray of floats
+        The target data used in the identification process.
+    psi : ndarray of floats, shape (n_samples, n_parameters)
+        The matrix of regressors.
+    theta : ndarray of floats
+        The parameter vector.
+
+    Returns
+    -------
+    cost_function : float
+        The calculated cost function value.
+
+    Notes
+    -----
+    This method computes the cost function value based on the residuals between
+    the target data (y) and the predicted values using the regressors (dynamic
+    and static) and parameter vector (theta). It quantifies the error in the
+    model's predictions.
+
+    """
+    residuals = y - psi.dot(theta)
+    return residuals.T.dot(residuals)
+

get_term_clustering(qit)

Get the term clustering of the model.

This function takes a matrix qit and compute the term clustering based on their values. It calculates the number of occurrences of each value for each row in the matrix.

Parameters:

Name Type Description Default
qit ndarray

Input matrix containing terms clustering to be sorted.

required

Returns:

Name Type Description
N_aux ndarray

A new matrix with rows representing the number of occurrences of each value for each row in the input matrix qit. The columns correspond to different values.

Examples:

>>> qit = np.array([[1, 2, 2],
+...                 [1, 3, 1],
+...                 [2, 2, 3]])
+>>> result = get_term_clustering(qit)
+>>> print(result)
+[[1. 2. 0. 0.]
+[2. 0. 1. 0.]
+[0. 2. 1. 0.]]
+
Notes

The function calculates the number of occurrences of each value (from 1 to the maximum value in the input matrix qit) for each row and returns a matrix where rows represent rows of the input matrix qit, and columns represent different values.

Source code in sysidentpy\multiobjective_parameter_estimation\estimators.py
54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
def get_term_clustering(self, qit: np.ndarray) -> np.ndarray:
+    """
+    Get the term clustering of the model.
+
+    This function takes a matrix `qit` and compute the term clustering based
+    on their values. It calculates the number of occurrences of each value
+    for each row in the matrix.
+
+    Parameters
+    ----------
+    qit : ndarray
+        Input matrix containing terms clustering to be sorted.
+
+    Returns
+    -------
+    N_aux : ndarray
+        A new matrix with rows representing the number of occurrences of each value
+        for each row in the input matrix `qit`. The columns correspond to different
+        values.
+
+    Examples
+    --------
+    >>> qit = np.array([[1, 2, 2],
+    ...                 [1, 3, 1],
+    ...                 [2, 2, 3]])
+    >>> result = get_term_clustering(qit)
+    >>> print(result)
+    [[1. 2. 0. 0.]
+    [2. 0. 1. 0.]
+    [0. 2. 1. 0.]]
+
+    Notes
+    -----
+    The function calculates the number of occurrences of each value (from 1 to
+    the maximum value in the input matrix `qit`) for each row and returns a matrix
+    where rows represent rows of the input matrix `qit`, and columns represent
+    different values.
+
+    """
+    max_value = int(np.max(qit))
+    counts_matrix = np.zeros((qit.shape[0], max_value))
+
+    for k in range(1, max_value + 1):
+        counts_matrix[:, k - 1] = np.sum(qit == k, axis=1)
+
+    return counts_matrix.astype(int)
+
\ No newline at end of file diff --git a/docs/code/multiobjective-parameter-estimation/multiobjective-parameter-estimation.md b/docs/code/multiobjective-parameter-estimation/multiobjective-parameter-estimation.md new file mode 100644 index 0000000..7f0c141 --- /dev/null +++ b/docs/code/multiobjective-parameter-estimation/multiobjective-parameter-estimation.md @@ -0,0 +1,8 @@ +--- +template: overrides/main.html +--- + +# Documentation for `Multiobjective Parameter Estimation` + +::: sysidentpy.multiobjective_parameter_estimation.estimators + show_root_heading: false \ No newline at end of file diff --git a/docs/code/narmax-base/index.html b/docs/code/narmax-base/index.html index ade347e..388eb32 100644 --- a/docs/code/narmax-base/index.html +++ b/docs/code/narmax-base/index.html @@ -1,5 +1,5 @@ - NARMAX Base - SysIdentPy

Documentation for narmax-base

Base classes for NARMAX estimator.

BaseMSS

Bases: RegressorDictionary

Base class for Model Structure Selection

Source code in sysidentpy\narmax_base.py
586
+                        

Documentation for narmax-base

Base classes for NARMAX estimator.

BaseMSS

Bases: RegressorDictionary

Base class for Model Structure Selection

Source code in sysidentpy\narmax_base.py
586
 587
 588
 589
@@ -1345,7 +1345,7 @@
         constant = np.ones([lagged_data.shape[0], 1])
         data = np.concatenate([constant, lagged_data], axis=1)
         return data
-

build_input_matrix(*args)

Build the information matrix of input values.

Each columns of the information matrix represents a candidate regressor. The set of candidate regressors are based on xlag, ylag, and degree entered by the user.

Parameters:

Name Type Description Default
X array-like

Input data used on training phase.

required

Returns:

Type Description
lagged_data

The lagged matrix built in respect with each lag and column.

Source code in sysidentpy\narmax_base.py
217
+

build_input_matrix(*args)

Build the information matrix of input values.

Each columns of the information matrix represents a candidate regressor. The set of candidate regressors are based on xlag, ylag, and degree entered by the user.

Parameters:

Name Type Description Default
X array - like

Input data used on training phase.

required

Returns:

Type Description
lagged_data = ndarray of floats

The lagged matrix built in respect with each lag and column.

Source code in sysidentpy\narmax_base.py
217
 218
 219
 220
@@ -1402,7 +1402,7 @@
     constant = np.ones([x_lagged.shape[0], 1])
     data = np.concatenate([constant, x_lagged], axis=1)
     return data
-

build_input_output_matrix(X, y)

Build the information matrix.

Each columns of the information matrix represents a candidate regressor. The set of candidate regressors are based on xlag, ylag, and degree entered by the user.

Parameters:

Name Type Description Default
y array-like

Target data used on training phase.

required
X array-like

Input data used on training phase.

required

Returns:

Type Description
lagged_data

The lagged matrix built in respect with each lag and column.

Source code in sysidentpy\narmax_base.py
247
+

build_input_output_matrix(X, y)

Build the information matrix.

Each columns of the information matrix represents a candidate regressor. The set of candidate regressors are based on xlag, ylag, and degree entered by the user.

Parameters:

Name Type Description Default
y array - like

Target data used on training phase.

required
X array - like

Input data used on training phase.

required

Returns:

Type Description
lagged_data = ndarray of floats

The lagged matrix built in respect with each lag and column.

Source code in sysidentpy\narmax_base.py
247
 248
 249
 250
@@ -1457,7 +1457,7 @@
     constant = np.ones([lagged_data.shape[0], 1])
     data = np.concatenate([constant, lagged_data], axis=1)
     return data
-

build_output_matrix(*args)

Build the information matrix of output values.

Each columns of the information matrix represents a candidate regressor. The set of candidate regressors are based on xlag, ylag, and degree entered by the user.

Parameters:

Name Type Description Default
y array-like

Target data used on training phase.

required

Returns:

Type Description
lagged_data

The lagged matrix built in respect with each lag and column.

Source code in sysidentpy\narmax_base.py
188
+

build_output_matrix(*args)

Build the information matrix of output values.

Each columns of the information matrix represents a candidate regressor. The set of candidate regressors are based on xlag, ylag, and degree entered by the user.

Parameters:

Name Type Description Default
y array - like

Target data used on training phase.

required

Returns:

Type Description
lagged_data = ndarray of floats

The lagged matrix built in respect with each lag and column.

Source code in sysidentpy\narmax_base.py
188
 189
 190
 191
@@ -1512,7 +1512,7 @@
     constant = np.ones([y_lagged.shape[0], 1])
     data = np.concatenate([constant, y_lagged], axis=1)
     return data
-

initial_lagged_matrix(X, y)

Build a lagged matrix concerning each lag for each column.

Parameters:

Name Type Description Default
y array-like

Target data used on training phase.

required
X array-like

Input data used on training phase.

required

Returns:

Name Type Description
lagged_data ndarray of floats

The lagged matrix built in respect with each lag and column.

Examples:

Let X and y be the input and output values of shape Nx1. If the chosen lags are 2 for both input and output the initial lagged matrix will be formed by Y[k-1], Y[k-2], X[k-1], and X[k-2].

Source code in sysidentpy\narmax_base.py
158
+

initial_lagged_matrix(X, y)

Build a lagged matrix concerning each lag for each column.

Parameters:

Name Type Description Default
y array - like

Target data used on training phase.

required
X array - like

Input data used on training phase.

required

Returns:

Name Type Description
lagged_data ndarray of floats

The lagged matrix built in respect with each lag and column.

Examples:

Let X and y be the input and output values of shape Nx1. If the chosen lags are 2 for both input and output the initial lagged matrix will be formed by Y[k-1], Y[k-2], X[k-1], and X[k-2].

Source code in sysidentpy\narmax_base.py
158
 159
 160
 161
@@ -1569,7 +1569,7 @@
     y_lagged = self._create_lagged_y(y)
     lagged_data = np.concatenate([y_lagged, x_lagged], axis=1)
     return lagged_data
-

shift_column(col_to_shift, lag)

Shift values based on a lag.

Parameters:

Name Type Description Default
col_to_shift array-like of shape

The samples of the input or output.

required
lag int

The respective lag of the regressor.

required

Returns:

Name Type Description
tmp_column array-like of shape

The shifted array of the input or output.

Examples:

>>> y = [1, 2, 3, 4, 5]
+

shift_column(col_to_shift, lag)

Shift values based on a lag.

Parameters:

Name Type Description Default
col_to_shift array-like of shape = n_samples

The samples of the input or output.

required
lag int

The respective lag of the regressor.

required

Returns:

Name Type Description
tmp_column array-like of shape = n_samples

The shifted array of the input or output.

Examples:

>>> y = [1, 2, 3, 4, 5]
 >>> shift_column(y, 1)
 [0, 1, 2, 3, 4]
 
Source code in sysidentpy\narmax_base.py
30
@@ -1746,7 +1746,7 @@
         RA = RA + v * w
         B = RA
         return B
-

house(x)

Perform a Householder reflection of vector.

Parameters:

Name Type Description Default
x array-like of shape

The respective column of the matrix of regressors in each iteration of ERR function.

required

Returns:

Name Type Description
v array-like of shape

The reflection of the array x.

References
  • Manuscript: Chen, S., Billings, S. A., & Luo, W. (1989). Orthogonal least squares methods and their application to non-linear system identification.
Source code in sysidentpy\narmax_base.py
956
+

house(x)

Perform a Householder reflection of vector.

Parameters:

Name Type Description Default
x array-like of shape = number_of_training_samples

The respective column of the matrix of regressors in each iteration of ERR function.

required

Returns:

Name Type Description
v array-like of shape = number_of_training_samples

The reflection of the array x.

References
  • Manuscript: Chen, S., Billings, S. A., & Luo, W. (1989). Orthogonal least squares methods and their application to non-linear system identification.
Source code in sysidentpy\narmax_base.py
956
 957
 958
 959
@@ -1799,7 +1799,7 @@
         x = x[1:] / aux_b
         x = np.concatenate((np.array([1]), x))
     return x
-

rowhouse(RA, v)

Perform a row Householder transformation.

Parameters:

Name Type Description Default
RA array-like of shape

The respective column of the matrix of regressors in each iteration of ERR function.

required
v array-like of shape

The reflected vector obtained by using the householder reflection.

required

Returns:

Name Type Description
B array-like of shape
References
  • Manuscript: Chen, S., Billings, S. A., & Luo, W. (1989). Orthogonal least squares methods and their application to non-linear system identification. International Journal of control, 50(5), 1873-1896.
Source code in sysidentpy\narmax_base.py

rowhouse(RA, v)

Perform a row Householder transformation.

Parameters:

Name Type Description Default
RA array-like of shape = number_of_training_samples

The respective column of the matrix of regressors in each iteration of ERR function.

required
v array-like of shape = number_of_training_samples

The reflected vector obtained by using the householder reflection.

required

Returns:

Name Type Description
B array-like of shape = number_of_training_samples
References
  • Manuscript: Chen, S., Billings, S. A., & Luo, W. (1989). Orthogonal least squares methods and their application to non-linear system identification. International Journal of control, 50(5), 1873-1896.
Source code in sysidentpy\narmax_base.py
 984
  985
  986
  987
@@ -2471,7 +2471,7 @@
             "NAR": self.build_output_matrix,
         }
         return build_matrix_options.get(model_type, None)
-

create_narmax_code(n_inputs)

Create the code representation of the regressors.

This function generates a codification from all possibles regressors given the maximum lag of the input and output. This is used to write the final terms of the model in a readable form. [1001] -> y(k-1). This code format was based on a dissertation from UFMG. See reference below.

Parameters:

Name Type Description Default
n_inputs int

Number of input variables.

required

Returns:

Name Type Description
max_lag int

This value can be used by another functions.

regressor_code ndarray of int

Matrix codification of all possible regressors.

Examples:

The codification is defined as:

>>> 100n = y(k-n)
+

create_narmax_code(n_inputs)

Create the code representation of the regressors.

This function generates a codification from all possibles regressors given the maximum lag of the input and output. This is used to write the final terms of the model in a readable form. [1001] -> y(k-1). This code format was based on a dissertation from UFMG. See reference below.

Parameters:

Name Type Description Default
n_inputs int

Number of input variables.

required

Returns:

Name Type Description
max_lag int

This value can be used by another functions.

regressor_code ndarray of int

Matrix codification of all possible regressors.

Examples:

The codification is defined as:

>>> 100n = y(k-n)
 >>> 200n = u(k-n)
 >>> [100n 100n] = y(k-n)y(k-n)
 >>> [200n 200n] = u(k-n)u(k-n)
@@ -2611,7 +2611,7 @@
         "NAR": self.build_output_matrix,
     }
     return build_matrix_options.get(model_type, None)
-

get_miso_x_lag_list(n_inputs)

Return x regressor code list for MISO models.

Returns:

Type Description
x_vec

The x regressor code list given the xlag for a MISO model.

Source code in sysidentpy\narmax_base.py
389
+

get_miso_x_lag_list(n_inputs)

Return x regressor code list for MISO models.

Returns:

Type Description
x_vec = ndarray of ints

The x regressor code list given the xlag for a MISO model.

Source code in sysidentpy\narmax_base.py
389
 390
 391
 392
@@ -2658,7 +2658,7 @@
     # if x_vec is a nested list, ensure all elements are arrays
     all_arrays = [np.array([i]) if isinstance(i, int) else i for i in x_vec_tmp]
     return np.concatenate([i for i in all_arrays])
-

get_siso_x_lag_list()

Return x regressor code list for SISO models.

Returns:

Type Description
x_vec_tmp

The x regressor code list given the xlag for a SISO model.

Source code in sysidentpy\narmax_base.py
371
+

get_siso_x_lag_list()

Return x regressor code list for SISO models.

Returns:

Type Description
x_vec_tmp = ndarray of ints

The x regressor code list given the xlag for a SISO model.

Source code in sysidentpy\narmax_base.py
371
 372
 373
 374
@@ -2691,7 +2691,7 @@
 
     # create a range of lags if passed a int value
     return np.arange(2001, 2001 + self.xlag)
-

get_y_lag_list()

Return y regressor code list.

Returns:

Type Description
y_vec

The y regressor code list given the ylag.

Source code in sysidentpy\narmax_base.py
353
+

get_y_lag_list()

Return y regressor code list.

Returns:

Type Description
y_vec = ndarray of ints

The y regressor code list given the ylag.

Source code in sysidentpy\narmax_base.py
353
 354
 355
 356
@@ -2724,7 +2724,7 @@
 
     # create a range of lags if passed a int value
     return np.arange(1001, 1001 + self.ylag)
-

regressor_space(n_inputs)

Create regressor code based on model type.

Parameters:

Name Type Description Default
n_inputs int

Number of input variables.

required

Returns:

Type Description
regressor_code

The regressor code list given the xlag and ylag for a MISO model.

Source code in sysidentpy\narmax_base.py
414
+

regressor_space(n_inputs)

Create regressor code based on model type.

Parameters:

Name Type Description Default
n_inputs int

Number of input variables.

required

Returns:

Type Description
regressor_code = ndarray of ints

The regressor code list given the xlag and ylag for a MISO model.

Source code in sysidentpy\narmax_base.py
414
 415
 416
 417
diff --git a/docs/code/neural-narx/index.html b/docs/code/neural-narx/index.html
index 71ea1e3..7739a64 100644
--- a/docs/code/neural-narx/index.html
+++ b/docs/code/neural-narx/index.html
@@ -1,5 +1,5 @@
 
- Neural NARX - SysIdentPy        

Documentation for Neural NARX

Build Polynomial NARMAX Models

NARXNN

Bases: BaseMSS

NARX Neural Network model build on top of Pytorch

Currently we support a Series-Parallel (open-loop) Feedforward Network training process, which make the training process easier, and we convert the NARX network from Series-Parallel to the Parallel (closed-loop) configuration for prediction.

Parameters:

Name Type Description Default
ylag int, default

The maximum lag of the output.

1
xlag int, default

The maximum lag of the input.

1
basis_function

Defines which basis function will be used in the model.

Polynomial()
model_type

The user can choose "NARMAX", "NAR" and "NFIR" models

'NARMAX'
batch_size int, default

Size of mini-batches of data for stochastic optimizers

100
learning_rate float, default

Learning rate schedule for weight updates

0.01
epochs int, default

Number of training epochs

200
loss_func str, default

Select the loss function available in torch.nn.functional

'mse_loss'
optimizer str, default

The solver for weight optimization

'Adam'
optim_params dict, default

Optional parameters for the optimizer

None
net default

The defined network using nn.Module

None
verbose bool, default

Show the training and validation loss at each iteration

False

Examples:

>>> from torch import nn
+                        

Documentation for Neural NARX

Build Polynomial NARMAX Models

NARXNN

Bases: BaseMSS

NARX Neural Network model build on top of Pytorch

Currently we support a Series-Parallel (open-loop) Feedforward Network training process, which make the training process easier, and we convert the NARX network from Series-Parallel to the Parallel (closed-loop) configuration for prediction.

Parameters:

Name Type Description Default
ylag int

The maximum lag of the output.

2
xlag int

The maximum lag of the input.

2
basis_function

Defines which basis function will be used in the model.

Polynomial()
model_type

The user can choose "NARMAX", "NAR" and "NFIR" models

'NARMAX'
batch_size int

Size of mini-batches of data for stochastic optimizers

100
learning_rate float

Learning rate schedule for weight updates

0.01
epochs int

Number of training epochs

100
loss_func str

Select the loss function available in torch.nn.functional

'mse_loss'
optimizer str

The solver for weight optimization

'SGD'
optim_params dict

Optional parameters for the optimizer

None
net default=None

The defined network using nn.Module

None
verbose bool

Show the training and validation loss at each iteration

False

Examples:

>>> from torch import nn
 >>> import numpy as np
 >>> import pandas as pd
 >>> import matplotlib.pyplot as plt
@@ -1653,7 +1653,7 @@
 
         yhat = yhat.ravel()
         return yhat.reshape(-1, 1)
-

convert_to_tensor(reg_matrix, y)

Return the lagged matrix and the y values given the maximum lags.

Based on Pytorch official docs: https://pytorch.org/tutorials/beginner/nn_tutorial.html

Parameters:

Name Type Description Default
reg_matrix ndarray of floats

The information matrix of the model.

required
y ndarray of floats

The output data

required

Returns:

Name Type Description
Tensor tensor

tensors that have the same size of the first dimension.

Source code in sysidentpy\neural_network\narx_nn.py
318
+

convert_to_tensor(reg_matrix, y)

Return the lagged matrix and the y values given the maximum lags.

Based on Pytorch official docs: https://pytorch.org/tutorials/beginner/nn_tutorial.html

Parameters:

Name Type Description Default
reg_matrix ndarray of floats

The information matrix of the model.

required
y ndarray of floats

The output data

required

Returns:

Name Type Description
Tensor tensor

tensors that have the same size of the first dimension.

Source code in sysidentpy\neural_network\narx_nn.py
318
 319
 320
 321
@@ -1694,7 +1694,7 @@
     """
     reg_matrix, y = map(torch.tensor, (reg_matrix, y))
     return TensorDataset(reg_matrix, y)
-

data_transform(X, y)

Return the data transformed in tensors using Dataloader.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required

Returns:

Name Type Description
Tensors Dataloader
Source code in sysidentpy\neural_network\narx_nn.py
362
+

data_transform(X, y)

Return the data transformed in tensors using Dataloader.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required

Returns:

Name Type Description
Tensors Dataloader
Source code in sysidentpy\neural_network\narx_nn.py
362
 363
 364
 365
@@ -1744,7 +1744,7 @@
     """Defines the optimizer using the user parameters."""
     opt = getattr(optim, self.optimizer)
     return opt(self.net.parameters(), lr=self.learning_rate, **self.optim_params)
-

fit(*, X=None, y=None, X_test=None, y_test=None)

Train a NARX Neural Network model.

This is an training pipeline that allows a friendly usage by the user. The training pipeline was based on https://pytorch.org/tutorials/beginner/nn_tutorial.html

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the training process.

None
y ndarray of floats

The output data to be used in the training process.

None
X_test ndarray of floats

The input data to be used in the prediction process.

None
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

None

Returns:

Name Type Description
net nn.Module

The model fitted.

train_loss ndarrays of floats

The training loss of each batch

val_loss ndarrays of floats

The validation loss of each batch

Source code in sysidentpy\neural_network\narx_nn.py
385
+

fit(*, X=None, y=None, X_test=None, y_test=None)

Train a NARX Neural Network model.

This is an training pipeline that allows a friendly usage by the user. The training pipeline was based on https://pytorch.org/tutorials/beginner/nn_tutorial.html

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the training process.

None
y ndarray of floats

The output data to be used in the training process.

None
X_test ndarray of floats

The input data to be used in the prediction process.

None
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

None

Returns:

Name Type Description
net Module

The model fitted.

train_loss ndarrays of floats

The training loss of each batch

val_loss ndarrays of floats

The validation loss of each batch

Source code in sysidentpy\neural_network\narx_nn.py
385
 386
 387
 388
@@ -1889,7 +1889,7 @@
                 + str(self.val_loss[epoch])
             )
     return self
-

get_data(train_ds)

Return the lagged matrix and the y values given the maximum lags.

Based on Pytorch official docs: https://pytorch.org/tutorials/beginner/nn_tutorial.html

Parameters:

Name Type Description Default
train_ds

Tensors that have the same size of the first dimension.

required

Returns:

Name Type Description
Dataloader dataloader

tensors that have the same size of the first dimension.

Source code in sysidentpy\neural_network\narx_nn.py
340
+

get_data(train_ds)

Return the lagged matrix and the y values given the maximum lags.

Based on Pytorch official docs: https://pytorch.org/tutorials/beginner/nn_tutorial.html

Parameters:

Name Type Description Default
train_ds

Tensors that have the same size of the first dimension.

required

Returns:

Name Type Description
Dataloader dataloader

tensors that have the same size of the first dimension.

Source code in sysidentpy\neural_network\narx_nn.py
340
 341
 342
 343
@@ -1930,7 +1930,7 @@
     return DataLoader(
         train_ds, batch_size=self.batch_size, pin_memory=pin_memory, shuffle=False
     )
-

loss_batch(X, y, opt=None)

Compute the loss for one batch.

Parameters:

Name Type Description Default
X ndarray of floats

The regressor matrix.

required
y ndarray of floats

The output data.

required

Returns:

Name Type Description
loss float

The loss of one batch.

Source code in sysidentpy\neural_network\narx_nn.py
224
+

loss_batch(X, y, opt=None)

Compute the loss for one batch.

Parameters:

Name Type Description Default
X ndarray of floats

The regressor matrix.

required
y ndarray of floats

The output data.

required

Returns:

Name Type Description
loss float

The loss of one batch.

Source code in sysidentpy\neural_network\narx_nn.py
224
 225
 226
 227
@@ -1977,7 +1977,7 @@
         opt.step()
 
     return loss.item(), len(X)
-

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted given an input and initial values.

The predict function allows a friendly usage by the user. Given a trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future).

Currently we only support infinity-steps-ahead prediction, but run 1-step-ahead prediction manually is straightforward.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\neural_network\narx_nn.py
459
+

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted given an input and initial values.

The predict function allows a friendly usage by the user. Given a trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future).

Currently we only support infinity-steps-ahead prediction, but run 1-step-ahead prediction manually is straightforward.

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\neural_network\narx_nn.py
459
 460
 461
 462
@@ -2062,7 +2062,7 @@
     return self._basis_function_n_step_prediction(
         X, y, steps_ahead=steps_ahead, forecast_horizon=forecast_horizon
     )
-

split_data(X, y)

Return the lagged matrix and the y values given the maximum lags.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required

Returns:

Name Type Description
y ndarray of floats

The y values considering the lags.

reg_matrix ndarray of floats

The information matrix of the model.

Source code in sysidentpy\neural_network\narx_nn.py
249
+

split_data(X, y)

Return the lagged matrix and the y values given the maximum lags.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required

Returns:

Name Type Description
y ndarray of floats

The y values considering the lags.

reg_matrix ndarray of floats

The information matrix of the model.

Source code in sysidentpy\neural_network\narx_nn.py
249
 250
 251
 252
diff --git a/docs/code/parameter-estimation/index.html b/docs/code/parameter-estimation/index.html
index 5b4e544..34ebdea 100644
--- a/docs/code/parameter-estimation/index.html
+++ b/docs/code/parameter-estimation/index.html
@@ -1,5 +1,5 @@
 
- Parameter Estimation - SysIdentPy        

Documentation for Parameters Estimation

Least Squares Methods for parameter estimation

Estimators

Ordinary Least Squares for linear parameter estimation

Source code in sysidentpy\parameter_estimation\estimators.py
 15
+                        

Documentation for Parameters Estimation

Least Squares Methods for parameter estimation

Estimators

Ordinary Least Squares for linear parameter estimation

Source code in sysidentpy\parameter_estimation\estimators.py
 15
  16
  17
  18
@@ -1765,7 +1765,7 @@
             theta[:, i] = tmp_list.flatten()
 
         return theta[:, -1].reshape(-1, 1)
-

affine_least_mean_squares(psi, y)

Estimate the model parameters using the Affine Least Mean Squares.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Poularikas, A. D. (2017). Adaptive filtering: Fundamentals of least mean squares with MATLAB®. CRC Press.
Source code in sysidentpy\parameter_estimation\estimators.py
271
+

affine_least_mean_squares(psi, y)

Estimate the model parameters using the Affine Least Mean Squares.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Poularikas, A. D. (2017). Adaptive filtering: Fundamentals of least mean squares with MATLAB®. CRC Press.
Source code in sysidentpy\parameter_estimation\estimators.py
271
 272
 273
 274
@@ -1844,7 +1844,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares(psi, y)

Estimate the model parameters using the Least Mean Squares filter.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Haykin, S., & Widrow, B. (Eds.). (2003). Least-mean-square adaptive filters (Vol. 31). John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
312
+

least_mean_squares(psi, y)

Estimate the model parameters using the Least Mean Squares filter.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Haykin, S., & Widrow, B. (Eds.). (2003). Least-mean-square adaptive filters (Vol. 31). John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
312
 313
 314
 315
@@ -1929,7 +1929,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares_fourth(psi, y)

Parameter estimation using the LMS Fourth filter.

When the leakage factor, gama, is set to 0 then there is no leakage in the estimation process.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Manuscript:Gui, G., Mehbodniya, A., & Adachi, F. (2013). Least mean square/fourth algorithm with application to sparse channel estimation. arXiv preprint arXiv:1304.3911. https://arxiv.org/pdf/1304.3911.pdf
  • Manuscript: Nascimento, V. H., & Bermudez, J. C. M. (2005, March). When is the least-mean fourth algorithm mean-square stable? In Proceedings.(ICASSP'05). IEEE International Conference on Acoustics, Speech, and Signal Processing, 2005. (Vol. 4, pp. iv-341). IEEE. http://www.lps.usp.br/vitor/artigos/icassp05.pdf
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
788
+

least_mean_squares_fourth(psi, y)

Parameter estimation using the LMS Fourth filter.

When the leakage factor, gama, is set to 0 then there is no leakage in the estimation process.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Manuscript:Gui, G., Mehbodniya, A., & Adachi, F. (2013). Least mean square/fourth algorithm with application to sparse channel estimation. arXiv preprint arXiv:1304.3911. https://arxiv.org/pdf/1304.3911.pdf
  • Manuscript: Nascimento, V. H., & Bermudez, J. C. M. (2005, March). When is the least-mean fourth algorithm mean-square stable? In Proceedings.(ICASSP'05). IEEE International Conference on Acoustics, Speech, and Signal Processing, 2005. (Vol. 4, pp. iv-341). IEEE. http://www.lps.usp.br/vitor/artigos/icassp05.pdf
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
788
 789
 790
 791
@@ -2040,7 +2040,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares_leaky(psi, y)

Parameter estimation using the Leaky LMS filter.

When the leakage factor, gama, is set to 0 then there is no leakage in the estimation process.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
740
+

least_mean_squares_leaky(psi, y)

Parameter estimation using the Leaky LMS filter.

When the leakage factor, gama, is set to 0 then there is no leakage in the estimation process.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
740
 741
 742
 743
@@ -2133,7 +2133,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares_mixed_norm(psi, y)

Parameter estimation using the Mixed-norm LMS filter.

The weight factor controls the proportions of the error norms and offers an extra degree of freedom within the adaptation.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
Source code in sysidentpy\parameter_estimation\estimators.py
845
+

least_mean_squares_mixed_norm(psi, y)

Parameter estimation using the Mixed-norm LMS filter.

The weight factor controls the proportions of the error norms and offers an extra degree of freedom within the adaptation.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
Source code in sysidentpy\parameter_estimation\estimators.py
845
 846
 847
 848
@@ -2228,7 +2228,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares_normalized_leaky(psi, y)

Parameter estimation using the Normalized Leaky LMS filter.

When the leakage factor, gama, is set to 0 then there is no leakage in the estimation process.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
691
+

least_mean_squares_normalized_leaky(psi, y)

Parameter estimation using the Normalized Leaky LMS filter.

When the leakage factor, gama, is set to 0 then there is no leakage in the estimation process.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
691
 692
 693
 694
@@ -2323,7 +2323,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares_normalized_sign_error(psi, y)

Parameter estimation using the Normalized Sign-Error LMS filter.

The normalization is used to avoid numerical instability when updating the estimated parameters and the sign of the error vector is used to to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
451
+

least_mean_squares_normalized_sign_error(psi, y)

Parameter estimation using the Normalized Sign-Error LMS filter.

The normalization is used to avoid numerical instability when updating the estimated parameters and the sign of the error vector is used to to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
451
 452
 453
 454
@@ -2416,7 +2416,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares_normalized_sign_regressor(psi, y)

Parameter estimation using the Normalized Sign-Regressor LMS filter.

The normalization is used to avoid numerical instability when updating the estimated parameters and the sign of the information matrix is used to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References

.. [1] Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons. .. [2] Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável. .. [3] Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter

Source code in sysidentpy\parameter_estimation\estimators.py
546
+

least_mean_squares_normalized_sign_regressor(psi, y)

Parameter estimation using the Normalized Sign-Regressor LMS filter.

The normalization is used to avoid numerical instability when updating the estimated parameters and the sign of the information matrix is used to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References

.. [1] Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons. .. [2] Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável. .. [3] Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter

Source code in sysidentpy\parameter_estimation\estimators.py
546
 547
 548
 549
@@ -2509,7 +2509,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares_normalized_sign_sign(psi, y)

Parameter estimation using the Normalized Sign-Sign LMS filter.

The normalization is used to avoid numerical instability when updating the estimated parameters and both the sign of the information matrix and the sign of the error vector are used to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
642
+

least_mean_squares_normalized_sign_sign(psi, y)

Parameter estimation using the Normalized Sign-Sign LMS filter.

The normalization is used to avoid numerical instability when updating the estimated parameters and both the sign of the information matrix and the sign of the error vector are used to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
642
 643
 644
 645
@@ -2604,7 +2604,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares_sign_error(psi, y)

Parameter estimation using the Sign-Error Least Mean Squares filter.

The sign-error LMS algorithm uses the sign of the error vector to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
356
+

least_mean_squares_sign_error(psi, y)

Parameter estimation using the Sign-Error Least Mean Squares filter.

The sign-error LMS algorithm uses the sign of the error vector to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
356
 357
 358
 359
@@ -2697,7 +2697,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares_sign_regressor(psi, y)

Parameter estimation using the Sign-Regressor LMS filter.

The sign-regressor LMS algorithm uses the sign of the matrix information to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
499
+

least_mean_squares_sign_regressor(psi, y)

Parameter estimation using the Sign-Regressor LMS filter.

The sign-regressor LMS algorithm uses the sign of the matrix information to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
499
 500
 501
 502
@@ -2788,7 +2788,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_mean_squares_sign_sign(psi, y)

Parameter estimation using the Sign-Sign LMS filter.

The sign-regressor LMS algorithm uses both the sign of the matrix information and the sign of the error vector to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
594
+

least_mean_squares_sign_sign(psi, y)

Parameter estimation using the Sign-Sign LMS filter.

The sign-regressor LMS algorithm uses both the sign of the matrix information and the sign of the error vector to change the filter coefficients.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
594
 595
 596
 597
@@ -2881,7 +2881,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

least_squares(psi, y)

Estimate the model parameters using Least Squares method.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

References
Source code in sysidentpy\parameter_estimation\estimators.py
 83
+

least_squares(psi, y)

Estimate the model parameters using Least Squares method.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

References
Source code in sysidentpy\parameter_estimation\estimators.py
 83
  84
  85
  86
@@ -2952,7 +2952,7 @@
     y = y[self.max_lag :, 0].reshape(-1, 1)
     theta = np.linalg.lstsq(psi, y, rcond=None)[0]
     return theta
-

normalized_least_mean_squares(psi, y)

Parameter estimation using the Normalized Least Mean Squares filter.

The normalization is used to avoid numerical instability when updating the estimated parameters.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
404
+

normalized_least_mean_squares(psi, y)

Parameter estimation using the Normalized Least Mean Squares filter.

The normalization is used to avoid numerical instability when updating the estimated parameters.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book: Hayes, M. H. (2009). Statistical digital signal processing and modeling. John Wiley & Sons.
  • Dissertation (Portuguese): Zipf, J. G. F. (2011). Classificação, análise estatística e novas estratégias de algoritmos LMS de passo variável.
  • Wikipedia entry on Least Mean Squares https://en.wikipedia.org/wiki/Least_mean_squares_filter
Source code in sysidentpy\parameter_estimation\estimators.py
404
 405
 406
 407
@@ -3043,7 +3043,7 @@
         theta[:, i] = tmp_list.flatten()
 
     return theta[:, -1].reshape(-1, 1)
-

recursive_least_squares(psi, y)

Estimate the model parameters using the Recursive Least Squares method.

The implementation consider the forgetting factor.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book (Portuguese): Aguirre, L. A. (2007). Introdução identificação de sistemas: técnicas lineares e não-lineares aplicadas a sistemas reais. Editora da UFMG. 3a edição.
Source code in sysidentpy\parameter_estimation\estimators.py
217
+

recursive_least_squares(psi, y)

Estimate the model parameters using the Recursive Least Squares method.

The implementation consider the forgetting factor.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

Notes

A more in-depth documentation of all methods for parameters estimation will be available soon. For now, please refer to the mentioned references.

References
  • Book (Portuguese): Aguirre, L. A. (2007). Introdução identificação de sistemas: técnicas lineares e não-lineares aplicadas a sistemas reais. Editora da UFMG. 3a edição.
Source code in sysidentpy\parameter_estimation\estimators.py
217
 218
 219
 220
@@ -3148,7 +3148,7 @@
 
     self.theta_evolution = theta.copy()
     return theta[:, -1].reshape(-1, 1)
-

total_least_squares(psi, y)

Estimate the model parameters using Total Least Squares method.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape

The estimated parameters of the model.

References
Source code in sysidentpy\parameter_estimation\estimators.py
174
+

total_least_squares(psi, y)

Estimate the model parameters using Total Least Squares method.

Parameters:

Name Type Description Default
psi ndarray of floats

The information matrix of the model.

required
y array-like of shape = y_training

The data used to training the model.

required

Returns:

Name Type Description
theta array-like of shape = number_of_model_elements

The estimated parameters of the model.

References
Source code in sysidentpy\parameter_estimation\estimators.py
174
 175
 176
 177
@@ -3215,4 +3215,4 @@
     _, _, v = np.linalg.svd(full, full_matrices=True)
     theta = -v.T[:n, n:] / v.T[n:, n:]
     return theta.reshape(-1, 1)
-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/code/residues/index.html b/docs/code/residues/index.html index ccd51d6..8de6afb 100644 --- a/docs/code/residues/index.html +++ b/docs/code/residues/index.html @@ -1,5 +1,5 @@ - Residual Analysis - SysIdentPy

Documentation for Residual Analysis

\ No newline at end of file +

Documentation for Residual Analysis

\ No newline at end of file diff --git a/docs/code/simulation/index.html b/docs/code/simulation/index.html index 2637115..484cc12 100644 --- a/docs/code/simulation/index.html +++ b/docs/code/simulation/index.html @@ -1,5 +1,5 @@ - Simulation - SysIdentPy

Documentation for Simulation

Simulation methods for NARMAX models

SimulateNARMAX

Bases: Estimators, BaseMSS

Simulation of Polynomial NARMAX model

The NARMAX model is described as:

\[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

where \(n_y\in \mathbb{N}^*\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

Parameters:

Name Type Description Default
estimator str, default

The parameter estimation method.

'recursive_least_squares'
extended_least_squares bool, default

Whether to use extended least squares method for parameter estimation. Note that we define a specific set of noise regressors.

False
estimate_parameter bool, default

Whether to use a method for parameter estimation. Must be True if the user do not enter the pre-estimated parameters. Note that we define a specific set of noise regressors.

True
calculate_err bool, default

Whether to use a ERR algorithm to the pre-defined regressors.

False
lam float, default

Forgetting factor of the Recursive Least Squares method.

0.98
delta float, default

Normalization factor of the P matrix.

0.01
offset_covariance float, default

The offset covariance factor of the affine least mean squares filter.

0.2
mu float, default

The convergence coefficient (learning rate) of the filter.

0.01
eps float

Normalization factor of the normalized filters.

np.finfo(np.float64).eps
gama float, default

The leakage factor of the Leaky LMS method.

0.2
weight float, default

Weight factor to control the proportions of the error norms and offers an extra degree of freedom within the adaptation of the LMS mixed norm method.

0.02

Examples:

>>> import numpy as np
+                        

Documentation for Simulation

Simulation methods for NARMAX models

SimulateNARMAX

Bases: Estimators, BaseMSS

Simulation of Polynomial NARMAX model

The NARMAX model is described as:

\[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

where \(n_y\in \mathbb{N}^*\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

Parameters:

Name Type Description Default
estimator str

The parameter estimation method.

"least_squares"
extended_least_squares bool

Whether to use extended least squares method for parameter estimation. Note that we define a specific set of noise regressors.

False
estimate_parameter bool

Whether to use a method for parameter estimation. Must be True if the user do not enter the pre-estimated parameters. Note that we define a specific set of noise regressors.

False
calculate_err bool

Whether to use a ERR algorithm to the pre-defined regressors.

False
lam float

Forgetting factor of the Recursive Least Squares method.

0.98
delta float

Normalization factor of the P matrix.

0.01
offset_covariance float

The offset covariance factor of the affine least mean squares filter.

0.2
mu float

The convergence coefficient (learning rate) of the filter.

0.01
eps float

Normalization factor of the normalized filters.

eps
gama float

The leakage factor of the Leaky LMS method.

0.2
weight float

Weight factor to control the proportions of the error norms and offers an extra degree of freedom within the adaptation of the LMS mixed norm method.

0.02

Examples:

>>> import numpy as np
 >>> import matplotlib.pyplot as plt
 >>> from sysidentpy.simulation import SimulateNARMAX
 >>> from sysidentpy.basis_function._basis_function import Polynomial
@@ -1152,7 +1152,7 @@
         raise NotImplementedError(
             "There is no fit method in Simulate because the model is predefined."
         )
-

error_reduction_ratio(psi, y, process_term_number, regressor_code)

Perform the Error Reduction Ration algorithm.

Parameters:

Name Type Description Default
y array-like of shape

The target data used in the identification process.

required
psi ndarray of floats

The information matrix of the model.

required
process_term_number int

Number of Process Terms defined by the user.

required

Returns:

Name Type Description
err array-like of shape

The respective ERR calculated for each regressor.

piv array-like of shape

Contains the index to put the regressors in the correct order based on err values.

psi_orthogonal ndarray of floats

The updated and orthogonal information matrix.

References
  • Manuscript: Orthogonal least squares methods and their application to non-linear system identification https://eprints.soton.ac.uk/251147/1/778742007_content.pdf
  • Manuscript (portuguese): Identificação de Sistemas não Lineares Utilizando Modelos NARMAX Polinomiais – Uma Revisão e Novos Resultados
Source code in sysidentpy\simulation\_simulation.py
316
+

error_reduction_ratio(psi, y, process_term_number, regressor_code)

Perform the Error Reduction Ration algorithm.

Parameters:

Name Type Description Default
y array-like of shape = n_samples

The target data used in the identification process.

required
psi ndarray of floats

The information matrix of the model.

required
process_term_number int

Number of Process Terms defined by the user.

required

Returns:

Name Type Description
err array-like of shape = number_of_model_elements

The respective ERR calculated for each regressor.

piv array-like of shape = number_of_model_elements

Contains the index to put the regressors in the correct order based on err values.

psi_orthogonal ndarray of floats

The updated and orthogonal information matrix.

References
  • Manuscript: Orthogonal least squares methods and their application to non-linear system identification https://eprints.soton.ac.uk/251147/1/778742007_content.pdf
  • Manuscript (portuguese): Identificação de Sistemas não Lineares Utilizando Modelos NARMAX Polinomiais – Uma Revisão e Novos Resultados
Source code in sysidentpy\simulation\_simulation.py
316
 317
 318
 319
@@ -1298,7 +1298,7 @@
     raise NotImplementedError(
         "There is no fit method in Simulate because the model is predefined."
     )
-

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted values given an input.

The predict function allows a friendly usage by the user. Given a previously trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future)

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None
steps_ahead int (default

The user can use free run simulation, one-step ahead prediction and n-step ahead prediction.

None
forecast_horizon int, default

The number of predictions over the time.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\simulation\_simulation.py
386
+

predict(*, X=None, y=None, steps_ahead=None, forecast_horizon=None)

Return the predicted values given an input.

The predict function allows a friendly usage by the user. Given a previously trained model, predict values given a new set of data.

This method accept y values mainly for prediction n-steps ahead (to be implemented in the future)

Parameters:

Name Type Description Default
X ndarray of floats

The input data to be used in the prediction process.

None
y ndarray of floats

The output data to be used in the prediction process.

None
steps_ahead int(default=None)

The user can use free run simulation, one-step ahead prediction and n-step ahead prediction.

None
forecast_horizon int

The number of predictions over the time.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

Source code in sysidentpy\simulation\_simulation.py
386
 387
 388
 389
@@ -1411,7 +1411,7 @@
     )
     yhat = np.concatenate([y[: self.max_lag], yhat], axis=0)
     return yhat
-

simulate(*, X_train=None, y_train=None, X_test=None, y_test=None, model_code=None, steps_ahead=None, theta=None, forecast_horizon=None)

Simulate a model defined by the user.

Parameters:

Name Type Description Default
X_train ndarray of floats

The input data to be used in the training process.

None
y_train ndarray of floats

The output data to be used in the training process.

None
X_test ndarray of floats

The input data to be used in the prediction process.

None
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

None
model_code ndarray of int

Flattened list of input or output regressors.

None
steps_ahead

The forecast horizon.

None
theta array-like of shape

The parameters of the model.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

results string

Where: First column represents each regressor element; Second column represents associated parameter; Third column represents the error reduction ratio associated to each regressor.

Source code in sysidentpy\simulation\_simulation.py
207
+

simulate(*, X_train=None, y_train=None, X_test=None, y_test=None, model_code=None, steps_ahead=None, theta=None, forecast_horizon=None)

Simulate a model defined by the user.

Parameters:

Name Type Description Default
X_train ndarray of floats

The input data to be used in the training process.

None
y_train ndarray of floats

The output data to be used in the training process.

None
X_test ndarray of floats

The input data to be used in the prediction process.

None
y_test ndarray of floats

The output data (initial conditions) to be used in the prediction process.

None
model_code ndarray of int

Flattened list of input or output regressors.

None
steps_ahead

The forecast horizon.

None
theta array-like of shape = number_of_model_elements

The parameters of the model.

None

Returns:

Name Type Description
yhat ndarray of floats

The predicted values of the model.

results string

Where: First column represents each regressor element; Second column represents associated parameter; Third column represents the error reduction ratio associated to each regressor.

Source code in sysidentpy\simulation\_simulation.py
207
 208
 209
 210
@@ -1626,4 +1626,4 @@
         steps_ahead=steps_ahead,
         forecast_horizon=forecast_horizon,
     )
-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/code/utils/index.html b/docs/code/utils/index.html index 21b8d28..fb77889 100644 --- a/docs/code/utils/index.html +++ b/docs/code/utils/index.html @@ -1,5 +1,5 @@ - Utils - SysIdentPy
Skip to content

Documentation for Neural NARX

Utilities fo data validation

check_X_y(X, y)

Validate input and output data using some crucial tests.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required
Source code in sysidentpy\utils\_check_arrays.py
171
+                        

Documentation for Neural NARX

Utilities fo data validation

check_X_y(X, y)

Validate input and output data using some crucial tests.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required
Source code in sysidentpy\utils\_check_arrays.py
171
 172
 173
 174
@@ -39,7 +39,7 @@
     check_dimension(X, y)
     check_infinity(X, y)
     check_nan(X, y)
-

check_dimension(X, y)

Check if X and y have only real values.

If there is any string or object samples a ValueError is raised.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required
Source code in sysidentpy\utils\_check_arrays.py
133
+

check_dimension(X, y)

Check if X and y have only real values.

If there is any string or object samples a ValueError is raised.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required
Source code in sysidentpy\utils\_check_arrays.py
133
 134
 135
 136
@@ -110,7 +110,7 @@
             "Output must be a 2d array, got 1d array instead. "
             "Reshape your data using array.reshape(-1, 1)"
         )
-

check_infinity(X, y)

Check that X and y have no NaN or Inf samples.

If there is any NaN or Inf samples a ValueError is raised.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required
Source code in sysidentpy\utils\_check_arrays.py
55
+

check_infinity(X, y)

Check that X and y have no NaN or Inf samples.

If there is any NaN or Inf samples a ValueError is raised.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required
Source code in sysidentpy\utils\_check_arrays.py
55
 56
 57
 58
@@ -161,7 +161,7 @@
             f"index {np.argwhere(np.isinf(y))}"
         )
         raise ValueError(msg_error)
-

check_length(X, y)

Check that X and y have the same number of samples.

If the length of X and y are different a ValueError is raised.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required
Source code in sysidentpy\utils\_check_arrays.py
111
+

check_length(X, y)

Check that X and y have the same number of samples.

If the length of X and y are different a ValueError is raised.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required
Source code in sysidentpy\utils\_check_arrays.py
111
 112
 113
 114
@@ -200,7 +200,7 @@
             f"y has dimension {y.shape}"
         )
         raise ValueError(msg_error)
-

check_nan(X, y)

Check that X and y have no NaN or Inf samples.

If there is any NaN or Inf samples a ValueError is raised.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required
Source code in sysidentpy\utils\_check_arrays.py
 83
+

check_nan(X, y)

Check that X and y have no NaN or Inf samples.

If there is any NaN or Inf samples a ValueError is raised.

Parameters:

Name Type Description Default
X ndarray of floats

The input data.

required
y ndarray of floats

The output data.

required
Source code in sysidentpy\utils\_check_arrays.py
 83
  84
  85
  86
@@ -251,7 +251,8 @@
             f"index {np.argwhere(np.isnan(y))}"
         )
         raise ValueError(msg_error)
-

check_random_state(seed)

Turn seed into a np.random.RandomState instance.

Parameters:

Name Type Description Default
seed

numpy.random.RandomState}, optional If seed is None (or np.random), the numpy.random.RandomState singleton is used. If seed is an int, a new RandomState instance is used, seeded with seed. If seed is already a Generator or RandomState instance then that instance is used.

required

Returns:

Name Type Description
seed

Random number generator.

Source code in sysidentpy\utils\_check_arrays.py
12
+

check_random_state(seed)

Turn seed into a np.random.RandomState instance.

Parameters:

Name Type Description Default
seed {None, int, `numpy.random.Generator`,
`numpy.random.RandomState`}, optional
+

If seed is None (or np.random), the numpy.random.RandomState singleton is used. If seed is an int, a new RandomState instance is used, seeded with seed. If seed is already a Generator or RandomState instance then that instance is used.

required

Returns:

Name Type Description
seed {`numpy.random.Generator`, `numpy.random.RandomState`}

Random number generator.

Source code in sysidentpy\utils\_check_arrays.py
12
 13
 14
 15
@@ -310,7 +311,7 @@
     raise ValueError(
         "%r cannot be used to seed a numpy.random.RandomState instance" % seed
     )
-

results(final_model=None, theta=None, err=None, n_terms=None, theta_precision=4, err_precision=8, dtype='dec')

Write the model regressors, parameters and ERR values.

This function returns the model regressors, its respective parameter and ERR value on a string matrix.

Parameters:

Name Type Description Default
theta_precision int (default

Precision of shown parameters values.

4
err_precision int (default

Precision of shown ERR values.

8
dtype string (default

Type of representation: sci - Scientific notation; dec - Decimal notation.

'dec'

Returns:

Name Type Description
output_matrix string

Where: First column represents each regressor element; Second column represents associated parameter; Third column represents the error reduction ratio associated to each regressor.

Source code in sysidentpy\utils\display_results.py
 10
+

results(final_model=None, theta=None, err=None, n_terms=None, theta_precision=4, err_precision=8, dtype='dec')

Write the model regressors, parameters and ERR values.

This function returns the model regressors, its respective parameter and ERR value on a string matrix.

Parameters:

Name Type Description Default
theta_precision int (default: 4)

Precision of shown parameters values.

4
err_precision int (default: 8)

Precision of shown ERR values.

8
dtype string (default: 'dec')

Type of representation: sci - Scientific notation; dec - Decimal notation.

'dec'

Returns:

Name Type Description
output_matrix string

Where: First column represents each regressor element; Second column represents associated parameter; Third column represents the error reduction ratio associated to each regressor.

Source code in sysidentpy\utils\display_results.py
 10
  11
  12
  13
@@ -503,7 +504,7 @@
         output_matrix.append(current_output)
 
     return output_matrix
-

Utilities for data generation

get_miso_data(n=5000, colored_noise=False, sigma=0.05, train_percentage=90)

Perform the Error Reduction Ration algorithm.

Parameters:

Name Type Description Default
n int

The number of samples.

5000
colored_noise bool

Select white noise or colored noise (autoregressive noise).

False
sigma float

The standard deviation of the random distribution to generate the noise.

0.05
train_percentage int

The percentage of the data to be used as train data.

90

Returns:

Type Description
x_train, x_valid

The input data to be used in identification and validation, respectively.

y_train, y_valid

The output data to be used in identification and validation, respectively.

Source code in sysidentpy\utils\generate_data.py
 68
+

Utilities for data generation

get_miso_data(n=5000, colored_noise=False, sigma=0.05, train_percentage=90)

Perform the Error Reduction Ration algorithm.

Parameters:

Name Type Description Default
n int

The number of samples.

5000
colored_noise bool

Select white noise or colored noise (autoregressive noise).

False
sigma float

The standard deviation of the random distribution to generate the noise.

0.05
train_percentage int

The percentage of the data to be used as train data.

90

Returns:

Type Description
x_train, x_valid : array-like

The input data to be used in identification and validation, respectively.

y_train, y_valid : array-like

The output data to be used in identification and validation, respectively.

Source code in sysidentpy\utils\generate_data.py
 68
  69
  70
  71
@@ -630,7 +631,7 @@
     y_valid = y[split_data::].reshape(-1, 1)
 
     return x_train, x_valid, y_train, y_valid
-

get_siso_data(n=5000, colored_noise=False, sigma=0.05, train_percentage=90)

Perform the Error Reduction Ration algorithm.

Parameters:

Name Type Description Default
n int

The number of samples.

5000
colored_noise bool

Select white noise or colored noise (autoregressive noise).

False
sigma float

The standard deviation of the random distribution to generate the noise.

0.05
train_percentage int

The percentage of the data to be used as train data.

90

Returns:

Type Description
x_train, x_valid

The input data to be used in identification and validation, respectively.

y_train, y_valid

The output data to be used in identification and validation, respectively.

Source code in sysidentpy\utils\generate_data.py
 9
+

get_siso_data(n=5000, colored_noise=False, sigma=0.05, train_percentage=90)

Perform the Error Reduction Ration algorithm.

Parameters:

Name Type Description Default
n int

The number of samples.

5000
colored_noise bool

Select white noise or colored noise (autoregressive noise).

False
sigma float

The standard deviation of the random distribution to generate the noise.

0.05
train_percentage int

The percentage of the data to be used as train data.

90

Returns:

Type Description
x_train, x_valid : array-like

The input data to be used in identification and validation, respectively.

y_train, y_valid : array-like

The output data to be used in identification and validation, respectively.

Source code in sysidentpy\utils\generate_data.py
 9
 10
 11
 12
@@ -743,7 +744,86 @@
     y_valid = y[split_data::].reshape(-1, 1)
 
     return x_train, x_valid, y_train, y_valid
-

load_model(*, file_name='model', path=None)

This method loads the model from file "file_name.syspy" located at path "path"

Parameters:

Name Type Description Default
file_name

model to be loaded

'model'
path None

Returns:

Name Type Description
model_loaded model loaded, as a variable, containing model and its attributes
Source code in sysidentpy\utils\save_load.py
43
+

Utils methods for NARMAX modeling

set_weights(*, static_function=True, static_gain=True, start=-0.01, stop=-5, num=50, base=2.71)

Set log-spaced weights assigned to each objective in the multi-objective optimization.

Returns:

Name Type Description
weights ndarray of floats

An array containing the weights for each objective.

Notes

This method calculates the weights to be assigned to different objectives in multi-objective optimization. The choice of weights depends on the presence of static function and static gain data. If both are present, a set of weights for dynamic, gain, and static objectives is computed. If either static function or static gain is absent, a simplified set of weights is generated.

Source code in sysidentpy\utils\narmax_tools.py
50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
def set_weights(
+    *,
+    static_function: bool = True,
+    static_gain: bool = True,
+    start: float = -0.01,
+    stop: float = -5,
+    num: int = 50,
+    base: float = 2.71,
+) -> np.ndarray:
+    """
+    Set log-spaced weights assigned to each objective in the multi-objective
+    optimization.
+
+    Returns
+    -------
+    weights : ndarray of floats
+        An array containing the weights for each objective.
+
+    Notes
+    -----
+    This method calculates the weights to be assigned to different objectives in
+    multi-objective optimization. The choice of weights depends on the presence
+    of static function and static gain data. If both are present, a set of weights
+    for dynamic, gain, and static objectives is computed. If either static function
+    or static gain is absent, a simplified set of weights is generated.
+
+    """
+    w1 = np.logspace(start=start, stop=stop, num=num, base=base)
+    if static_function is False or static_gain is False:
+        w2 = 1 - w1
+        return np.vstack([w1, w2])
+
+    w2 = w1[::-1]
+    w1_grid, w2_grid = np.meshgrid(w1, w2)
+    w3_grid = 1 - (w1_grid + w2_grid)
+    mask = w1_grid + w2_grid <= 1
+    dynamic_weight = np.flip(w1_grid[mask])
+    gain_weight = np.flip(w2_grid[mask])
+    static_weight = np.flip(w3_grid[mask])
+    return np.vstack([dynamic_weight, gain_weight, static_weight])
+

load_model(*, file_name='model', path=None)

This method loads the model from file "file_name.syspy" located at path "path"

Parameters:

Name Type Description Default
file_name

model to be loaded

'model'
path
None

Returns:

Name Type Description
model_loaded model loaded, as a variable, containing model and its attributes
Source code in sysidentpy\utils\save_load.py
43
 44
 45
 46
@@ -802,7 +882,7 @@
         model_loaded = pk.load(fp)
 
     return model_loaded
-

save_model(*, model=None, file_name='model', path=None)

This method saves the model "model" in folder "folder" using an extension .syspy

Parameters:

Name Type Description Default
model None
file_name 'model'
path None

Returns:

Type Description
file file_name.syspy located at "path", containing the estimated model.
Source code in sysidentpy\utils\save_load.py
 9
+

save_model(*, model=None, file_name='model', path=None)

This method saves the model "model" in folder "folder" using an extension .syspy

Parameters:

Name Type Description Default
model
None
file_name
'model'
path
None

Returns:

Type Description
file file_name.syspy located at "path", containing the estimated model.
Source code in sysidentpy\utils\save_load.py
 9
 10
 11
 12
diff --git a/docs/events/estatidados/index.html b/docs/events/estatidados/index.html
index c513547..e6de13f 100644
--- a/docs/events/estatidados/index.html
+++ b/docs/events/estatidados/index.html
@@ -1,5 +1,5 @@
 
- Contribute - SysIdentPy        

Nubank Meetup

Estatidados is a big statistic and data science community in Brazil. They host an online meetup that brings together leading researchers and developers from the Statistics and Data science community to join a multiple set of talks covering current trends in the Data Science field.

Wilson Rocha, the maintainer of SysIdentPy, gave a meetup talk about SysIdentPy and the video is available bellow:

Just click in the link above to watch the video.

\ No newline at end of file +

Nubank Meetup

Estatidados is a big statistic and data science community in Brazil. They host an online meetup that brings together leading researchers and developers from the Statistics and Data science community to join a multiple set of talks covering current trends in the Data Science field.

Wilson Rocha, the maintainer of SysIdentPy, gave a meetup talk about SysIdentPy and the video is available bellow:

Just click in the link above to watch the video.

\ No newline at end of file diff --git a/docs/events/events/index.html b/docs/events/events/index.html index aafe39e..346e5ed 100644 --- a/docs/events/events/index.html +++ b/docs/events/events/index.html @@ -1,5 +1,5 @@ - Contribute - SysIdentPy

By the Community, For the Community

Events that gave the opportunity for SysIdentPy community members to share their expertise, new methods/concepts, cool projects, and, more generally, their experiences and inspirations.

\ No newline at end of file +

By the Community, For the Community

Events that gave the opportunity for SysIdentPy community members to share their expertise, new methods/concepts, cool projects, and, more generally, their experiences and inspirations.

\ No newline at end of file diff --git a/docs/events/gcom-meetup/index.html b/docs/events/gcom-meetup/index.html index 6e6d9e0..cf18069 100644 --- a/docs/events/gcom-meetup/index.html +++ b/docs/events/gcom-meetup/index.html @@ -1,5 +1,5 @@ - Contribute - SysIdentPy

GCoM Meetup

GCoM (Control and Modelling Group) is a research group of the Department of Electrical Engineering Federal University of São João del-Rei. GCoM works on two main areas: Analysis and Modelling Systems and Control Systems. They are devoted to undertake knowledge from Electrical Engineering, Mathematics, Computer Science and Physics to build and analyze models that mimics and control real dynamical systems. Some of applications are on robust control of uncertainty systems, Assistive Technology, Hysteresis system identification, Chaotic Dynamics. Recently, a great effort has been undertaken to better understand the play that numerical computation plays at modelling and control of nonlinear dynamical systems.

Wilson Rocha, the maintainer of SysIdentPy, gave a meetup talk about SysIdentPy and the video is available bellow:

Just click in the link above to watch the video.

\ No newline at end of file +

GCoM Meetup

GCoM (Control and Modelling Group) is a research group of the Department of Electrical Engineering Federal University of São João del-Rei. GCoM works on two main areas: Analysis and Modelling Systems and Control Systems. They are devoted to undertake knowledge from Electrical Engineering, Mathematics, Computer Science and Physics to build and analyze models that mimics and control real dynamical systems. Some of applications are on robust control of uncertainty systems, Assistive Technology, Hysteresis system identification, Chaotic Dynamics. Recently, a great effort has been undertaken to better understand the play that numerical computation plays at modelling and control of nonlinear dynamical systems.

Wilson Rocha, the maintainer of SysIdentPy, gave a meetup talk about SysIdentPy and the video is available bellow:

Just click in the link above to watch the video.

\ No newline at end of file diff --git a/docs/events/nubank-meetup-open-source/index.html b/docs/events/nubank-meetup-open-source/index.html index 425957e..990372f 100644 --- a/docs/events/nubank-meetup-open-source/index.html +++ b/docs/events/nubank-meetup-open-source/index.html @@ -1,5 +1,5 @@ - Contribute - SysIdentPy

Nubank Meetup

Nubank is a leading financial technology company in Latin America with more than 54 million clients in Brazil, Mexico and Colombia. They host an online meetup that brings together leading researchers and developers from the Machine Learning (ML) community to join a multiple set of talks covering current trends in ML development.

Wilson Rocha, the maintainer of SysIdentPy, joined Bruno Rocha (software engineer at Red Hat) and Tatyana Zabanova (Data Scientist at Nubank )in a talk about the experience of making a open source package. The video is available bellow:

Just click in the link above to watch the video.

\ No newline at end of file +

Nubank Meetup

Nubank is a leading financial technology company in Latin America with more than 54 million clients in Brazil, Mexico and Colombia. They host an online meetup that brings together leading researchers and developers from the Machine Learning (ML) community to join a multiple set of talks covering current trends in ML development.

Wilson Rocha, the maintainer of SysIdentPy, joined Bruno Rocha (software engineer at Red Hat) and Tatyana Zabanova (Data Scientist at Nubank )in a talk about the experience of making a open source package. The video is available bellow:

Just click in the link above to watch the video.

\ No newline at end of file diff --git a/docs/events/nubank-meetup/index.html b/docs/events/nubank-meetup/index.html index e65a615..2f2b058 100644 --- a/docs/events/nubank-meetup/index.html +++ b/docs/events/nubank-meetup/index.html @@ -1,5 +1,5 @@ - Contribute - SysIdentPy

Nubank Meetup

Nubank is a leading financial technology company in Latin America with more than 54 million clients in Brazil, Mexico and Colombia. They host an online meetup that brings together leading researchers and developers from the Machine Learning (ML) community to join a multiple set of talks covering current trends in ML development.

Wilson Rocha, the maintainer of SysIdentPy, gave a meetup talk about SysIdentPy and the video is available bellow:

Just click in the link above to watch the video.

\ No newline at end of file +

Nubank Meetup

Nubank is a leading financial technology company in Latin America with more than 54 million clients in Brazil, Mexico and Colombia. They host an online meetup that brings together leading researchers and developers from the Machine Learning (ML) community to join a multiple set of talks covering current trends in ML development.

Wilson Rocha, the maintainer of SysIdentPy, gave a meetup talk about SysIdentPy and the video is available bellow:

Just click in the link above to watch the video.

\ No newline at end of file diff --git a/docs/examples/PV_forecasting_benchmark/index.html b/docs/examples/PV_forecasting_benchmark/index.html index 4593d8b..cc1cb7e 100644 --- a/docs/examples/PV_forecasting_benchmark/index.html +++ b/docs/examples/PV_forecasting_benchmark/index.html @@ -1,5 +1,5 @@ - PV forecasting benchmark - SysIdentPy
\ No newline at end of file +
plt.plot(forecast["y"][-104:], "ro-") plt.plot(forecast["yhat1"][-104:], "k*-")
\ No newline at end of file diff --git a/docs/examples/air_passenger_benchmark/index.html b/docs/examples/air_passenger_benchmark/index.html index 192b8a3..66e04ea 100644 --- a/docs/examples/air_passenger_benchmark/index.html +++ b/docs/examples/air_passenger_benchmark/index.html @@ -1,5 +1,5 @@ - Air Passenger benchmark - SysIdentPy
\ No newline at end of file +
plot_results(y=y_test, yhat=yhat, n=1000) ee = compute_residues_autocorrelation(y_test, yhat) plot_residues_correlation(data=ee, title="Residues", ylabel="$e^2$") x1e = compute_cross_correlation(y_test, yhat, x_test) plot_residues_correlation(data=x1e, title="Residues", ylabel="$x_1e$")
\ No newline at end of file diff --git a/docs/examples/basic_steps/index.html b/docs/examples/basic_steps/index.html index 8762b94..af250f6 100644 --- a/docs/examples/basic_steps/index.html +++ b/docs/examples/basic_steps/index.html @@ -1,5 +1,5 @@ - Presenting main functionality - SysIdentPy
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/examples/extended_least_squares/index.html b/docs/examples/extended_least_squares/index.html index 5d354e8..e7fcb73 100644 --- a/docs/examples/extended_least_squares/index.html +++ b/docs/examples/extended_least_squares/index.html @@ -1,5 +1,5 @@ - Extended Least Squares - SysIdentPy
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/examples/f_16_benchmark/index.html b/docs/examples/f_16_benchmark/index.html index 85cf24d..798fb97 100644 --- a/docs/examples/f_16_benchmark/index.html +++ b/docs/examples/f_16_benchmark/index.html @@ -1,5 +1,5 @@ - Example: F-16 Ground Vibration Test benchmark - SysIdentPy
\ No newline at end of file +
xaxis = np.arange(1, model.n_info_values + 1) plt.plot(xaxis, model.info_values) plt.xlabel("n_terms") plt.ylabel("Information Criteria") # You can use the plot below to choose the "n_terms" and run the model again with the most adequate value of terms.
\ No newline at end of file diff --git a/docs/examples/fourier_basis_function/index.html b/docs/examples/fourier_basis_function/index.html index beb0187..833125a 100644 --- a/docs/examples/fourier_basis_function/index.html +++ b/docs/examples/fourier_basis_function/index.html @@ -1,5 +1,5 @@ - Fourier Basis Function - SysIdentPy
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/examples/general_estimators/index.html b/docs/examples/general_estimators/index.html index 84e7705..bbbb8a3 100644 --- a/docs/examples/general_estimators/index.html +++ b/docs/examples/general_estimators/index.html @@ -1,5 +1,5 @@ - Building NARX models using general estimators - SysIdentPy
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/examples/identification_of_an_electromechanical_system/index.html b/docs/examples/identification_of_an_electromechanical_system/index.html index 0dbbd33..10b94d1 100644 --- a/docs/examples/identification_of_an_electromechanical_system/index.html +++ b/docs/examples/identification_of_an_electromechanical_system/index.html @@ -1,5 +1,5 @@ - Identification of an electromechanical system - SysIdentPy
\ No newline at end of file diff --git a/docs/examples/n_steps_ahead_prediction/index.html b/docs/examples/n_steps_ahead_prediction/index.html index 6901564..c27ca3d 100644 --- a/docs/examples/n_steps_ahead_prediction/index.html +++ b/docs/examples/n_steps_ahead_prediction/index.html @@ -1,5 +1,5 @@ - Example: N-steps-ahead prediction - F-16 Ground Vibration Test benchmark - SysIdentPy
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/examples/narx_neural_network/index.html b/docs/examples/narx_neural_network/index.html index 197f1d5..7370b4f 100644 --- a/docs/examples/narx_neural_network/index.html +++ b/docs/examples/narx_neural_network/index.html @@ -1,5 +1,5 @@ - Building NARX Neural Network using Sysidentpy - SysIdentPy
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/examples/parameter_estimation/index.html b/docs/examples/parameter_estimation/index.html index 3b98859..8cde904 100644 --- a/docs/examples/parameter_estimation/index.html +++ b/docs/examples/parameter_estimation/index.html @@ -1,5 +1,5 @@ - Parameter Estimation - SysIdentPy
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/examples/save_and_load_models/index.html b/docs/examples/save_and_load_models/index.html index 419d1ee..725e031 100644 --- a/docs/examples/save_and_load_models/index.html +++ b/docs/examples/save_and_load_models/index.html @@ -1,5 +1,5 @@ - Saving and Loading models using .syspy extension - SysIdentPy
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/examples/simulating_a_predefined_model/index.html b/docs/examples/simulating_a_predefined_model/index.html index 3fbb782..28ae802 100644 --- a/docs/examples/simulating_a_predefined_model/index.html +++ b/docs/examples/simulating_a_predefined_model/index.html @@ -1,5 +1,5 @@ - Simulate a Predefined Model - SysIdentPy
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 7a4ce88..f202e00 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@ - + SysIdentPy - SysIdentPy @@ -899,6 +899,10 @@

Contact Us

  • Parameter Estimation
  • +
  • + Multiobjective Parameter Estimation for NARMAX + models - An Overview
  • Extended Least Squares
  • @@ -1080,6 +1084,9 @@

    Contact Us

  • Parameter Estimation
  • +
  • Multiobjective + Parameter Estimation
  • Simulation
  • diff --git a/docs/landing-page/about-us/index.html b/docs/landing-page/about-us/index.html index b2805c8..bae58a8 100644 --- a/docs/landing-page/about-us/index.html +++ b/docs/landing-page/about-us/index.html @@ -1,5 +1,5 @@ - About Us - SysIdentPy

    Project History

    The project was started by Wilson R. L. Junior, Luan Pascoal and Samir A. M. Martins as a project for System Identification discipline. We have been working with System Identification for several years (Nonlinear Systems, Machine Learning, Chaotic Systems, Hysteretic models, etc) for several years.


    Every work we did was using a great tool, but a paid one: Matlab. We started looking for some free alternatives to build NARMAX and its variants (AR, ARX, ARMAX, NAR, NARX, NFIR, Neural NARX, etc.) models using the methods known in System Identification community, but we didn't find any package written in Python with the features we needed to keep doing our research.

    Besides, it was always too difficult to find source code of the papers working with NARMAX models and reproduce results was a really hard thing to do.


    In that context, SysIdentPy was idealized with the following goal: be a free and open source package to help the community design NARMAX models. More than that, be a free and robust alternative to one of the most used tools to build NARMAX models, which is the Matlab's System Identification Toolbox.


    Samuel joined early in 2019 to help us achieve our goal.


    Active Maintainers

    The project is actively maintained by Wilson Rocha Lacerda Junior and looking for contributors.

    Citation

    If you use SysIdentPy on your project, please drop me a line.

    Send email

    If you use SysIdentPy on your scientific publication, we would appreciate citations to the following paper:

    Lacerda et al., (2020). SysIdentPy: A Python package for System Identification using NARMAX models. Journal of Open Source Software, 5(54), 2384, https://doi.org/10.21105/joss.02384

        @article{Lacerda2020,
    +                        

    Project History

    The project was started by Wilson R. L. Junior, Luan Pascoal and Samir A. M. Martins as a project for System Identification discipline. We have been working with System Identification for several years (Nonlinear Systems, Machine Learning, Chaotic Systems, Hysteretic models, etc) for several years.


    Every work we did was using a great tool, but a paid one: Matlab. We started looking for some free alternatives to build NARMAX and its variants (AR, ARX, ARMAX, NAR, NARX, NFIR, Neural NARX, etc.) models using the methods known in System Identification community, but we didn't find any package written in Python with the features we needed to keep doing our research.

    Besides, it was always too difficult to find source code of the papers working with NARMAX models and reproduce results was a really hard thing to do.


    In that context, SysIdentPy was idealized with the following goal: be a free and open source package to help the community design NARMAX models. More than that, be a free and robust alternative to one of the most used tools to build NARMAX models, which is the Matlab's System Identification Toolbox.


    Samuel joined early in 2019 to help us achieve our goal.


    Active Maintainers

    The project is actively maintained by Wilson Rocha Lacerda Junior and looking for contributors.

    Citation

    If you use SysIdentPy on your project, please drop me a line.

    Send email

    If you use SysIdentPy on your scientific publication, we would appreciate citations to the following paper:

    Lacerda et al., (2020). SysIdentPy: A Python package for System Identification using NARMAX models. Journal of Open Source Software, 5(54), 2384, https://doi.org/10.21105/joss.02384

        @article{Lacerda2020,
           doi = {10.21105/joss.02384},
           url = {https://doi.org/10.21105/joss.02384},
           year = {2020},
    diff --git a/docs/landing-page/attribute/index.html b/docs/landing-page/attribute/index.html
    index 7f48f1e..af5ef0a 100644
    --- a/docs/landing-page/attribute/index.html
    +++ b/docs/landing-page/attribute/index.html
    @@ -1,5 +1,5 @@
     
    - Attribute - SysIdentPy      
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/landing-page/basic-usage/index.html b/docs/landing-page/basic-usage/index.html index 53c5a98..4055b8f 100644 --- a/docs/landing-page/basic-usage/index.html +++ b/docs/landing-page/basic-usage/index.html @@ -1,5 +1,5 @@ - Basic Usage - SysIdentPy

    Basic Usage

    The NARMAX model is described as:

    \[ y_k= F[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

    where \(n_y\in \mathbb{N}\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}\) is some nonlinear function of the input and output regressors and \(d\) is a time delay typically set to \(d=1\).

    import numpy as np
    +                        

    Basic Usage

    The NARMAX model is described as:

    \[ y_k= F[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

    where \(n_y\in \mathbb{N}\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\), are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}\) is some nonlinear function of the input and output regressors and \(d\) is a time delay typically set to \(d=1\).

    import numpy as np
     import pandas as pd
     import matplotlib.pyplot as plt
     from sysidentpy.metrics import mean_squared_error
    diff --git a/docs/landing-page/ch0-narmax-intro/index.html b/docs/landing-page/ch0-narmax-intro/index.html
    index 1908ee3..56ace0b 100644
    --- a/docs/landing-page/ch0-narmax-intro/index.html
    +++ b/docs/landing-page/ch0-narmax-intro/index.html
    @@ -1,5 +1,5 @@
     
    - Introduction to NARMAX Models - SysIdentPy        

    Introduction

    Author: Wilson Rocha Lacerda Junior

    This is the first in a series of publications explaining a little bit about NARMAX1 models. I hope the content of these publications will help those who use or would like to use the SysIdentPy library.

    System Identification

    As I will use the term Systems Identification here and there, let me make a brief definition regarding these terms.


    Systems identification is one of the major areas that deals with the modeling of data-based processes. In this context, the term "system" can be interpreted as any set of operations that process one or more inputs and return one or more outputs. Examples include electrical systems, mechanical systems, biological systems, financial systems, chemical systems … literally anything you can relate to input and output data. The electricity demand is part of a system whose inputs can be, for example, quantity of the population, quantity of water in the reservoirs, season, events. The price of a property is the output of a system whose entries can be the city, per capita income, neighborhood, number of rooms, how old the house is, and many others. You got the idea.


    Although there are many things related with Machine Learning, Statistical Learning and other fields, each field has its particularities.

    So, what is a NARMAX model?

    You may have noticed the similarity between the acronym NARMAX with the well-known models ARX, ARMAX, etc., which are widely used for forecasting time series. And this resemblance is not by chance. The Autoregressive models with Moving Average and Exogenous Input (ARMAX) and their variations AR, ARX, ARMA (to name just a few) are one of the most used mathematical representations for identifying linear systems.


    Let's go back to the model. I said that the ARX family of models is commonly used to model linear systems. Linear is the key word here. For nonlinear scenarios we have the NARMAX class. As reported by Billings (one of the creators of NARMAX model) in the book Nonlinear System Identification: NARMAX Methods in the Time, Frequency, and Spatio-Temporal Domains, NARMAX started out as a model name, but soon became a philosophy when it comes to identifying nonlinear systems. Obtaining NARMAX models consists of performing the following steps:

    • Dynamical tests and collecting data;
    • Choice of mathematical representation;
    • Detection of the model structure;
    • Estimation of parameters;
    • Validation;
    • Analysis of the model.

    We will cover each of these steps in further publications. The idea of this text is to present an overview of NARMAX models.


    NARMAX models are not, however, a simple extension of ARMAX models. NARMAX models are able to represent the most different and complex nonlinear systems. Introduced in 1981 by the Electrical Engineer Stephen A. Billings, NARMAX models can be described as:

    \[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

    where \(n_y\in \mathbb{N}\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\) , are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

    If we do not include noise terms, \(e_{k-n_e}\), we have NARX models. If we set \(\ell = 1\) then we deal with ARMAX models; if \(\ell = 1\) and we do not include input and noise terms, it turns to AR model (ARX if we include inputs, ARMA if we include noise terms instead); if \(\ell>1\) and there is no input terms, we have the NARMA. If there is no input or noise terms, we have NAR. There are several variants, but that is sufficient for now.

    NARMAX Representation

    There are several nonlinear functions representations to approximate the unknown mapping \(\mathrm{f}[\cdot]\) in the NARMAX methods, e.g.,

    • neural networks;
    • fuzzy logic-based models;
    • radial basis functions;
    • wavelet basis;
    • polynomial basis;
    • generalized additive models;

    The remainder of this post contemplates methods related to the power-form polynomial models, which is the most common used representation. Polynomial NARMAX is a mathematical model based on difference equations and relates the current output as a function of past inputs and outputs.

    Polynomial NARMAX

    The polynomial NARMAX model with asymptotically stable equilibrium points can be described as:

    \[\begin{align} y_k =& \sum_{0} + \sum_{i=1}^{p}\Theta_{y}^{i}y_{k-i} + \sum_{j=1}^{q}\Theta_{e}^{j}e_{k-j} + \sum_{m=1}^{r}\Theta_{x}^{m}x_{k-m}\\ &+ \sum_{i=1}^{p}\sum_{j=1}^{q}\Theta_{ye}^{ij}y_{k-i} e_{k-j} + \sum_{i=1}^{p}\sum_{m=1}^{r}\Theta_{yx}^{im}y_{k-i} x_{k-m} \\ &+ \sum_{j=1}^{q}\sum_{m=1}^{r}\Theta_{e x}^{jm}e_{k-j} x_{k-m} \\ &+ \sum_{i=1}^{p}\sum_{j=1}^{q}\sum_{m=1}^{r}\Theta_{y e x}^{ijm}y_{k-i} e_{k-j} x_{k-m} \\ &+ \sum_{m_1=1}^{r} \sum_{m_2=m_1}^{r}\Theta_{x^2}^{m_1 m_2} x_{k-m_1} x_{k-m_2} \dotsc \\ &+ \sum_{m_1=1}^{r} \dotsc \sum_{m_l=m_{l-1}}^{r} \Theta_{x^l}^{m_1, \dotsc, m_2} x_{k-m_1} x_{k-m_l} \end{align}\]

    where \(\sum\nolimits_{0}\), \(c_{y}^{i}\), \(c_{e}^{j}\), \(c_{x}^{m}\), \(c_{y\e}^{ij}\), \(c_{yx}^{im}\), \(c_{e x}^{jm}\), \(c_{y e x}^{ijm}\), \(c_{x^2}^{m_1 m_2} \dotsc c_{x^l}^{m_1, \dotsc, ml}\) are constant parameters.


    Let's take a look at an example of a NARMAX model for an easy understanding. The following is a NARMAX model of degree~\(2\), identified from experimental data of a DC motor/generator with no prior knowledge of the model form. If you want more information about the identification process, I wrote a paper comparing a polynomial NARMAX with a neural NARX model using that data (IN PORTUGUESE: Identificação de um motor/gerador CC por meio de modelos polinomiais autorregressivos e redes neurais artificiais)

    \[\begin{align} y_k =& 1.7813y_{k-1}-0,7962y_{k-2}+0,0339x_{k-1} -0,1597x_{k-1} y_{k-1} +0,0338x_{k-2} \\ & + 0,1297x_{k-1}y_{k-2} - 0,1396x_{k-2}y_{k-1}+ 0,1086x_{k-2}y_{k-2}+0,0085y_{k-2}^2 + 0.1938e_{k-1}e_{k-2} \end{align}\]

    But how those terms were selected? How the parameters were estimated? These questions will lead us to model structure selection and parameter estimation topics, but, for now, let us discuss about those topics in a more simple manner.


    First, the "structure" of a model is the set of terms (also called regressors) included in the final model. The parameters are the values multiplying each of theses terms. And looking at the example above we can notice an really important thing regarding polynomial NARMAX models dealt in this text: they have a non-linear structure, but they are linear-in-the-parameters. You will see how this note is important in the post about parameter estimation.


    In this respect, consider the case where we have the input and output data of some system. For the sake of simplicity, suppose one input and one output. We have the data, but we do not know which lags to choose for the input or the output. Also, we know nothing about the system non-linearity. So, we have to define some values for maximum lags of the input, output and the noise terms, besides the choice of the \(\ell\) value. It's worth to notice that many assumptions taken for linear cases are not valid in the nonlinear scenario and therefore select the maximum lags is not straightforward. So, how those values can make the modeling harder?


    So we have one input and one output (disregard the noise terms for now). What if we choose the \(n_y = n_x = \ell = 2\)? With these values, we have the following possibilities for compose the final model:

    \[\begin{align} & constant, y_{k-1}, y_{k-2}, y_{k-1}^2, y_{k-2}^2, x_{k-1}, x_{k-2}, x_{k-1}^2, x_{k-2}^2,y_{k-1}y_{k-2},\\ & y_{k-1}x_{k-1}, y_{k-1}x_{k-2}, y_{k-2}x_{k-1}, y_{k-2}x_{k-2}, x_{k-1}x_{k-2} . \end{align}\]

    So we have \(15\) candidate terms to compose the final model.


    Again, we do not know how of those terms are significant to compose the model. One should decide to use all the terms because there are only \(15\). This, even in a simple scenario like this, can lead to a very wrong representation of the system that you are trying to modeling. Ok, what if we run a brute force algorithm to test the candidate regressors so we can select only the significant ones? In this case, we have \(2^{15} = 32768\) possible model structures to be tested.


    You can think that it is ok, we have computer power for that. But this case is very simple and the system might have lags equal to \(10\) for input and output. If we define \(n_y = n_x = 10\) and \(\ell=2\), the number of possible models to be tested increases to \(2^{231}=3.4508732\times10^{69}\). If the non-linearity is set to \(3\) then we have \(2^{1771} = 1.3308291989700907535925992... \times 10^{533}\) candidate models.


    Now, think about the case when we have not 1, but 5, 10 or more inputs... and have to include terms for the noise, and maximum lags are higher than 10... and nonlinearity is higher than 3...


    And the problem is not solved by only identifying the most significant terms. How do you choose the number of terms to include in the final model. It is not just about check the relevance of each regressor, we have to think about the impact of including \(5\), \(10\) or \(50\) regressors in the model. And do not forget: after selecting the terms, we have to estimate its parameters.


    As you can see, to select the most significant terms from a huge dictionary of possible terms is not an easy task. And it is hard not only because the complex combinatorial problem and the uncertainty concerning the model order. Identifying the most significant terms in a nonlinear scenario is very difficult because depends on the type of the non-linearity (sparse singularity or near-singular behavior, memory or dumping effects and many others), dynamical response (spatial-temporal systems, time-dependent), the steady-state response, frequency of the data, the noise...


    Despite all this complexity, NARMAX models are widely used because it is able to represent complex system with simple and transparent models, which terms are selected using robust algorithms for model structure selection. Model structure selection is the core of NARMAX methods and the scientific community is very active on improving classical methods and developing new ones. As I said, I will introduce some of those methods in another post.


    I hope this publication served as a brief introduction to NARMAX models. Furthermore, I hope I have sparked your interest in this model class. The link to the other texts will be made available soon, but feel free to contact us if you are interested in collaborating with the SysIdentPy library or if you want to address any questions.


    1. Non-linear Autoregressive Models with Moving Average and Exogenous Input. 

    \ No newline at end of file +

    Introduction

    Author: Wilson Rocha Lacerda Junior

    This is the first in a series of publications explaining a little bit about NARMAX1 models. I hope the content of these publications will help those who use or would like to use the SysIdentPy library.

    System Identification

    As I will use the term Systems Identification here and there, let me make a brief definition regarding these terms.


    Systems identification is one of the major areas that deals with the modeling of data-based processes. In this context, the term "system" can be interpreted as any set of operations that process one or more inputs and return one or more outputs. Examples include electrical systems, mechanical systems, biological systems, financial systems, chemical systems … literally anything you can relate to input and output data. The electricity demand is part of a system whose inputs can be, for example, quantity of the population, quantity of water in the reservoirs, season, events. The price of a property is the output of a system whose entries can be the city, per capita income, neighborhood, number of rooms, how old the house is, and many others. You got the idea.


    Although there are many things related with Machine Learning, Statistical Learning and other fields, each field has its particularities.

    So, what is a NARMAX model?

    You may have noticed the similarity between the acronym NARMAX with the well-known models ARX, ARMAX, etc., which are widely used for forecasting time series. And this resemblance is not by chance. The Autoregressive models with Moving Average and Exogenous Input (ARMAX) and their variations AR, ARX, ARMA (to name just a few) are one of the most used mathematical representations for identifying linear systems.


    Let's go back to the model. I said that the ARX family of models is commonly used to model linear systems. Linear is the key word here. For nonlinear scenarios we have the NARMAX class. As reported by Billings (one of the creators of NARMAX model) in the book Nonlinear System Identification: NARMAX Methods in the Time, Frequency, and Spatio-Temporal Domains, NARMAX started out as a model name, but soon became a philosophy when it comes to identifying nonlinear systems. Obtaining NARMAX models consists of performing the following steps:

    • Dynamical tests and collecting data;
    • Choice of mathematical representation;
    • Detection of the model structure;
    • Estimation of parameters;
    • Validation;
    • Analysis of the model.

    We will cover each of these steps in further publications. The idea of this text is to present an overview of NARMAX models.


    NARMAX models are not, however, a simple extension of ARMAX models. NARMAX models are able to represent the most different and complex nonlinear systems. Introduced in 1981 by the Electrical Engineer Stephen A. Billings, NARMAX models can be described as:

    \[ y_k= F^\ell[y_{k-1}, \dotsc, y_{k-n_y},x_{k-d}, x_{k-d-1}, \dotsc, x_{k-d-n_x}, e_{k-1}, \dotsc, e_{k-n_e}] + e_k \]

    where \(n_y\in \mathbb{N}\), \(n_x \in \mathbb{N}\), \(n_e \in \mathbb{N}\) , are the maximum lags for the system output and input respectively; \(x_k \in \mathbb{R}^{n_x}\) is the system input and \(y_k \in \mathbb{R}^{n_y}\) is the system output at discrete time \(k \in \mathbb{N}^n\); \(e_k \in \mathbb{R}^{n_e}\) stands for uncertainties and possible noise at discrete time \(k\). In this case, \(\mathcal{F}^\ell\) is some nonlinear function of the input and output regressors with nonlinearity degree \(\ell \in \mathbb{N}\) and \(d\) is a time delay typically set to \(d=1\).

    If we do not include noise terms, \(e_{k-n_e}\), we have NARX models. If we set \(\ell = 1\) then we deal with ARMAX models; if \(\ell = 1\) and we do not include input and noise terms, it turns to AR model (ARX if we include inputs, ARMA if we include noise terms instead); if \(\ell>1\) and there is no input terms, we have the NARMA. If there is no input or noise terms, we have NAR. There are several variants, but that is sufficient for now.

    NARMAX Representation

    There are several nonlinear functions representations to approximate the unknown mapping \(\mathrm{f}[\cdot]\) in the NARMAX methods, e.g.,

    • neural networks;
    • fuzzy logic-based models;
    • radial basis functions;
    • wavelet basis;
    • polynomial basis;
    • generalized additive models;

    The remainder of this post contemplates methods related to the power-form polynomial models, which is the most common used representation. Polynomial NARMAX is a mathematical model based on difference equations and relates the current output as a function of past inputs and outputs.

    Polynomial NARMAX

    The polynomial NARMAX model with asymptotically stable equilibrium points can be described as:

    \[\begin{align} y_k =& \sum_{0} + \sum_{i=1}^{p}\Theta_{y}^{i}y_{k-i} + \sum_{j=1}^{q}\Theta_{e}^{j}e_{k-j} + \sum_{m=1}^{r}\Theta_{x}^{m}x_{k-m}\\ &+ \sum_{i=1}^{p}\sum_{j=1}^{q}\Theta_{ye}^{ij}y_{k-i} e_{k-j} + \sum_{i=1}^{p}\sum_{m=1}^{r}\Theta_{yx}^{im}y_{k-i} x_{k-m} \\ &+ \sum_{j=1}^{q}\sum_{m=1}^{r}\Theta_{e x}^{jm}e_{k-j} x_{k-m} \\ &+ \sum_{i=1}^{p}\sum_{j=1}^{q}\sum_{m=1}^{r}\Theta_{y e x}^{ijm}y_{k-i} e_{k-j} x_{k-m} \\ &+ \sum_{m_1=1}^{r} \sum_{m_2=m_1}^{r}\Theta_{x^2}^{m_1 m_2} x_{k-m_1} x_{k-m_2} \dotsc \\ &+ \sum_{m_1=1}^{r} \dotsc \sum_{m_l=m_{l-1}}^{r} \Theta_{x^l}^{m_1, \dotsc, m_2} x_{k-m_1} x_{k-m_l} \end{align}\]

    where \(\sum\nolimits_{0}\), \(c_{y}^{i}\), \(c_{e}^{j}\), \(c_{x}^{m}\), \(c_{y\e}^{ij}\), \(c_{yx}^{im}\), \(c_{e x}^{jm}\), \(c_{y e x}^{ijm}\), \(c_{x^2}^{m_1 m_2} \dotsc c_{x^l}^{m_1, \dotsc, ml}\) are constant parameters.


    Let's take a look at an example of a NARMAX model for an easy understanding. The following is a NARMAX model of degree~\(2\), identified from experimental data of a DC motor/generator with no prior knowledge of the model form. If you want more information about the identification process, I wrote a paper comparing a polynomial NARMAX with a neural NARX model using that data (IN PORTUGUESE: Identificação de um motor/gerador CC por meio de modelos polinomiais autorregressivos e redes neurais artificiais)

    \[\begin{align} y_k =& 1.7813y_{k-1}-0,7962y_{k-2}+0,0339x_{k-1} -0,1597x_{k-1} y_{k-1} +0,0338x_{k-2} \\ & + 0,1297x_{k-1}y_{k-2} - 0,1396x_{k-2}y_{k-1}+ 0,1086x_{k-2}y_{k-2}+0,0085y_{k-2}^2 + 0.1938e_{k-1}e_{k-2} \end{align}\]

    But how those terms were selected? How the parameters were estimated? These questions will lead us to model structure selection and parameter estimation topics, but, for now, let us discuss about those topics in a more simple manner.


    First, the "structure" of a model is the set of terms (also called regressors) included in the final model. The parameters are the values multiplying each of theses terms. And looking at the example above we can notice an really important thing regarding polynomial NARMAX models dealt in this text: they have a non-linear structure, but they are linear-in-the-parameters. You will see how this note is important in the post about parameter estimation.


    In this respect, consider the case where we have the input and output data of some system. For the sake of simplicity, suppose one input and one output. We have the data, but we do not know which lags to choose for the input or the output. Also, we know nothing about the system non-linearity. So, we have to define some values for maximum lags of the input, output and the noise terms, besides the choice of the \(\ell\) value. It's worth to notice that many assumptions taken for linear cases are not valid in the nonlinear scenario and therefore select the maximum lags is not straightforward. So, how those values can make the modeling harder?


    So we have one input and one output (disregard the noise terms for now). What if we choose the \(n_y = n_x = \ell = 2\)? With these values, we have the following possibilities for compose the final model:

    \[\begin{align} & constant, y_{k-1}, y_{k-2}, y_{k-1}^2, y_{k-2}^2, x_{k-1}, x_{k-2}, x_{k-1}^2, x_{k-2}^2,y_{k-1}y_{k-2},\\ & y_{k-1}x_{k-1}, y_{k-1}x_{k-2}, y_{k-2}x_{k-1}, y_{k-2}x_{k-2}, x_{k-1}x_{k-2} . \end{align}\]

    So we have \(15\) candidate terms to compose the final model.


    Again, we do not know how of those terms are significant to compose the model. One should decide to use all the terms because there are only \(15\). This, even in a simple scenario like this, can lead to a very wrong representation of the system that you are trying to modeling. Ok, what if we run a brute force algorithm to test the candidate regressors so we can select only the significant ones? In this case, we have \(2^{15} = 32768\) possible model structures to be tested.


    You can think that it is ok, we have computer power for that. But this case is very simple and the system might have lags equal to \(10\) for input and output. If we define \(n_y = n_x = 10\) and \(\ell=2\), the number of possible models to be tested increases to \(2^{231}=3.4508732\times10^{69}\). If the non-linearity is set to \(3\) then we have \(2^{1771} = 1.3308291989700907535925992... \times 10^{533}\) candidate models.


    Now, think about the case when we have not 1, but 5, 10 or more inputs... and have to include terms for the noise, and maximum lags are higher than 10... and nonlinearity is higher than 3...


    And the problem is not solved by only identifying the most significant terms. How do you choose the number of terms to include in the final model. It is not just about check the relevance of each regressor, we have to think about the impact of including \(5\), \(10\) or \(50\) regressors in the model. And do not forget: after selecting the terms, we have to estimate its parameters.


    As you can see, to select the most significant terms from a huge dictionary of possible terms is not an easy task. And it is hard not only because the complex combinatorial problem and the uncertainty concerning the model order. Identifying the most significant terms in a nonlinear scenario is very difficult because depends on the type of the non-linearity (sparse singularity or near-singular behavior, memory or dumping effects and many others), dynamical response (spatial-temporal systems, time-dependent), the steady-state response, frequency of the data, the noise...


    Despite all this complexity, NARMAX models are widely used because it is able to represent complex system with simple and transparent models, which terms are selected using robust algorithms for model structure selection. Model structure selection is the core of NARMAX methods and the scientific community is very active on improving classical methods and developing new ones. As I said, I will introduce some of those methods in another post.


    I hope this publication served as a brief introduction to NARMAX models. Furthermore, I hope I have sparked your interest in this model class. The link to the other texts will be made available soon, but feel free to contact us if you are interested in collaborating with the SysIdentPy library or if you want to address any questions.


    1. Non-linear Autoregressive Models with Moving Average and Exogenous Input. 

    \ No newline at end of file diff --git a/docs/landing-page/contribute/index.html b/docs/landing-page/contribute/index.html index be01fff..3118f9a 100644 --- a/docs/landing-page/contribute/index.html +++ b/docs/landing-page/contribute/index.html @@ -1,5 +1,5 @@ - Contribute - SysIdentPy

    Contributing

    SysIdentPy is intended to be a community project, hence all contributions are welcome! There exist many possible use cases in System Identification field and we can not test all scenarios without your help! If you find any bugs or have suggestions, please report them on issue tracker on GitHub.

    We welcome new contributors of all experience levels. The SysIdentPy community goals are to be helpful, welcoming, and effective.

    Help others with issues in GitHub

    You can see existing issues and try and help others, most of the times they are questions that you might already know the answer for.

    Watch the GitHub repository

    You can watch SysIdentPy in GitHub (clicking the "watch" button at the top right):

    If you select "Watching" instead of "Releases only" you will receive notifications when someone creates a new issue.

    Then you can try and help them solve those issues.

    Documentation

    Documentation is as important as the library itself. English is not the primary language of the main authors, so if you find any typo or anything wrong do not hesitate to point out to us.

    Create a Pull Request

    You can contribute to the source code with Pull Requests, for example:

    • To fix a typo you found on the documentation.
    • To share an article, video, or podcast you created or found about SysIdentPy.
    • To propose new documentation sections.
    • To fix an existing issue/bug.
    • To add a new feature.

    Development environment

    These are some basic steps to help us with code:

    • Install and Setup Git on your computer.
    • Fork SysIdentPy.
    • Clone the fork on your local machine.
    • Create a new branch.
    • Make changes following the coding style of the project (or suggesting improvements).
    • Run the tests.
    • Write and/or adapt existing test if needed.
    • Add documentation if needed.
    • Commit.
    • Push to your fork.
    • Open a pull_request.

    Environment

    Clone the repository using

    git clone https://github.com/wilsonrljr/sysidentpy.git
    +                        

    Contributing

    SysIdentPy is intended to be a community project, hence all contributions are welcome! There exist many possible use cases in System Identification field and we can not test all scenarios without your help! If you find any bugs or have suggestions, please report them on issue tracker on GitHub.

    We welcome new contributors of all experience levels. The SysIdentPy community goals are to be helpful, welcoming, and effective.

    Help others with issues in GitHub

    You can see existing issues and try and help others, most of the times they are questions that you might already know the answer for.

    Watch the GitHub repository

    You can watch SysIdentPy in GitHub (clicking the "watch" button at the top right):

    If you select "Watching" instead of "Releases only" you will receive notifications when someone creates a new issue.

    Then you can try and help them solve those issues.

    Documentation

    Documentation is as important as the library itself. English is not the primary language of the main authors, so if you find any typo or anything wrong do not hesitate to point out to us.

    Create a Pull Request

    You can contribute to the source code with Pull Requests, for example:

    • To fix a typo you found on the documentation.
    • To share an article, video, or podcast you created or found about SysIdentPy.
    • To propose new documentation sections.
    • To fix an existing issue/bug.
    • To add a new feature.

    Development environment

    These are some basic steps to help us with code:

    • Install and Setup Git on your computer.
    • Fork SysIdentPy.
    • Clone the fork on your local machine.
    • Create a new branch.
    • Make changes following the coding style of the project (or suggesting improvements).
    • Run the tests.
    • Write and/or adapt existing test if needed.
    • Add documentation if needed.
    • Commit.
    • Push to your fork.
    • Open a pull_request.

    Environment

    Clone the repository using

    git clone https://github.com/wilsonrljr/sysidentpy.git
     

    If you already cloned the repository and you know that you need to deep dive in the code, here are some guidelines to set up your environment.

    Virtual environment with venv

    You can create a virtual environment in a directory using Python's venv module or Conda:

    $ python -m venv env
     
    conda create -n env
     

    That will create a directory ./env/ with the Python binaries and then you will be able to install packages for that isolated environment.

    Activate the environment

    If you created the environment using Python's venv module, activate it with:

    source ./env/bin/activate
    diff --git a/docs/landing-page/get-help/index.html b/docs/landing-page/get-help/index.html
    index afbac10..38ad56f 100644
    --- a/docs/landing-page/get-help/index.html
    +++ b/docs/landing-page/get-help/index.html
    @@ -1,5 +1,5 @@
     
    - Get Help - SysIdentPy        

    Get Help

    Before asking others for help, it’s generally a good idea for you to try to help yourself. SysIdentPy includes several examples in the documentation with tips and notes about the package that might help you. However, if you have any issues and you can't find the answer, reach out using any method described below.

    Connect with the author

    You can:

    Create issues

    You can create a new issue in the GitHub repository, for example to:

    • Ask a question or ask about a problem.
    • Suggest a new feature.

    Join the chat

    Join the 👥 Discord chat server 👥 and hang out with others in the SysIdentPy community.

    You can use the chat for anything

    Have in mind that you can use the chat to talk about anything related to SysIdentPy. Conversations about system identification, dynamical systems, new papers, issues, new features are allowed, but have in mind that if some of the questions could help other users, I'll kindly ask you to open an discussion or an issue on Github as well.

    I can make sure I always answer everything, even if it takes some time.

    \ No newline at end of file +

    Get Help

    Before asking others for help, it’s generally a good idea for you to try to help yourself. SysIdentPy includes several examples in the documentation with tips and notes about the package that might help you. However, if you have any issues and you can't find the answer, reach out using any method described below.

    Connect with the author

    You can:

    Create issues

    You can create a new issue in the GitHub repository, for example to:

    • Ask a question or ask about a problem.
    • Suggest a new feature.

    Join the chat

    Join the 👥 Discord chat server 👥 and hang out with others in the SysIdentPy community.

    You can use the chat for anything

    Have in mind that you can use the chat to talk about anything related to SysIdentPy. Conversations about system identification, dynamical systems, new papers, issues, new features are allowed, but have in mind that if some of the questions could help other users, I'll kindly ask you to open an discussion or an issue on Github as well.

    I can make sure I always answer everything, even if it takes some time.

    \ No newline at end of file diff --git a/docs/landing-page/getting-started/index.html b/docs/landing-page/getting-started/index.html index 17cb430..23e8792 100644 --- a/docs/landing-page/getting-started/index.html +++ b/docs/landing-page/getting-started/index.html @@ -1,5 +1,5 @@ - Getting Started - SysIdentPy

    Getting Started

    SysIdentPy is a Python module for System Identification using NARMAX models built on top of numpy and is distributed under the 3-Clause BSD license.

    Do you like SysIdentPy?

    Would you like to help SysIdentPy, other users, and the author? You can "star" SysIdentPy in GitHub by clicking in the star button at the top right of the page: https://github.com/wilsonrljr/sysidentpy. ⭐️

    Starring a repository makes it easy to find it later and help you to find similar projects on GitHub based on Github recommendation contents. Besides, by starring a repository also shows appreciation to the SysIdentPy maintainer for their work.

      Join our "Star" in github

    Requirements

    SysIdentPy requires:

    Dependency version Comment
    python >=3.7,<3.10
    numpy >=1.9.2 for all numerical algorithms
    scipy >=1.7.0 for some linear regression methods
    matplotlib >=3.3.2 for static plotting and visualizations
    torch >=1.7.1 Only necessary if you want to use Neural NARX models
    Platform Status
    Windows ok
    Linux ok
    Mac OS ok

    SysIdentPy do not to support Python 2.7.

    A few examples require pandas >= 0.18.0. However, it is not required to use SysIdentPy.

    Installation

    with pip recommended

    SysIdentPy is published as a Python package and can be installed with pip, ideally by using a virtual environment. If not, scroll down and expand the help box. Install with:

    pip install sysidentpy
    +                        

    Getting Started

    SysIdentPy is a Python module for System Identification using NARMAX models built on top of numpy and is distributed under the 3-Clause BSD license.

    Do you like SysIdentPy?

    Would you like to help SysIdentPy, other users, and the author? You can "star" SysIdentPy in GitHub by clicking in the star button at the top right of the page: https://github.com/wilsonrljr/sysidentpy. ⭐️

    Starring a repository makes it easy to find it later and help you to find similar projects on GitHub based on Github recommendation contents. Besides, by starring a repository also shows appreciation to the SysIdentPy maintainer for their work.

      Join our "Star" in github

    Requirements

    SysIdentPy requires:

    Dependency version Comment
    python >=3.7,<3.10
    numpy >=1.9.2 for all numerical algorithms
    scipy >=1.7.0 for some linear regression methods
    matplotlib >=3.3.2 for static plotting and visualizations
    torch >=1.7.1 Only necessary if you want to use Neural NARX models
    Platform Status
    Windows ok
    Linux ok
    Mac OS ok

    SysIdentPy do not to support Python 2.7.

    A few examples require pandas >= 0.18.0. However, it is not required to use SysIdentPy.

    Installation

    with pip recommended

    SysIdentPy is published as a Python package and can be installed with pip, ideally by using a virtual environment. If not, scroll down and expand the help box. Install with:

    pip install sysidentpy
     
    pip install sysidentpy["all"]
     
    pip install sysidentpy=="0.1.6"
     

    How to manage my projects dependencies?

    If you don't have prior experience with Python, we recommend reading Using Python's pip to Manage Your Projects' Dependencies, which is a really good introduction on the mechanics of Python package management and helps you troubleshoot if you run into errors.

    with git

    SysIdentPy can be used directly from GitHub by cloning the repository into a subfolder of your project root which might be useful if you want to use the very latest version:

    git clone https://github.com/wilsonrljr/sysidentpy.git
    diff --git a/docs/landing-page/license/index.html b/docs/landing-page/license/index.html
    index b2f4300..94b6fae 100644
    --- a/docs/landing-page/license/index.html
    +++ b/docs/landing-page/license/index.html
    @@ -1,5 +1,5 @@
     
    - License - SysIdentPy        

    License

    BSD 3-Clause License

    Copyright © 2019, Wilson Rocha; Luan Pascoal; Samuel Oliveira; Samir Martins All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    • Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    \ No newline at end of file +

    License

    BSD 3-Clause License

    Copyright © 2019, Wilson Rocha; Luan Pascoal; Samuel Oliveira; Samir Martins All rights reserved.

    Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

    • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

    • Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    \ No newline at end of file diff --git a/docs/landing-page/sponsor/index.html b/docs/landing-page/sponsor/index.html index 2f6f113..5f8dee3 100644 --- a/docs/landing-page/sponsor/index.html +++ b/docs/landing-page/sponsor/index.html @@ -1,5 +1,5 @@ - Sponsors - SysIdentPy

    Sponsors

    As a free and open source project, SysIdentPy relies on the support of the community for its development. If you work for an organization that uses and benefits from SysIdentPy, please consider supporting us.

    SysIdentPy does not follow the sponsorware release strategy, which means that all features are released to the public at the same time. SysIdentPy is a community driven project, however sponsorships will help to assure its sustainability.

    The main goal of sponsorships it to make this project sustainable. Your donation goes to support a variety of services and development as they buy the maintainers of this project time to work on the development of new features, bug fixing, stability improvement, issue triage and general support.

    Read on to learn how to become a sponsor!

    Sponsorships

    Every donation counts and would be greatly appreciated!

    Sponsorships start as low as $1 a month.1

    How to become a sponsor

    Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit wilsonrljr's sponsor profile, and complete a sponsorship of $1 a month or more. You can use your individual or organization GitHub account for sponsoring.

      Join our awesome sponsors


    Special thanks to our sponsors:

    🏅 Gold Sponsors

    Technium

    Individual Sponsors

    Nath Keles


    Goals

    The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is already available or planned, but not yet implemented. When the funding goal is hit, the features are released for general availability.

    Frequently asked questions

    I don't want to sponsor anymore. Can I cancel my sponsorship?

    Yes, you can cancel your sponsorship anytime! If you no longer want to sponsor SysIdentPy in GitHub Sponsors, you can request a cancellation which will become effective at the end of the billing cycle. Just remember: sponsorships are non-refundable!

    If you have any problems or further questions, please reach out to wilsonrljr@outlook.com.

    We don't want to pay for sponsorship every month. Are there any other options?

    Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle or just choose an one time donation.

    If you have any problems or further questions, please reach out to wilsonrljr@outlook.com.


    1. Note that $1 a month is the minimum amount to become a sponsor in Github Sponsor Program. 

    \ No newline at end of file +

    Sponsors

    As a free and open source project, SysIdentPy relies on the support of the community for its development. If you work for an organization that uses and benefits from SysIdentPy, please consider supporting us.

    SysIdentPy does not follow the sponsorware release strategy, which means that all features are released to the public at the same time. SysIdentPy is a community driven project, however sponsorships will help to assure its sustainability.

    The main goal of sponsorships it to make this project sustainable. Your donation goes to support a variety of services and development as they buy the maintainers of this project time to work on the development of new features, bug fixing, stability improvement, issue triage and general support.

    Read on to learn how to become a sponsor!

    Sponsorships

    Every donation counts and would be greatly appreciated!

    Sponsorships start as low as $1 a month.1

    How to become a sponsor

    Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit wilsonrljr's sponsor profile, and complete a sponsorship of $1 a month or more. You can use your individual or organization GitHub account for sponsoring.

      Join our awesome sponsors


    Special thanks to our sponsors:

    🏅 Gold Sponsors

    Technium

    Individual Sponsors

    Nath Keles


    Goals

    The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is already available or planned, but not yet implemented. When the funding goal is hit, the features are released for general availability.

    Frequently asked questions

    I don't want to sponsor anymore. Can I cancel my sponsorship?

    Yes, you can cancel your sponsorship anytime! If you no longer want to sponsor SysIdentPy in GitHub Sponsors, you can request a cancellation which will become effective at the end of the billing cycle. Just remember: sponsorships are non-refundable!

    If you have any problems or further questions, please reach out to wilsonrljr@outlook.com.

    We don't want to pay for sponsorship every month. Are there any other options?

    Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle or just choose an one time donation.

    If you have any problems or further questions, please reach out to wilsonrljr@outlook.com.


    1. Note that $1 a month is the minimum amount to become a sponsor in Github Sponsor Program. 

    \ No newline at end of file diff --git a/docs/sitemap.xml.gz b/docs/sitemap.xml.gz index 44a8ceba37391b0b1cf893a004eeb22d0da92d24..d162a085731a17cf74ea5d640e38505fd3780112 100644 GIT binary patch delta 16 XcmZ3(x`vfqzMF%?yi#Bz`%)$VB`*X+ delta 16 XcmZ3(x`vfqzMF%C`zymn_N7b!CX)n% diff --git a/examples/multiobjective.ipynb b/examples/multiobjective.ipynb deleted file mode 100644 index 3814cbc..0000000 --- a/examples/multiobjective.ipynb +++ /dev/null @@ -1,756 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Multiobjective parameter estimation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Example: Buck converter\n", - "\n", - "Example created by Gabriel Bueno Leandro, Samir Milani Martins and Wilson Rocha\n", - "\n", - "
    A buck converter is a type of DC/DC converter that steps down the voltage from its input to its output while increasing the current. It is a type of switched-mode power supply (SMPS) that typically contains at least two semiconductors, such as a diode and a transistor, and at least one energy storage element, such as a capacitor or inductor. Modern buck converters often replace the diode with a second transistor for synchronous rectification. Buck converters are similar to boost converters, which step up the voltage from their input to their output.
    \n", - "\n", - "## Reference \n", - "\n", - "**For further information, check this reference: https://doi.org/10.1080/00207170601185053**." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "from sysidentpy.model_structure_selection import FROLS\n", - "from sysidentpy.multiobjective_parameter_estimation import AILS\n", - "from sysidentpy.basis_function._basis_function import Polynomial\n", - "from sysidentpy.utils.display_results import results\n", - "from sysidentpy.utils.plotting import plot_results\n", - "from sysidentpy.metrics import root_relative_squared_error\n", - "from sysidentpy.utils.narmax_tools import set_weights" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Dynamic Behavior" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAEWCAYAAACAOivfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABLtElEQVR4nO2deZgU1bXAf7eXYRiWgWHfB5BF1mERVwQVDUHFPUoSlxBjTJ7GxKeJLxq3vGxKXnyJLxqjRo0LLom7cRch7qCggKKgCAMIw77M1st9f9yu7p6eXqq7q7qqu+/v++ar7ltVt05V19xz7z3nniOklGg0Go2mPPE4LYBGo9FonEMrAY1GoyljtBLQaDSaMkYrAY1GoyljtBLQaDSaMkYrAY1GoyljtBLQaDSaMkYrAU1ZIoS4QAjxkRCiUQjxlRDiNiFEN5PnrhdCzLJQFkvr02iyQSsBTdkhhPhP4HfAlUA1cBgwBHhJCFHhpGwaTaHRSkBTVgghugI3AJdKKZ+XUgaklOuBb6AUwbeFEPcIIf477pyZQoj6yOe/A4OBp4UQ+4UQPxVC1AohpBDiIiHEZiHEloiiMc7Pqj77n4JGE8PntAAaTYE5AqgE/hlfKKXcL4T4F3A80JLqZCnluUKI6cCFUsqXAYQQtZHdxwAjgGHAq0KIFcYx2dSn0RQSPRLQlBs9ge1SymCSfVsi+3PlBinlASnlR8DfgHl51KXRFAStBDTlxnagpxAi2Si4X2R/rmyM+/wl0D+PujSagqCVgKbceAs13XN6fKEQohPwdeAV4ABQFbe7b0IdqULvDor7PBjYHPmca30aje1oJaApK6SUe1CG4T8JIWYLIfyROf1HgXrg78ByYI4QokYI0Rf4cUI1W1Hz/on8QghRJYQYC3wHeDhSnmt9Go3taCWgKTuklDcBPwcWAHuBd1BTOcdJKVtQimAFsB54kVhjbvAb4BohxG4hxBVx5a8Da1GjiQVSyhcj5bnWp9HYjtBJZTSa/IiMJL4A/CkMzhqNa9EjAY1GoyljtBLQaDSaMkZPB2k0Gk0Zo0cCGo1GU8YURdiI2bNny+eff95pMTQajabYEJkOKIqRwPbt+Szi1Gg0Gk0qikIJaDQajcYetBLQaDSaMkYrAY1GoyljisIwrNFo3EMgEKC+vp7m5manRdFEqKysZODAgfj9/qzP1UpAo9FkRX19PV26dKG2thYhMjqfaGxGSsmOHTuor69n6NChWZ+vp4M0Gk1WNDc306NHD60AXIIQgh49euQ8MtNKQKPRZI1WAO4in99DKwGNJl8+egya9zgthUaTE1oJaDT5sHUV/OO78OR/OC1JWdG5c+ek5RdccAGPPfZYTnUuX76c5557Lvr9qaee4re//S0ADQ0NHHrooUyaNIklS5YwZ84cdu/enfU1Fi1axJtvvhn9fvvtt3PfffflJK9VaMOwRpMPrY1qu3eLs3Jo8mb58uUsXbqUOXPmADB37lzmzp0LwCuvvMLo0aO59957AZg+fXpO11i0aBGdO3fmiCOOAODiiy+2QPL80CMBjcYSdDReJ5BScskllzBmzBhOPPFEtm3bFt23bNkyZsyYwZQpU/ja177Gli1KUc+cOZOf/exnTJs2jZEjR7JkyRJaW1u59tprefjhh6mrq+Phhx/mnnvu4ZJLLmH58uX89Kc/5bnnnqOuro6mpiZqa2uj4Wzuu+8+JkyYwMSJEzn33HMBePrpp6Mjh1mzZrF161bWr1/P7bffzh/+8Afq6upYsmQJ119/PQsWLACUEjrssMOYMGECp512Grt27Uopr5XokYBGo8mZG55exerNey2tc0z/rlx38lhTxz7++OOsWbOGjz76iK1btzJmzBjmz59PIBDg0ksv5cknn6RXr148/PDDXH311dx9990ABINB3n33XZ577jluuOEGXn75ZW688UaWLl3KrbfeCsA999wDQF1dXbt9BqtWreJXv/oVb7zxBj179mTnzp0AHHXUUbz99tsIIbjzzju56aab+P3vf8/FF19M586dueIKlUX0lVdeidZ13nnn8ac//YkZM2Zw7bXXcsMNN3DLLbeklNcqtBLQaCxBe8s4weLFi5k3bx5er5f+/ftz7LHHArBmzRpWrlzJ8ccfD0AoFKJfv37R804//XQApkyZwvr163O+/quvvsqZZ55Jz549AaipqQHUWoqzzz6bLVu20NramtF/f8+ePezevZsZM2YAcP7553PWWWdZLm8ytBLQaDQ5Y7bHbifJ3COllIwdO5a33nor6TkdOnQAwOv1EgzmnhZaSpn0+pdeeimXX345c+fOZdGiRVx//fU5XwOskzcZ2iag0eSFtgU4ydFHH83ChQsJhUJs2bKF1157DYBRo0bR0NAQVQKBQIBVq1al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", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Reading Buck's input and output data\n", - "df_train = pd.read_csv(r'datasets/buck_id.csv')\n", - "df_valid = pd.read_csv(r'datasets/buck_valid.csv')\n", - "\n", - "# Plotting the measured output (identification and validation data)\n", - "plt.figure(1)\n", - "plt.title('Output')\n", - "plt.plot(df_train.sampling_time, df_train.y, label='Identification', linewidth=1.5)\n", - "plt.plot(df_valid.sampling_time, df_valid.y , label='Validation', linewidth=1.5)\n", - "plt.xlabel('Samples')\n", - "plt.ylabel('y')\n", - "plt.legend()\n", - "plt.show()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Plotting the measured input(identification and validation data)\n", - "plt.figure(2)\n", - "plt.title('Input')\n", - "plt.plot(df_train.sampling_time, df_train.input, label='Identification', linewidth=1.5)\n", - "plt.plot(df_valid.sampling_time, df_valid.input, label='Validation', linewidth=1.5)\n", - "plt.ylim(2.1, 2.6)\n", - "plt.ylabel('u')\n", - "plt.xlabel('Samples')\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Buck Converter Static Function\n", - "\n", - "The duty cycle, represented by the symbol $D$, is defined as the ratio of the time the system is on ($T_{on}$​) to the total operation cycle time ($T$). Mathematically, this can be expressed as $D=\\frac{T_{on}}{T}$. The complement of the duty cycle, represented by $D'$, is defined as the ratio of the time the system is off ($T_{off}$) to the total operation cycle time ($T$) and can be expressed as $D'=\\frac{T_{off}}{T}$.\n", - "\n", - "The load voltage ($V_o$) is related to the source voltage ($V_d$) by the equation $V_o​=D⋅V_d​=(1−D’)⋅V_d$. For this particular converter, it is known that $D′=\\frac{\\bar{u}-1}{3}​$,​ which means that the static function of this system can be derived from theory to be:\n", - "\n", - "$$\n", - "V_o = \\frac{4V_d}{3} - \\frac{V_d}{3}\\cdot \\bar{u}\n", - "$$\n", - "\n", - "If we assume that the source voltage $V_d$​ is equal to 24 V, then we can rewrite the above expression as follows:\n", - "\n", - "$$\n", - "V_o = (4 - \\bar{u})\\cdot 8\n", - "$$" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Static data\n", - "Vd = 24\n", - "Uo = np.linspace(0, 4, 50)\n", - "Yo = (4-Uo)*Vd/3\n", - "Uo = Uo.reshape(-1, 1)\n", - "Yo = Yo.reshape(-1, 1)\n", - "plt.figure(3)\n", - "plt.title('Buck Converter Static Function')\n", - "plt.xlabel('$\\\\bar{u}$')\n", - "plt.ylabel('$\\\\bar{y}$')\n", - "plt.plot(Uo, Yo, linewidth=1.5, linestyle='-', marker='o')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Buck converter static gain\n", - "\n", - "The gain of a Buck converter is a measure of how its output voltage changes in response to changes in its input voltage. Mathematically, the gain can be calculated as the derivative of the converter’s static function, which describes the relationship between its input and output voltages.\n", - "In this case, the static function of the Buck converter is given by the equation:\n", - "\n", - "$$\n", - "V_o = (4 - \\bar{u})\\cdot 8\n", - "$$\n", - "\n", - "Taking the derivative of this equation with respect to $\\hat{u}$, we find that the gain of the Buck converter is equal to −8. In other words, for every unit increase in the input voltage $\\hat{u}$, the output voltage Vo​ will decrease by 8 units." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Defining the gain\n", - "gain = -8*np.ones(len(Uo)).reshape(-1, 1)\n", - "plt.figure(3)\n", - "plt.title('Gain of the Static Converter')\n", - "plt.xlabel('$\\\\bar{u}$')\n", - "plt.ylabel('$\\\\bar{gain}$')\n", - "plt.plot(Uo, gain, linewidth=1.5, label='gain', linestyle='-', marker='o')\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Information about the static function and static gain of a system, along with its usual input/output data, can be used as sources of affine information to estimate the parameters of a mathematical model. In this context, a composite cost function is often used to measure the accuracy of the estimated model parameters. This cost function is typically defined as a weighted sum of several individual cost functions, each representing a different aspect of the model’s performance.\n", - "\n", - "In this case, the composite cost function is given by the equation:\n", - "\n", - "$$\n", - "\\gamma(\\hat\\theta) = w_1\\cdot J_{LS}(\\hat{\\theta})+w_2\\cdot J_{SF}(\\hat{\\theta})+w_3\\cdot J_{SG}(\\hat{\\theta})\n", - "$$\n", - "\n", - "where $\\hat{\\theta}$ represents the estimated model parameters, $w_1$​, $w_2$​, and $w_3$ are weighting factors, and $J_{LS}$​, $J_{SF}$​, and $J_{SG}$ are individual cost functions representing the least squares, static function, and static gain aspects of the model’s performance, respectively.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\wilso\\Desktop\\projects\\GitHub\\gabriel\\sysidentpy\\sysidentpy\\utils\\deprecation.py:37: FutureWarning: Passing a string to define the estimator will rise an error in v0.4.0. \n", - " You'll have to use FROLS(estimator=LeastSquares()) instead. \n", - " The only change is that you'll have to define the estimator first instead of passing a string like 'least_squares'. \n", - " This change will make easier to implement new estimators and it'll improve code readability.\n", - " warnings.warn(message, FutureWarning)\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_train = df_train.input.values.reshape(-1, 1)\n", - "y_train = df_train.y.values.reshape(-1, 1)\n", - "x_valid = df_valid.input.values.reshape(-1, 1)\n", - "y_valid = df_valid.y.values.reshape(-1, 1)\n", - "\n", - "basis_function = Polynomial(degree=2)\n", - "\n", - "model = FROLS(\n", - " order_selection=True,\n", - " n_info_values=8,\n", - " extended_least_squares=False,\n", - " ylag=2, xlag=2,\n", - " info_criteria='aic',\n", - " estimator='least_squares',\n", - " basis_function=basis_function\n", - ")\n", - "\n", - "model.fit(X=x_train, y=y_train)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The Affine Information Least Squares method will now be called to perform several calculations related to the performance of the objectives. These calculations include the computation of the performance matrix (J), the weights matrix (w), the Euclidean norm (E), and the values of $\\theta$ for each weight. Additionally, the method will also calculate the product of matrix H and matrix R, as well as the product of matrix Q and matrix R." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    w1w2w3J_lsJ_sgJ_sf||J||:
    00.0068420.0030780.9900800.9999701.095045e-050.0000130.245244
    10.0075730.0023470.9900800.9999382.294701e-050.0000160.245236
    20.0083820.0015380.9900800.9998856.505062e-050.0000180.245223
    30.0092770.0006420.9900800.9997174.505632e-040.0000210.245183
    40.0068420.0986630.8944951.0000007.393225e-080.0000150.245252
    ........................
    22900.6596320.3335270.0068420.9958963.965701e-041.0000000.244489
    22910.7301190.2630390.0068420.9956325.602985e-040.9728410.244412
    22920.8081390.1850200.0068420.9953648.321075e-040.8682990.244300
    22930.8944950.0986630.0068420.9951001.365000e-030.6604850.244160
    22940.9900800.0030780.0068420.9925849.825994e-020.3054920.261455
    \n", - "

    2295 rows × 7 columns

    \n", - "
    " - ], - "text/plain": [ - " w1 w2 w3 J_ls J_sg J_sf ||J||:\n", - "0 0.006842 0.003078 0.990080 0.999970 1.095045e-05 0.000013 0.245244\n", - "1 0.007573 0.002347 0.990080 0.999938 2.294701e-05 0.000016 0.245236\n", - "2 0.008382 0.001538 0.990080 0.999885 6.505062e-05 0.000018 0.245223\n", - "3 0.009277 0.000642 0.990080 0.999717 4.505632e-04 0.000021 0.245183\n", - "4 0.006842 0.098663 0.894495 1.000000 7.393225e-08 0.000015 0.245252\n", - "... ... ... ... ... ... ... ...\n", - "2290 0.659632 0.333527 0.006842 0.995896 3.965701e-04 1.000000 0.244489\n", - "2291 0.730119 0.263039 0.006842 0.995632 5.602985e-04 0.972841 0.244412\n", - "2292 0.808139 0.185020 0.006842 0.995364 8.321075e-04 0.868299 0.244300\n", - "2293 0.894495 0.098663 0.006842 0.995100 1.365000e-03 0.660485 0.244160\n", - "2294 0.990080 0.003078 0.006842 0.992584 9.825994e-02 0.305492 0.261455\n", - "\n", - "[2295 rows x 7 columns]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "w = set_weights(static_function=True, static_gain=True)\n", - "mo_estimator = AILS(final_model=model.final_model)\n", - "J, E, theta, HR, QR, position = mo_estimator.estimate(\n", - " y=y_train, gain=gain, y_static=Yo, X_static=Uo, X=x_train, weighing_matrix=w\n", - ")\n", - "result = {\n", - " \"w1\": w[0, :],\n", - " \"w2\": w[2, :],\n", - " \"w3\": w[1, :],\n", - " \"J_ls\": J[0, :],\n", - " \"J_sg\": J[1, :],\n", - " \"J_sf\": J[2, :],\n", - " \"||J||:\": E,\n", - "}\n", - "pd.DataFrame(result)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At this point, we can select a value for $\\theta$ that corresponds to the weights in our model. This value of $\\theta$ will determine the relative importance of each objective in the performance matrix, and will affect the overall performance of the model." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    RegressorsParametersERR
    011.5405E+009.999E-01
    1y(k-1)2.9687E-012.042E-05
    2y(k-2)6.4693E-011.108E-06
    3x1(k-1)-4.1302E-014.688E-06
    4y(k-1)^22.7671E-013.922E-07
    5y(k-2)y(k-1)-5.3474E-018.389E-07
    6x1(k-1)y(k-1)4.0624E-035.690E-07
    7y(k-2)^22.5832E-013.827E-06
    \n", - "
    " - ], - "text/plain": [ - " Regressors Parameters ERR\n", - "0 1 1.5405E+00 9.999E-01\n", - "1 y(k-1) 2.9687E-01 2.042E-05\n", - "2 y(k-2) 6.4693E-01 1.108E-06\n", - "3 x1(k-1) -4.1302E-01 4.688E-06\n", - "4 y(k-1)^2 2.7671E-01 3.922E-07\n", - "5 y(k-2)y(k-1) -5.3474E-01 8.389E-07\n", - "6 x1(k-1)y(k-1) 4.0624E-03 5.690E-07\n", - "7 y(k-2)^2 2.5832E-01 3.827E-06" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.theta = theta[position, :].reshape(-1, 1) # get the best theta concerning the objectives\n", - "# the model structure is exactly the same, but the order of the regressors is changed in estimate method. Thats why you have to change the model.final_model\n", - "model.final_model = mo_estimator.final_model\n", - "yhat = model.predict(X=x_valid, y=y_valid)\n", - "rrse = root_relative_squared_error(y_valid, yhat)\n", - "r = pd.DataFrame(\n", - " results(\n", - " model.final_model,\n", - " model.theta,\n", - " model.err,\n", - " model.n_terms,\n", - " err_precision=3,\n", - " dtype=\"sci\",\n", - " ),\n", - " columns=[\"Regressors\", \"Parameters\", \"ERR\"],\n", - ")\n", - "r" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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NTUVmZmZ2LRpk/W+KSkpWL9+PXr27IlWrVph3LhxOHfuHB577DG0atUKw4cPx5UrVwAA77//Pl5++WW88cYbaNWqFTIzM7FlyxbRdq1YsQLdunVDeno6hgwZgry8POttu3fvxoABA9CyZUvcf//9+OSTTwKwZwgh4YqCM0JI2Hr88cexfPlydOnSBdnZ2Vi/fj1u3bqFxo0bIyYmBjNnzsSJEyfw+eefY926dWjXrh0mTZoEg8FgfY733nsPM2fOxMcff4yNGzdiyJAhGD58OL766isUFBTg888/t95327ZtMJvNWLNmDQYOHIiXX34ZR44ccWrXtm3bsGDBAkycOBFr167FfffdhxEjRuDKlSswm814+eWX0aVLF/zwww946623sHDhQuzYsSMo+4wQIn+qUDeAEEK89eKLL6Jhw4b46quvsGbNGqxcuRJarRYvv/wynnnmGbRp0waPP/44UlJSAABPPfUUVq5cicuXL6Nu3boAuACvdevWALiRtLvvvhuZmZkAgG7duuHkyZPW16tcuTKmT58OjUaDu+66Cz///DNWrVqFN998065dn376KZ599ll0794dAPD8889j586dWLlyJYYNG4YbN27gjjvuQJ06dVCnTh188cUX1vYQQggFZ4SQsNarVy/06tULt27dws6dO7FixQrMnj0bDRo0QFZWFrZs2YKVK1fi5MmTOHjwIADAYrFYH28bFGm1WtSuXdv6d0xMjN0oW/PmzaHRaKx/p6am4tixY05tOnHiBObOnYsFCxZYtxkMBtSqVQuJiYl49tlnMXXqVHz00Ufo0qUL+vXrh6SkJP/sEEJI2KPgjBASlg4fPoxVq1YhOzsbADeq9eCDDyIzMxMDBw7Ezp07sXHjRvz111946KGHMGTIECQlJeHRRx+1ex6Vyv5jUKEQn+3heF+z2QyGYZzuZzab8frrr+Nf//qX3fa4uDgAwLhx49C/f39s3boV27dvx2OPPYacnBw8/PDD7u8AQkjEojlnhJCwZDabsWTJEuzbt89uO8MwqFSpEqpVq4Z169Zhzpw5GD16NB544AHcvHkTALxOs3H06FG7UbcDBw5YL5naatiwIS5duoT69etb/33++ef4448/UFhYiClTpiA5ORn/+c9/8NVXX2HAgAHYsGGDV20ihEQeCs4IIWGpRYsW6NKlC1566SWsXbsW586dQ35+PubNm4dDhw7h4YcfRmxsLDZv3ozz58/j119/xbRp0wDA7lKlJwoKCjBr1iycPHkSH3/8MQ4cOIBBgwY53e/JJ5/EkiVLsHbtWpw9exYffPABVq9ejUaNGqFKlSrYsmULZsyYgTNnziAvLw979uxBixYtfNofhJDIQZc1CSFha/78+Vi0aBE++eQTTJ48GRqNBu3atcOyZctw5513Yvbs2XjnnXewbNky1KlTByNHjsT777+Pv//+G02aNPH49VJTU3H79m30798f9evXx6JFi9CgQQOn+/Xq1Qv//PMPPvjgA1y5cgWNGjXCwoUL0axZMwDARx99hLfffhtZWVnQarXo1asXXnzxRV93ByEkQjAspdEmhBCX3n//fezcuRPLly8PdVMIIRGOLmsSQgghhMgIBWeEEEIIITJClzUJIYQQQmSERs4IIYQQQmSEgjNCCCGEEBmh4IwQQgghREYoOCOEEEIIkREKzgghhBBCZISCM0IIIYQQGfl/3CRBl6+eaYgAAAAASUVORK5CYII=", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(y=y_valid, yhat=yhat, n=1000)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The static gain of a system can be represented graphically to provide a visual representation of how the system’s output changes in response to changes in its input. This graphical representation can be useful for understanding the behavior of the system and for designing control strategies.\n", - "\n", - "To create a graphical representation of the static gain, the input variable is typically plotted on the horizontal axis, while the corresponding changes in the output variable are plotted on the vertical axis. The resulting graph shows how the output variable changes as the input variable is varied, providing a visual representation of the system’s static gain." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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39vl0hGGyDXk4rD4uXazNm3aRFJSEo888ggTJ06kR48el9z2m2++YcOGDaSnp7N8+XL27t2LYRiUlpYyevRo2rVr5xYWAMuXL6dx48akpaUxa9Ystm/fTlpaGrVr12b58uUsXLiQP/3pT5w6dQpwXvHh9ddfJyoqivfee4+YmBjef/99DMMgIyODe++9l0OHDvHPf/6TpUuXsnTpUj755BP27dsHOI+Yli9fzpNPPknNmjVJSUkhPT2d2rVrs2TJEubOnctzzz0HQEFBAUOHDnULC4DVq1fzzDPPkJaWRpMmTTAMgyFDhtCrVy+io6P57rvvePHFF3njjTfo1q0bH3zwATabjfr16/PHP/7R9Tg//PADr7zyCkuXLmX16tXk5ua6Xf4oIyODnJwcVq5cycyZM/n+++8B2Lt3L+PGjeP1119n4MCBrF69uszv4uJxulI6whD5H/Jwx7AKjwaiZq3lSM65Mu2NawWR9vidl73fTp06uSa5ffv2ER8fz4YNG9y2Of8Z4P379xMZGYnVaiUoKIhJkyaRnZ3Nnj17CAkJoaCgoMzj79u3jy5dugAQERFBREQEU6dO5a677gKc15Br3rw5hw87j65uueUWABo2bMjJkyepWbMmrVu3ZuvWrbz55puMGzeOPXv2cPToUQYMGADAmTNnOHTIeZTVtGnTMjV8++23bN26lR07dgDOq16fPn36kts///zzvPbaa7z00ku0a9eOiz8Dff311zNjxgyuu+46jh8/TocOHcod28OHD9OiRQsCAwMBmDhxYpmxadeuHQB16tShWbNmADRo0IC5c+cSGBhIfn4+ISEhZR774nG6UjrCELmGjOnRkiA/q1tbkJ+VMT1aVto+6tWr5/rZ39+fEydOAM4jC4BmzZrxzTff4HA4KCkpYeDAgRQXF9OmTRvmz5/PO++8U+YrCZo3b87OnTsB5wT69NNP07x5c7Zs2QI4r1L97bffVnjlhri4OFJTUyksLKR58+Y0a9aMm2++mTfeeINFixYRGxvruu6cxWJx3e/8RN+sWTMefPBBFi1axCuvvMJvfvMbatasCYCPT9mpcsWKFUydOpXFixeze/duvvzyS3x8fHA4nEdzkyZNYubMmcyaNYsGDRq49mOxWFzbAISHh7Nv3z6Ki4sBGD58OMePH3f1t2jRgq+++gpwht75C7LOmDGD4cOHM3v2bCIiIsoE1tWgIwyRa0if9s416hc/3MPRnHPcUCuIMT1autov1/klKR8fH/Lz8xk/fjyBgYEkJyfz3HPP0ahRIxo0aABA69at6dy5MwkJCTgcDhISElxfcBYYGEhKSgrjxo0jPT3d1R4fH8/EiRPp378/drudiRMn0rJlSyZPnkxCQgJFRUUMGzaMunXrXrLGO+64g8mTJ/Pkk08C0KpVK+68804SEhIoLi4mMjKS66+/vsz9mjdvzujRo5k5cyaTJk2if//+5OXlkZiYWG5QnNeyZUv69u1L7dq1uf7667ntttsICQnh5Zdfpk2bNsTExBAXF0eNGjWoV68e//3vfwG4/fbbGTJkCL///e8B51HD4MGD6d+/PxaLhXvvvdetznvuuYcNGzYQHx9PvXr1CAwMxM/Pj4ceeoihQ4dSt25dGjZs6Doaupp0LSkRES+WlZVFZmYmDz74IKdPn6ZXr16sW7fOI98yqiMMEREv1qhRI1566SVSU1Ox2+2MHj3aY19JrcAQEfFi1113XaV+VuRK6KS3iIiYosAQERFTFBgiImKKAkNERExRYIhci3KPwcIHIPf4z2/7MzZv3sztt9/uuiQFwEsvveR2KYrt27fTtm1b16ekwXnpjHvuuYekpCSSkpKIiYlh6tSpAGzcuJGHHnqIwsJCAI4fP07v3r3dPrBWWUaNGsXmzZsv2d+tWzeKioou+/Hnz5/v9ryvZV4XGHa7nenTpxMfH09sbCzr1q0rs8306dOJjY11/UPMzc31QKUiXmz9C3BoE6yfXSkP5+fnx4QJEy75aeL09HQGDhzI0qVL3dp79erFokWLWLRoEW+++Sa7d+9m586dREVFcffddzNr1ixKSkoYNWoU48ePL/eDdd5uyJAhREZGerqMKuF1b6t9++23KS0tZfny5Rw/fpz333+/zDa7du3i1VdfpU6dOh6oUMSDvloGX/7M9zeUFsPRLWA4YOtCOLYTrBW8b799f2iXUOFDdurUCYfDwZIlS+jfv79bX35+Pps2beK9996jd+/enDp1qty/zfz8fHJzcwkNDQWcr/wTExMZOnQod911F1FRUWXuc99999G+fXsOHjxIp06dyM3NZceOHTRt2pQXX3yR7OxsnnnmGUpLS7FYLEyaNIlWrVqxZMkS0tPTqV+/Pj/88AMAJSUl5V6Ntjzr1q3jL3/5CyEhIdSsWZOWLVsydOhQpkyZwrFjxzh9+jRdunRh5MiRjB8/np49e3Ly5EnWr19PYWEhhw4dYvDgwcTGxlY4rv9rvC4wPv30UyIiIhgyZAiGYTB58mS3fofDwcGDB5kyZQonT56kb9++9O3b10PVinihM4fg/JGAYUDOIah78xU/bEpKCjabzXWp8vP++c9/ct999xEQEMADDzzAypUrXVejXbNmDV999RUnTpwgODiYJ554gptuuglwHrXExcWRkpLiWqq62JEjR0hNTaV+/frccccdpKenM3nyZKKjozl79iwvvPACSUlJdO/end27dzNx4kRSU1N54403ePfdd7FYLK5J+/zVaGfOnMnp06fp379/uVdwPb/KkZaWRr169Xj66acB+P7772nXrh02m42ioiJXYFwoLy+PBQsWcODAAZ544gkFRmVKT08nNTXVra127doEBAQwb948vvjiCyZMmMCSJUtc/QUFBfTv35+BAwdit9tJTk6mbdu2tGrVqqrLF6l67RIqPhrIPQZ/vg04v3RkQGEO9H0NQq9suad27dpMnDiR8ePHu115NT09HavVymOPPUZhYSHHjh1j0KBBgHNJavTo0Rw+fJhBgwa5wgKcYfDqq68yZswYxowZwxtvvIHV6n7hxFq1anHDDTcAzg+w3XyzM/hCQ0MpKioiKyuLX/3qV4DzGlbHjh1j37593Hzzza5PQ59fLqroarQXOnXqFCEhIa6LLN5+++2cPHmSWrVqsXPnTjZt2kRISIjrYoEXOj8PNWrUqNz+/3UePYdhs9lYs2aN23/16tXjnnvuwWKxcMcdd7iuzHheUFAQycnJBAUFERISQqdOncpc+VKk2lr/gnMp6kKGo9LOZXTr1o2mTZvy5ptvArBnzx7sdjvLli1jwYIFLFmyhPDw8DLnHps0acKzzz7LiBEjOHfuHMXFxYwcOZKJEycyYMAAGjVqVO43xV14VdnyXHhF2927d1OvXj2aNGnC3r17KSwsxG63s3v3bqDiq9FeqG7duuTn57u+e2P79u2A8yR+aGgof/jDH3j00UcpLCwsc07n5+r9X+d1J707duzI+vXrAcjMzKRRo0Zu/QcOHCAxMRG73U5JSQnbtm2jTZs2nihVxPtk/wfsF72ytRc72yvJM8884/ruhvT0dGJiYtz6bTab26rAeXfddRd33XUXf/nL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", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(4)\n", - "plt.title('Gain')\n", - "plt.plot(Uo, gain, linewidth=1.5, linestyle='-', marker='o', label='Buck converter static gain')\n", - "plt.plot(Uo, HR.dot(model.theta), linestyle='-', marker='^', linewidth=1.5, label='NARX model gain')\n", - "plt.xlabel('$\\\\bar{u}$')\n", - "plt.ylabel('$\\\\bar{g}$')\n", - "plt.ylim(-10, -6)\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The static function of a system can be represented graphically to provide a visual representation of the relationship between the system’s input and output. This graphical representation can be useful for understanding the behavior of the system and for designing control strategies.\n", - "\n", - "To create a graphical representation of the static function, the input variable is typically plotted on the horizontal axis, while the corresponding output variable is plotted on the vertical axis. The resulting graph shows how the output variable changes as the input variable is varied, providing a visual representation of the system’s static function." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(5)\n", - "plt.title('Static Curve')\n", - "plt.plot(Uo, Yo, linewidth=1.5, label='Static curve', linestyle='-', marker='o')\n", - "plt.plot(Uo, QR.dot(model.theta), linewidth=1.5, label='NARX ​​static representation', linestyle='-', marker='^')\n", - "plt.xlabel('$\\\\bar{u}$')\n", - "plt.xlabel('$\\\\bar{y}$')\n", - "plt.legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A Pareto-optimal curve, also known as a Pareto frontier, is a graphical representation of the trade-offs between multiple objectives in a multi-objective optimization problem. The curve shows the set of solutions that are considered optimal, in the sense that no other solution can improve one objective without worsening at least one other objective.\n", - "\n", - "To create a Pareto-optimal curve, the values of the different objectives are typically plotted on different axes, with each point on the curve representing a solution that is optimal with respect to the trade-offs between the objectives. The shape of the curve can provide insight into the nature of the trade-offs between the objectives and can help decision-makers to identify solutions that best meet their needs and preferences." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(6)\n", - "ax = plt.axes(projection='3d')\n", - "ax.plot3D( J[0,:], J[1,:], J[2,:], 'o', linewidth=0.1)\n", - "ax.set_title('Optimum pareto-curve', fontsize=15)\n", - "ax.set_xlabel('$J_{ls}$', fontsize=10)\n", - "ax.set_ylabel('$J_{sg}$', fontsize=10)\n", - "ax.set_zlabel('$J_{sf}$', fontsize=10)\n", - "plt.show()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "meu_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.11" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/multiobjective_parameter_estimation.ipynb b/examples/multiobjective_parameter_estimation.ipynb index e42c50d..cd5f70f 100644 --- a/examples/multiobjective_parameter_estimation.ipynb +++ b/examples/multiobjective_parameter_estimation.ipynb @@ -5,7 +5,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Example: Multiobjective Parameter Estimation for NARMAX models - An Overview\n", + "# Multiobjective Parameter Estimation for NARMAX models - An Overview\n", "\n", "Example created by Gabriel Bueno Leandro, Samir Milani Martins and Wilson Rocha Lacerda Junior\n", "\n", @@ -28,7 +28,7 @@ "metadata": {}, "source": [ "## Use case: Buck converter\n", - " \n", + "\n", "
    A buck converter is a type of DC/DC converter that decreases the voltage (while increasing the current) from its input (power supply) to its output (load). It is similar to a boost converter (elevator) and is a type of switched-mode power supply (SMPS) that typically contains at least two semiconductors (a diode and a transistor, although modern buck converters replace the diode with a second transistor used for synchronous rectification) and at least one energy storage element, a capacitor, inductor or both combined.
    " ] }, @@ -60,7 +60,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Dynamic Behavior" + "## Dynamic Behavior" ] }, { @@ -142,21 +142,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Buck Converter Static Function\n", + "## Buck Converter Static Function\n", "\n", "The duty cycle, represented by the symbol $D$, is defined as the ratio of the time the system is on ($T_{on}$​) to the total operation cycle time ($T$). Mathematically, this can be expressed as $D=\\frac{T_{on}}{T}$. The complement of the duty cycle, represented by $D'$, is defined as the ratio of the time the system is off ($T_{off}$) to the total operation cycle time ($T$) and can be expressed as $D'=\\frac{T_{off}}{T}$.\n", "\n", "The load voltage ($V_o$) is related to the source voltage ($V_d$) by the equation $V_o​=D⋅V_d​=(1−D’)⋅V_d$. For this particular converter, it is known that $D′=\\frac{\\bar{u}-1}{3}​$,​ which means that the static function of this system can be derived from theory to be:\n", "\n", - "$$\n", - "V_o = \\frac{4V_d}{3} - \\frac{V_d}{3}\\cdot \\bar{u}\n", - "$$\n", + "$V_o = \\frac{4V_d}{3} - \\frac{V_d}{3}\\cdot \\bar{u}$\n", "\n", "If we assume that the source voltage $V_d$​ is equal to 24 V, then we can rewrite the above expression as follows:\n", "\n", - "$$\n", - "V_o = (4 - \\bar{u})\\cdot 8\n", - "$$" + "$V_o = (4 - \\bar{u})\\cdot 8$" ] }, { @@ -202,14 +198,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Buck converter Static Gain\n", + "## Buck converter Static Gain\n", "\n", "The gain of a Buck converter is a measure of how its output voltage changes in response to changes in its input voltage. Mathematically, the gain can be calculated as the derivative of the converter’s static function, which describes the relationship between its input and output voltages.\n", "In this case, the static function of the Buck converter is given by the equation:\n", "\n", - "$$\n", - "V_o = (4 - \\bar{u})\\cdot 8\n", - "$$\n", + "$V_o = (4 - \\bar{u})\\cdot 8$\n", "\n", "Taking the derivative of this equation with respect to $\\hat{u}$, we find that the gain of the Buck converter is equal to −8. In other words, for every unit increase in the input voltage $\\hat{u}$, the output voltage Vo​ will decrease by 8 units.\n", "\n", @@ -255,7 +249,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Building a dynamic model using the mono-objective approach" + "## Building a dynamic model using the mono-objective approach" ] }, { @@ -316,7 +310,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Affine Information Least Squares Algorithm (AILS)\n", + "## Affine Information Least Squares Algorithm (AILS)\n", "\n", "AILS is a multiobjective parameter estimation algorithm, based on a set of affine information pairs. The multiobjective approach proposed in the mentioned paper and implemented in SysIdentPy leads to a convex multiobjective optimization problem, which can be solved by AILS. AILS is a LeastSquares-type non-iterative scheme for finding the Pareto-set solutions for the multiobjective problem.\n", "\n", @@ -324,16 +318,16 @@ "\n", "The information about static function and static gain, besides the usual dynamic input/output data, can be used to build the pair of affine information to estimate the parameters of the model. We can model the cost function as:\n", "\n", - "$$\n", + "$\n", "\\gamma(\\hat\\theta) = w_1\\cdot J_{LS}(\\hat{\\theta})+w_2\\cdot J_{SF}(\\hat{\\theta})+w_3\\cdot J_{SG}(\\hat{\\theta})\n", - "$$\n" + "$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Multiobjective parameter estimation considering 3 different objectives: the prediction error, the static function and the static gain " + "## Multiobjective parameter estimation considering 3 different objectives: the prediction error, the static function and the static gain " ] }, { @@ -843,7 +837,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Getting the best weight combination based on the norm of the cost function" + "## Getting the best weight combination based on the norm of the cost function" ] }, { @@ -1007,7 +1001,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Details about the method" + "## Detailing AILS" ] }, { @@ -1017,37 +1011,37 @@ "source": [ "The polynomial NARX model built using the mono-objective approach has the following structure:\n", "\n", - "$$\n", + "$\n", "y(k) = \\theta_1 y(k-1) + \\theta_2 y(k-2) + \\theta_3 u(k-1) y(k-1) + \\theta_4 + \\theta_5 y(k-1)^2 + \\theta_6 u(k-1) + \\theta_7 y(k-2)y(k-1) + \\theta_8 y(k-2)^2\n", - "$$\n", + "$\n", "\n", "The, the goal when using the static function and static gain information in the multiobjective scenario is to estimate the vector $\\hat{\\theta}$ based on:\n", "\n", - "$$\n", + "$\n", "\\theta = [w_1\\Psi^T\\Psi + w_2(HR)^T(HR) + w_3(QR)(QR)^T]^{-1} [w_1\\Psi^T y + w_2(HR)^T\\overline{g}+w_3(QR)^T\\overline{y}]\n", - "$$\n", + "$\n", "\n", "The $\\Psi$ matrix is built using the usual mono-objective dynamic modeling approach in SysIdentPy. However, it is still necessary to find the Q, H and R matrices. AILS have the methods to compute all of those matrices. Basically, to do that, $q_i^T$ is first estimated:\n", "\n", - "$$\n", - "q_i^T = \n", + "$\n", + "q_i^T =\n", "\\begin{bmatrix}\n", "1 & \\overline{y_i} & \\overline{u_1} & \\overline{y_i}^2 & \\cdots & \\overline{y_i}^l & F_{yu} & \\overline{u_i}^2 & \\cdots & \\overline{u_i}^l\n", "\\end{bmatrix}\n", - "$$\n", + "$\n", "\n", "where $F_{yu}$ stands for all non-linear monomials in the model that are related to $y(k)$ and $u(k)$, $l$ is the largest non-linearity in the model for input and output terms. For a model with a degree of nonlinearity equal to 2, we can obtain:\n", "\n", - "$$\n", + "$\n", "q_i^T = \n", "\\begin{bmatrix}\n", "1 & \\overline{y_i} & \\overline{u_i} & \\overline{y_i}^2 & \\overline{u_i}\\:\\overline{y_i} & \\overline{u_i}^2 \n", "\\end{bmatrix}\n", - "$$\n", + "$\n", "\n", "It is possible to encode the $q_i^T$ matrix so that it follows the model encoding defined in SysIdentPy. To do this, 0 is considered as a constant, $y_i$ equal to 1 and $u_i$ equal to 2. The number of columns indicates the degree of nonlinearity of the system and the number of rows reflects the number of terms:\n", "\n", - "$$\n", + "$\n", "q_i = \n", "\\begin{bmatrix}\n", "0 & 0\\\\\n", @@ -1057,7 +1051,9 @@ "2 & 1\\\\\n", "2 & 2\\\\\n", "\\end{bmatrix}\n", - "= \n", + "$\n", + "$ = $\n", + "$ \n", "\\begin{bmatrix}\n", "1 \\\\\n", "\\overline{y_i}\\\\\n", @@ -1066,7 +1062,7 @@ "\\overline{u_i}\\:\\overline{y_i}\\\\\n", "\\overline{u_i}^2\\\\\n", "\\end{bmatrix}\n", - "$$\n", + "$\n", "\n", "Finally, the result can be easily obtained using the ‘regressor_space’ method of SysIdentPy" ] @@ -1109,15 +1105,15 @@ "source": [ "such that:\n", "\n", - "$$\n", + "$\n", "\\overline{y_i} = q_i^T R\\theta\n", - "$$\n", + "$\n", "\n", "and:\n", "\n", - "$$\n", + "$\n", "\\overline{g_i} = H R\\theta\n", - "$$\n", + "$\n", "\n", "where $R$ is the linear mapping of the static regressors represented by $q_i^T$. In addition, the $H$ matrix holds affine information regarding $\\overline{g_i}$, which is equal to $\\overline{g_i} = \\frac{d\\overline{y}}{d\\overline{u}}{\\big |}_{(\\overline{u_i}\\:\\overline{y_i})}$.\n", "\n", @@ -1174,7 +1170,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "$$\n", + "$\n", "q_i = \n", "\\begin{bmatrix}\n", "0 & 0\\\\\n", @@ -1183,7 +1179,9 @@ "1 & 1\\\\\n", "2 & 1\\\\ \n", "\\end{bmatrix}\n", - "=\n", + "$\n", + "$ =$\n", + "$\n", "\\begin{bmatrix}\n", "1\\\\\n", "\\overline{y}\\\\\n", @@ -1191,13 +1189,13 @@ "\\overline{y^2}\\\\\n", "\\overline{u}\\:\\overline{y}\\\\ \n", "\\end{bmatrix}\n", - "$$\n", + "$\n", "\n", "You can notice that the method produces outputs consistent with what is expected:\n", "\n", - "$$\n", + "$\n", "y(k) = \\theta_1 y(k-1) + \\theta_2 y(k-2) + \\theta_3 u(k-1) y(k-1) + \\theta_4 + \\theta_5 y(k-1)^2 + \\theta_6 u(k-1) + \\theta_7 y(k-2)y(k-1) + \\theta_8 y(k-2)^2\n", - "$$" + "$" ] }, { @@ -1207,7 +1205,7 @@ "source": [ "and:\n", "\n", - "$$ \n", + "$\n", "R = \n", "\\begin{bmatrix}\n", "term/\\theta & \\theta_1 & \\theta_2 & \\theta_3 & \\theta_4 & \\theta_5 & \\theta_6 & \\theta_7 & \\theta_8\\\\\n", @@ -1217,7 +1215,7 @@ "\\overline{y^2} & 0 & 0 & 0 & 0 & 1 & 0 & 1 & 1\\\\\n", "\\overline{y}\\:\\overline{u} & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\\\\n", "\\end{bmatrix}\n", - "$$" + "$" ] }, { @@ -1229,14 +1227,14 @@ "\n", "The following model structure will be used to validate the approach:\n", "\n", - "$$\n", + "$\n", "y(k) = \\theta_1 y(k-1) + \\theta_2 y(k-2) + \\theta_3 + \\theta_4 u(k-1) + \\theta_5 u(k-1)^2 + \\theta_6 u(k-2)u(k-1)+\\theta_7 u(k-2) + \\theta_8 u(k-2)^2\n", - "$$\n", + "$\n", "\n", "$\\therefore$\n", "\n", - "$$\n", - "model\\_final = \n", + "$\n", + "final\\_model = \n", "\\begin{bmatrix}\n", "1001 & 0\\\\\n", "1002 & 0\\\\\n", @@ -1247,7 +1245,7 @@ "2002 & 0\\\\\n", "2002 & 2002\n", "\\end{bmatrix}\n", - "$$\n", + "$\n", "\n", "defining in code:" ] @@ -1281,7 +1279,7 @@ } ], "source": [ - "model_final = np.array(\n", + "final_model = np.array(\n", " [\n", " [1001, 0],\n", " [1002, 0],\n", @@ -1293,7 +1291,7 @@ " [2002, 2002],\n", " ]\n", ")\n", - "model_final" + "final_model" ] }, { @@ -1307,7 +1305,7 @@ }, "outputs": [], "source": [ - "mult2 = AILS(final_model=model_final)" + "mult2 = AILS(final_model=final_model)" ] }, { @@ -1342,21 +1340,21 @@ "source": [ "The value of theta with the lowest mean squared error obtained with the same code implemented in Scilab was:\n", "\n", - "$$\n", - "W_{LS} = 0,3612343\n", - "$$\n", + "$\n", + "W_{LS} = 0.3612343\n", + "$\n", "\n", "and:\n", "\n", - "$$\n", - "W_{SG} = 0,3548699\n", - "$$\n", + "$\n", + "W_{SG} = 0.3548699\n", + "$\n", "\n", "and:\n", "\n", - "$$\n", - "W_{SF} = 0,3548699\n", - "$$" + "$\n", + "W_{SF} = 0.3548699\n", + "$" ] }, { @@ -1806,15 +1804,16 @@ "| $\\theta_8$ | 3.08461195 | 2.9319577 |\n", "\n", "where:\n", - "$$\n", - "E_{Scilab} = 17,426613\n", - "$$\n", + "\n", + "$\n", + "E_{Scilab} = 17.426613\n", + "$\n", "\n", "and:\n", "\n", - "$$\n", - "E_{Python} = 17,474865\n", - "$$\n", + "$\n", + "E_{Python} = 17.474865\n", + "$\n", "\n", "#### Note: as mentioned before, the order of the regressors in the model change, but it is the same structure. The tables shows the respective regressor parameter concerning `SysIdentPy` and `IniciacaoCientifica2007`, but the order `θ₁`, `θ₂` and so on are not the same of the ones in model.final_model" ] @@ -1861,11 +1860,11 @@ "source": [ "model's structure that will be utilized (‘IniciacaoCientifica2007’):\n", "\n", - "$$\n", + "$\n", "y(k) = \\theta_1 y(k-1) + \\theta_2 y(k-2) + \\theta_3 + \\theta_4 u(k-1) + \\theta_5 u(k-1)^2 + \\theta_6 u(k-2)u(k-1)+\\theta_7 u(k-2) + \\theta_8 u(k-2)^2\n", - "$$\n", + "$\n", "\n", - "$$\n", + "$\n", "q_i = \n", "\\begin{bmatrix}\n", "0 & 0\\\\\n", @@ -1873,14 +1872,16 @@ "2 & 0\\\\\n", "2 & 2\\\\ \n", "\\end{bmatrix}\n", - "=\n", + "$\n", + "$ = $\n", + "$\n", "\\begin{bmatrix}\n", "1\\\\\n", "\\overline{y}\\\\\n", "\\overline{u}\\\\\n", "\\overline{u^2}\n", "\\end{bmatrix}\n", - "$$" + "$" ] }, { @@ -1890,7 +1891,7 @@ "source": [ "and:\n", "\n", - "$$ \n", + "$\n", "R = \n", "\\begin{bmatrix}\n", "term/\\theta & \\theta_1 & \\theta_2 & \\theta_3 & \\theta_4 & \\theta_5 & \\theta_6 & \\theta_7 & \\theta_8\\\\\n", @@ -1899,7 +1900,7 @@ "\\overline{u} & 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0\\\\\n", "\\overline{u^2} & 0 & 0 & 0 & 0 & 1 & 1 & 0 & 1\n", "\\end{bmatrix}\n", - "$$\n", + "$\n", "\n", "consistent with matrix R:\n", "\n", @@ -1907,7 +1908,7 @@ "\n", "or:\n", "\n", - "$$ \n", + "$ \n", "R = \n", "\\begin{bmatrix}\n", "0 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\\\\n", @@ -1915,7 +1916,7 @@ "0 & 0 & 0 & 1 & 0 & 0 & 1 & 0\\\\\n", "0 & 0 & 0 & 0 & 1 & 1 & 0 & 1\n", "\\end{bmatrix}\n", - "$$" + "$" ] }, { @@ -1923,7 +1924,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Biobjective optimization: An use case applied to Buck converter CC-CC using as objectives the static curve information and the prediction error (dynamic) " + "## Biobjective optimization\n", + "\n", + "### An use case applied to Buck converter CC-CC using as objectives the static curve information and the prediction error (dynamic) " ] }, { @@ -1949,15 +1952,15 @@ "source": [ "the value of theta with the lowest mean squared error obtained through the routine in Scilab was:\n", "\n", - "$$\n", - "W_{LS} = 0,9931126\n", - "$$\n", + "$\n", + "W_{LS} = 0.9931126\n", + "$\n", "\n", "and:\n", "\n", - "$$\n", - "W_{SF} = 0,0068874\n", - "$$" + "$\n", + "W_{SF} = 0.0068874\n", + "$" ] }, { @@ -2369,15 +2372,15 @@ "\n", "where:\n", "\n", - "$$\n", - "E_{Scilab} = 17,408934\n", - "$$\n", + "$\n", + "E_{Scilab} = 17.408934\n", + "$\n", "\n", "and:\n", "\n", - "$$\n", - "E_{Python} = 17,408947\n", - "$$" + "$\n", + "E_{Python} = 17.408947\n", + "$" ] }, { @@ -2385,7 +2388,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Multiobjective parameter estimation considering 2 different objectives: the prediction error and the static gain " + "## Multiobjective parameter estimation\n", + "\n", + "### Use case considering 2 different objectives: the prediction error and the static gain " ] }, { @@ -2400,7 +2405,7 @@ "outputs": [], "source": [ "bi_objective_gain = AILS(\n", - " static_function=False, static_gain=True, final_model=model_final, normalize=False\n", + " static_function=False, static_gain=True, final_model=final_model, normalize=False\n", ")" ] }, @@ -2411,15 +2416,15 @@ "source": [ "the value of theta with the lowest mean squared error obtained through the routine in Scilab was:\n", "\n", - "$$\n", - "W_{LS} = 0,9931126\n", - "$$\n", + "$\n", + "W_{LS} = 0.9931126\n", + "$\n", "\n", "and:\n", "\n", - "$$\n", - "W_{SF} = 0,0068874\n", - "$$\n" + "$\n", + "W_{SF} = 0.0068874\n", + "$\n" ] }, { @@ -2841,22 +2846,22 @@ "\n", "where:\n", "\n", - "$$\n", - "E_{Scilab} = 17,408997\n", - "$$\n", + "$\n", + "E_{Scilab} = 17.408997\n", + "$\n", "\n", "and:\n", "\n", - "$$\n", - "E_{Python} = 17,408781\n", - "$$\n" + "$\n", + "E_{Python} = 17.408781\n", + "$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Additional Information\n", + "## Additional Information\n", "\n", "You can also access the matrix Q and H using the following methods" ] diff --git a/mkdocs.yml b/mkdocs.yml index a988529..f26437b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -157,6 +157,7 @@ nav: - defining-lags: examples/defining_lags.ipynb - miso: examples/multiple_inputs_example.ipynb - parameter-estimation: examples/parameter_estimation.ipynb + - multiobjective-parameter-estimation: examples/multiobjective_parameter_estimation.ipynb - els: examples/extended_least_squares.ipynb - n-steps-prediction: examples/n_steps_ahead_prediction.ipynb - simulating: examples/simulating_a_predefined_model.ipynb @@ -200,6 +201,7 @@ nav: - Neural NARX: code/neural-narx.md - General Estimators: code/general-estimators.md - Parameter Estimation: code/parameter-estimation.md + - Multiobjective Parameter Estimation: code/multiobjective-parameter-estimation.md - Simulation: code/simulation.md - Residual Analysis: code/residues.md - Metaheuristics: code/metaheuristics.md diff --git a/pyproject.toml b/pyproject.toml index 2b88d8e..01b2c70 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,7 +51,7 @@ classifiers = [ "Operating System :: OS Independent", ] -dependencies = ["numpy>=1.19.2,<=1.24.3", "scipy>=1.7.0", "matplotlib>=3.3.2"] +dependencies = ["numpy>=1.19.2,<=1.26", "scipy>=1.7.0", "matplotlib>=3.3.2"] dynamic = ["version"] diff --git a/sysidentpy/__init__.py b/sysidentpy/__init__.py index f9aa3e1..e19434e 100644 --- a/sysidentpy/__init__.py +++ b/sysidentpy/__init__.py @@ -1 +1 @@ -__version__ = "0.3.2" +__version__ = "0.3.3" From 74541d803f23458a616bdbc819382b61f64e59eb Mon Sep 17 00:00:00 2001 From: Wilson Rocha Date: Sun, 24 Sep 2023 15:10:07 -0300 Subject: [PATCH 2/3] update action/checkout to v4 --- .github/workflows/python-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 97087f5..fcc66e2 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -18,9 +18,9 @@ jobs: python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies From 2f4a71b7ea00ce79d099e585ab076f24d12f64ef Mon Sep 17 00:00:00 2001 From: Wilson Rocha Date: Sun, 24 Sep 2023 15:18:10 -0300 Subject: [PATCH 3/3] update changelog --- CHANGELOG | 2 +- docs/changelog/changelog.md | 2 +- docs/changelog/changelog/changelog.md | 2 +- docs/changelog/changelog/index.html | 2195 ++++++++++++++++++++++++- 4 files changed, 2186 insertions(+), 15 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 18365f8..725d621 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -24,7 +24,7 @@ CHANGES - Now you can use AILS to estimate parameters of NARMAX models (and variants) using a multiobjective approach. - AILS can be accessed using `from sysidentpy.multiobjective_parameter_estimation import AILS` - See the docs for a more in depth explanation of how to use AILS. - - This feature is related to Issue #101 + - This feature is related to Issue #101. This work is the result of an undergraduate research conducted by Gabriel Bueno Leandro under the supervision of Samir Milani Martins and Wilson Rocha Lacerda Junior. - API Change: `regressor_code` variable was renamed as `enconding` to avoid using the same name as the method in `narmax_tool` `regressor_code` method. diff --git a/docs/changelog/changelog.md b/docs/changelog/changelog.md index 5b9ca63..138902b 100644 --- a/docs/changelog/changelog.md +++ b/docs/changelog/changelog.md @@ -21,7 +21,7 @@ template: overrides/main.html - Now you can use AILS to estimate parameters of NARMAX models (and variants) using a multiobjective approach. - AILS can be accessed using `from sysidentpy.multiobjective_parameter_estimation import AILS` - See the docs for a more in depth explanation of how to use AILS. - - This feature is related to Issue #101 + - This feature is related to Issue #101. This work is the result of an undergraduate research conducted by Gabriel Bueno Leandro under the supervision of Samir Milani Martins and Wilson Rocha Lacerda Junior. - Several new methods were implemented to get the new feature and you can check all of it in sysidentpy -> multiobjective_parameter_estimation. - API Change: `regressor_code` variable was renamed as `enconding` to avoid using the same name as the method in `narmax_tool` `regressor_code` method. diff --git a/docs/changelog/changelog/changelog.md b/docs/changelog/changelog/changelog.md index 5b9ca63..138902b 100644 --- a/docs/changelog/changelog/changelog.md +++ b/docs/changelog/changelog/changelog.md @@ -21,7 +21,7 @@ template: overrides/main.html - Now you can use AILS to estimate parameters of NARMAX models (and variants) using a multiobjective approach. - AILS can be accessed using `from sysidentpy.multiobjective_parameter_estimation import AILS` - See the docs for a more in depth explanation of how to use AILS. - - This feature is related to Issue #101 + - This feature is related to Issue #101. This work is the result of an undergraduate research conducted by Gabriel Bueno Leandro under the supervision of Samir Milani Martins and Wilson Rocha Lacerda Junior. - Several new methods were implemented to get the new feature and you can check all of it in sysidentpy -> multiobjective_parameter_estimation. - API Change: `regressor_code` variable was renamed as `enconding` to avoid using the same name as the method in `narmax_tool` `regressor_code` method. diff --git a/docs/changelog/changelog/index.html b/docs/changelog/changelog/index.html index 6157a79..b754717 100644 --- a/docs/changelog/changelog/index.html +++ b/docs/changelog/changelog/index.html @@ -1,13 +1,2184 @@ - Changes in SysIdentPy - SysIdentPy

    Changes in SysIdentPy

    v0.3.3

    CONTRIBUTORS

    • wilsonrljr
    • GabrielBuenoLeandro
    • samirmartins

    CHANGES

    • The update v0.3.3 has been released with additional features, API changes and fixes.

    • MAJOR: Multiobjective Framework: Affine Information Least Squares Algorithm (AILS)

      • Now you can use AILS to estimate parameters of NARMAX models (and variants) using a multiobjective approach.
      • AILS can be accessed using from sysidentpy.multiobjective_parameter_estimation import AILS
      • See the docs for a more in depth explanation of how to use AILS.
      • This feature is related to Issue #101
      • Several new methods were implemented to get the new feature and you can check all of it in sysidentpy -> multiobjective_parameter_estimation.
    • API Change: regressor_code variable was renamed as enconding to avoid using the same name as the method in narmax_tool regressor_code method.

    • DATASET: Added buck_id.csv and buck_valid.csv dataset to SysIdentPy repository.

    • DOC: Add a Multiobjetive Parameter Optimization Notebook showing how to use the new AILS method

    • DOC: Minor additions and grammar fixes.

    v0.3.2

    CONTRIBUTORS

    • wilsonrljr

    CHANGES

    • The update v0.3.2 has been released with API changes and fixes.

    • Major:

      • Added Akaike Information Criteria corrected in FROLS. Now the user can use aicc as the information criteria to select the model order when using FROLS algorithm.
    • FIX: Issue #114. Replace yhat with y in root relative squared error. Thanks @miroder

    • TESTS: Minor changes in tests by removing unnecessary data load.

    • Remove unused code and comments.

    • Docs: Minor changes in notebooks. Added AICc method in the information criteria example.

    v0.3.1

    CONTRIBUTORS

    • wilsonrljr

    CHANGES

    • The update v0.3.1 has been released with API changes and fixes.

    • API Change:

      • MetaMSS was returning the max lag of the final model instead of the maximum lag related to the xlag and ylag. This is not wrong (its related to the issue #55), but this change will be made for all methods at the same time. In this respect, I'm reverted this to return the maximum lag of the xlag and ylag.
    • API Change: Added build_matrix method in BaseMSS. This change improved overall code readability by rewriting if/elif/else clauses in every model structure selection algorithm.

    • API Change: Added bic, aic, fpe, and lilc methods in FROLS. Now the method is selected by using a predefined dictionary with the available options. This change improved overall code readability by rewriting if/elif/else clauses in the FROLS algorithm.

    • TESTS: Added tests for Neural NARX class. The issue with pytorch was fixed and now we have the tests for every model class.

    • Remove unused code and comments.

    v0.3.0

    CONTRIBUTORS

    • wilsonrljr
    • gamcorn
    • Gabo-Tor

    CHANGES

    • The update v0.3.0 has been released with additional features, API changes and fixes.

    • MAJOR: Estimators support in AOLS

      • Now you can use any SysIdentPy estimator in AOLS model structure selection.
    • API Change:

      • Refactored base class for model structure selection. A refactored base class for model structure selection has been introduced in SysIdentPy. This update aims to enhance the system identification process by preparing the package for new features that are currently in development, like multiobjective parameter estimation, new basis functions and more.

      Several methods within the base class have undergone significant restructuring to improve their functionality and optimize their performance. This reorganization will facilitate the incorporation of advanced model selection techniques in the future, which will enable users to obtain dynamic models with robust dynamic and static performance. - Avoid unnecessary inheritance in every MSS method and improve the readability with better structured classes. - Rewritten methods to avoid code duplication. - Improve overall code readability by rewriting if/elif/else clauses.

    • Breaking Change: X_train and y_train were replaced respectively by X and y in fit method in MetaMSS model structure selection algorithm. X_test and y_test were replaced by X and y in predict method in MetaMSS.

    • API Change: Added BaseBasisFunction class, an abstract base class for implementing basis functions.

    • Enhancement: Added support for python 3.11.

    • Future Deprecation Warning: The user will have to define the estimator and pass it to every model structure selection algorithm instead of using a string to define the Estimator. Currently the estimator is defined like "estimator='least_squares'". In version 0.4.0 the definition will be like "estimator=LeastSquares()"

    • FIX: Issue #96. Fix issue with numpy 1.24.* version. Thanks for the contribution @gamcorn.

    • FIX: Issue #91. Fix r2_score metric issue with 2 dimensional arrays.

    • FIX: Issue #90.

    • FIX: Issue #88 .Fix one step ahead prediction error in SimulateNARMAX class (thanks for pointing out, Lalith).

    • FIX: Fix error in selecting the correct regressors in AOLS.

    • Fix: Fix n step ahead prediction method not returning all values of the defined steps-ahead value when passing only the initial condition.

    • FIX: Fix Visible Deprecation Warning raised in get_max_lag method.

    • FIX: Fix deprecation warning in Extended Least Squares Example

    • DATASET: Added air passengers dataset to SysIdentPy repository.

    • DATASET: Added San Francisco Hospital Load dataset to SysIdentPy repository.

    • DATASET: Added San Francisco PV GHI dataset to SysIdentPy repository.

    • DOC: Improved documentation in Setting Specif Lags page. Now we bring an example of how to set specific lags for MISO models.

    • DOC: Minor additions and grammar fixes.

    • DOC: Improve image visualization using mkdocs-glightbox.

    • Update dev packages versions

    v0.2.1

    CONTRIBUTORS

    • wilsonrljr

    CHANGES

    • The update v0.2.1 has been released with additional feature, minor API changes and fixes.

    • MAJOR: Neural NARX now support CUDA

      • Now the user can build Neural NARX models with CUDA support. Just add device='cuda' to use the GPU benefits.
      • Updated docs to show how to use the new feature.
    • MAJOR: New documentation website

      • The documentation is now entirely based on Markdown (no rst anymore).
      • We use MkDocs and Material for MkDocs theme now.
      • Dark theme option.
      • The Contribute page have more details to help those who wants to contribute with SysIdentPy.
      • New sections (e.g., Blog, Sponsors, etc.)
      • Many improvements under the hood.
    • MAJOR: Github Sponsor

    • Tests:

      • Now there are test for almost every function.
      • Neural NARX tests are raising numpy issues. It'll be fixed til next update.
    • FIX: NFIR models in General Estimators

      • Fix support for NFIR models using sklearn estimators.
    • The setup is now handled by the pyproject.toml file.

    • Remove unused code.

    • Fix docstring variables.

    • Fix code format issues.

    • Fix minor grammatical and spelling mistakes.

    • Fix issues related to html on Jupyter notebooks examples on documentation.

    • Updated Readme.

    v0.2.0

    CONTRIBUTORS

    • wilsonrljr

    CHANGES

    • The update v0.2.0 has been released with additional feature, minor API changes and fixes.

    • MAJOR: Many new features for General Estimators

      • Now the user can build General NARX models with Fourier basis function.
      • The user can choose which basis they want by importing it from sysidentpy.basis_function. Check the notebooks with examples of how to use it.
      • Now it is possible to build General NAR models. The user just need to pass model_type="NAR" to build NAR models.
      • Now it is possible to build General NFIR models. The user just need to pass model_type="NFIR" to build NAR models.
      • Now it is possible to run n-steps ahead prediction using General Estimators. Until now only infinity-steps ahead were allowed. Now the users can set any steps they want.
      • Polynomial and Fourier are supported for now. New basis functions will be added in next releases.
      • No need to pass the number of inputs anymore.
      • Improved docstring.
      • Fixed minor grammatical and spelling mistakes.
      • many under the hood changes.
    • MAJOR: Many new features for NARX Neural Network

      • Now the user can build Neural NARX models with Fourier basis function.
      • The user can choose which basis they want by importing it from sysidentpy.basis_function. Check the notebooks with examples of how to use it.
      • Now it is possible to build Neural NAR models. The user just need to pass model_type="NAR" to build NAR models.
      • Now it is possible to build Neural NFIR models. The user just need to pass model_type="NFIR" to build NAR models.
      • Now it is possible to run n-steps ahead prediction using Neural NARX. Until now only infinity-steps ahead were allowed. Now the users can set any steps they want.
      • Polynomial and Fourier are supported for now. New basis functions will be added in next releases.
      • No need to pass the number of inputs anymore.
      • Improved docstring.
      • Fixed minor grammatical and spelling mistakes.
      • many under the hood changes.
    • Major: Support for old methods removed.

      • Now the old sysidentpy.PolynomialNarmax is not available anymore. All the old features are included in the new API with a lot of new features and performance improvements.
    • API Change (new): sysidentpy.general_estimators.ModelPrediction

      • ModelPrediction class was adapted to support General Estimators as a stand-alone class.
      • predict: base method for prediction. Support infinity_steps ahead, one-step ahead and n-steps ahead prediction and any basis function.
      • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis function.
      • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial basis.
      • _model_prediction: Perform the infinity-step-ahead prediction for polynomial basis.
      • _narmax_predict: wrapper for NARMAX and NAR models.
      • _nfir_predict: wrapper for NFIR models.
      • _basis_function_predict: Perform the infinity-step-ahead prediction for basis functions other than polynomial.
      • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis functions other than polynomial.
    • API Change (new): sysidentpy.neural_network.ModelPrediction

      • ModelPrediction class was adapted to support Neural NARX as a stand-alone class.
      • predict: base method for prediction. Support infinity_steps ahead, one-step ahead and n-steps ahead prediction and any basis function.
      • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis function.
      • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial basis.
      • _model_prediction: Perform the infinity-step-ahead prediction for polynomial basis.
      • _narmax_predict: wrapper for NARMAX and NAR models.
      • _nfir_predict: wrapper for NFIR models.
      • _basis_function_predict: Perform the infinity-step-ahead prediction for basis functions other than polynomial.
      • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis functions other than polynomial.
    • API Change: Fit method for Neural NARX revamped.

      • No need to convert the data to tensor before calling Fit method anymore.

    API Change: Keyword and positional arguments - Now users have to provide parameters with their names, as keyword arguments, instead of positional arguments. This is valid for every model class now.

    • API Change (new): sysidentpy.utils.narmax_tools

      • New functions to help user getting useful information to build model. Now we have the regressor_code helper function to help to build neural NARX models.
    • DOC: Improved Basic Steps notebook with new details about the prediction function.

    • DOC: NARX Neural Network notebook was updated following the new api and showing new features.
    • DOC: General Estimators notebook was updated following the new api and showing new features.
    • DOC: Fixed minor grammatical and spelling mistakes, including Issues #77 and #78.
    • DOC: Fix issues related to html on Jupyter notebooks examples on documentation.

    v0.1.9

    CONTRIBUTORS

    • wilsonrljr
    • samirmartins

    CHANGES

    • The update v0.1.9 has been released with additional feature, minor API changes and fixes of the new features added in v0.1.7.

    • MAJOR: Entropic Regression Algorithm

      • Added the new class ER to build NARX models using the Entropic Regression algorithm.
      • Only the Mutual Information KNN is implemented in this version and it may take too long to run on a high number of regressor, so the user should be careful regarding the number of candidates to put in the model.
    • API: save_load

      • Added a function to save and load models from file.
    • API: Added tests for python 3.9

    • Fix : Change condition for n_info_values in FROLS. Now the value defined by the user is compared against X matrix shape instead of regressor space shape. This fix the Fourier basis function usage with more the 15 regressors in FROLS.

    • DOC: Save and Load models

      • Added a notebook showing how to use the save_load method.
    • DOC: Entropic Regression example

      • Added notebook with a simple example of how to use AOLS
    • DOC: Fourier Basis Function Example

      • Added notebook with a simple example of how to use Fourier Basis Function
    • DOC: PV forecasting benchmark

      • FIX AOLS prediction. The example was using the meta_mss model in prediction, so the results for AOLS were wrong.
    • DOC: Fixed minor grammatical and spelling mistakes.

    • DOC: Fix issues related to html on Jupyter notebooks examples on documentation.

    v0.1.8

    CONTRIBUTORS

    • wilsonrljr

    CHANGES

    • The update v0.1.8 has been released with additional feature, minor API changes and fixes of the new features added in v0.1.7.

    • MAJOR: Ensemble Basis Functions

      • Now you can use different basis function together. For now we allow to use Fourier combined with Polynomial of different degrees.
    • API change: Add "ensemble" parameter in basis function to combine the features of different basis function.

    • Fix: N-steps ahead prediction for model_type="NAR" is working properly now with different forecast horizon.

    • DOC: Air passenger benchmark

      • Remove unused code.
      • Use default hyperparameter in SysIdentPy models.
    • DOC: Load forecasting benchmark

      • Remove unused code.
      • Use default hyperparameter in SysIdentPy models.
    • DOC: PV forecasting benchmark

      • Remove unused code.
      • Use default hyperparameter in SysIdentPy models.

    v0.1.7

    CONTRIBUTORS

    • wilsonrljr

    CHANGES

    • The update v0.1.7 has been released with major changes and additional features. There are several API modifications and you will need to change your code to have the new (and upcoming) features. All modifications are meant to make future expansion easier.

    • On the user's side, the changes are not that disruptive, but in the background there are many changes that allowed the inclusion of new features and bug fixes that would be complex to solve without the changes. Check the documentation page <http://sysidentpy.org/notebooks.html>__

    • Many classes were basically rebuild it from scratch, so I suggest to look at the new examples of how to use the new version.

    • I will present the main updates below in order to highlight features and usability and then all API changes will be reported.

    • MAJOR: NARX models with Fourier basis function Issue63 <https://github.com/wilsonrljr/sysidentpy/issues/63>, Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>

      • The user can choose which basis they want by importing it from sysidentpy.basis_function. Check the notebooks with examples of how to use it.
      • Polynomial and Fourier are supported for now. New basis functions will be added in next releases.
    • MAJOR: NAR models Issue58 <https://github.com/wilsonrljr/sysidentpy/issues/58>__

      • It was already possible to build Polynomial NAR models, but with some hacks. Now the user just need to pass model_type="NAR" to build NAR models.
      • The user doesn't need to pass a vector of zeros as input anymore.
      • Works for any model structure selection algorithm (FROLS, AOLS, MetaMSS)
    • Major: NFIR models Issue59 <https://github.com/wilsonrljr/sysidentpy/issues/59>__

      • NFIR models are models where the output depends only on past inputs. It was already possible to build Polynomial NFIR models, but with a lot of code on the user's side (much more than NAR, btw). Now the user just need to pass model_type="NFIR" to build NFIR models.
      • Works for any model structure selection algorithm (FROLS, AOLS, MetaMSS)
    • Major: Select the order for the residues lags to use in Extended Least Squares - elag

      • The user can select the maximum lag of the residues to be used in the Extended Least Squares algorithm. In previous versions sysidentpy used a predefined subset of residual lags.
      • The degree of the lags follows the degree of the basis function
    • Major: Residual analysis methods Issue60 <https://github.com/wilsonrljr/sysidentpy/issues/60>__

      • There are now specific functions to calculate the autocorrelation of the residuals and cross-correlation for the analysis of the residuals. In previous versions the calculation was limited to just two inputs, for example, limiting user usability.
    • Major: Plotting methods Issue61 <https://github.com/wilsonrljr/sysidentpy/issues/61>__

      • The plotting functions are now separated from the models objects, so there are more flexibility regarding what to plot.
      • Residual plots were separated from the forecast plot
    • API Change: sysidentpy.polynomial_basis.PolynomialNarmax is deprecated. Use sysidentpy.model_structure_selection.FROLS instead. Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/62>__

      • Now the user doesn't need to pass the number of inputs as a parameter.
      • Added the elag parameter for unbiased_estimator. Now the user can define the number of lags of the residues for parameter estimation using the Extended Least Squares algorithm.
      • model_type parameter: now the user can select the model type to be built. The options are "NARMAX", "NAR" and "NFIR". "NARMAX" is the default. If you want to build a NAR model without any "hack", just set model_type="NAR". The same for "NFIR" models.
    • API Change: sysidentpy.polynomial_basis.MetaMSS is deprecated. Use sysidentpy.model_structure_selection.MetaMSS instead. Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

      • Now the user doesn't need to pass the number of inputs as a parameter.
      • Added the elag parameter for unbiased_estimator. Now the user can define the number of lags of the residues for parameter estimation using the Extended Least Squares algorithm.
    • API Change: sysidentpy.polynomial_basis.AOLS is deprecated. Use sysidentpy.model_structure_selection.AOLS instead. Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

    • API Change: sysidentpy.polynomial_basis.SimulatePolynomialNarmax is deprecated. Use sysidentpy.simulation.SimulateNARMAX instead.

    • API Change: Introducing sysidentpy.basis_function. Because NARMAX models can be built on different basis function, a new module is added to make easier to implement new basis functions in future updates Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__.

      • Each basis function class must have a fit and predict method to be used in training and prediction respectively.
    • API Change: unbiased_estimator method moved to Estimators class.

      • added elag option
      • change the build_information_matrix method to build_output_matrix
    • API Change (new): sysidentpy.narmax_base

      • This is the new base for building NARMAX models. The classes have been rewritten to make it easier to expand functionality.
    • API Change (new): sysidentpy.narmax_base.GenerateRegressors

      • create_narmax_code: Creates the base coding that allows representation for the NARMAX, NAR, and NFIR models.
      • regressor_space: Creates the encoding representation for the NARMAX, NAR, and NFIR models.
    • API Change (new): sysidentpy.narmax_base.ModelInformation

      • _get_index_from_regressor_code: Get the index of the model code representation in regressor space.
      • _list_output_regressor_code: Create a flattened array of output regressors.
      • _list_input_regressor_code: Create a flattened array of input regressors.
      • _get_lag_from_regressor_code: Get the maximum lag from array of regressors.
      • _get_max_lag_from_model_code: the name says it all.
      • _get_max_lag: Get the maximum lag from ylag and xlag.
    • API Change (new): sysidentpy.narmax_base.InformationMatrix

      • _create_lagged_X: Create a lagged matrix of inputs without combinations.
      • _create_lagged_y: Create a lagged matrix of the output without combinations.
      • build_output_matrix: Build the information matrix of output values.
      • build_input_matrix: Build the information matrix of input values.
      • build_input_output_matrix: Build the information matrix of input and output values.
    • API Change (new): sysidentpy.narmax_base.ModelPrediction

      • predict: base method for prediction. Support infinity_steps ahead, one-step ahead and n-steps ahead prediction and any basis function.
      • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis function.
      • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial basis.
      • _model_prediction: Perform the infinity-step-ahead prediction for polynomial basis.
      • _narmax_predict: wrapper for NARMAX and NAR models.
      • _nfir_predict: wrapper for NFIR models.
      • _basis_function_predict: Perform the infinity-step-ahead prediction for basis functions other than polynomial.
      • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis functions other than polynomial.
    • API Change (new): sysidentpy.model_structure_selection.FROLS Issue62 <https://github.com/wilsonrljr/sysidentpy/issues/62>, Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>

      • Based on the old sysidentpy.polynomial_basis.PolynomialNARMAX. The class has been rebuilt with new functions and optimized code.
      • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
      • Add support for new basis functions.
      • The user can choose the residual lags.
      • No need to pass the number of inputs anymore.
      • Improved docstring.
      • Fixed minor grammatical and spelling mistakes.
      • New prediction method.
      • many under the hood changes.
    • API Change (new): sysidentpy.model_structure_selection.MetaMSS Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

      • Based on the old sysidentpy.polynomial_basis.MetaMSS. The class has been rebuilt with new functions and optimized code.
      • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
      • The user can choose the residual lags.
      • Extended Least Squares support.
      • Add support for new basis functions.
      • No need to pass the number of inputs anymore.
      • Improved docstring.
      • Fixed minor grammatical and spelling mistakes.
      • New prediction method.
      • many under the hood changes.
    • API Change (new): sysidentpy.model_structure_selection.AOLS Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__

      • Based on the old sysidentpy.polynomial_basis.AOLS. The class has been rebuilt with new functions and optimized code.
      • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
      • Add support for new basis functions.
      • No need to pass the number of inputs anymore.
      • Improved docstring.
      • Change "l" parameter to "L".
      • Fixed minor grammatical and spelling mistakes.
      • New prediction method.
      • many under the hood changes.
    • API Change (new): sysidentpy.simulation.SimulateNARMAX

      • Based on the old sysidentpy.polynomial_basis.SimulatePolynomialNarmax. The class has been rebuilt with new functions and optimized code.
      • Fix the Extended Least Squares support.
      • Fix n-steps ahead prediction and 1-step ahead prediction.
      • Enforcing keyword-only arguments. This is an effort to promote clear and non-ambiguous use of the library.
      • The user can choose the residual lags.
      • Improved docstring.
      • Fixed minor grammatical and spelling mistakes.
      • New prediction method.
      • Do not inherit from the structure selection algorithm anymore, only from narmax_base. Avoid circular import and other issues.
      • many under the hood changes.
    • API Change (new): sysidentpy.residues

      • compute_residues_autocorrelation: the name says it all.
      • calculate_residues: get the residues from y and yhat.
      • get_unnormalized_e_acf: compute the unnormalized autocorrelation of the residues.
      • compute_cross_correlation: compute cross correlation between two signals.
      • _input_ccf
      • _normalized_correlation: compute the normalized correlation between two signals.
    • API Change (new): sysidentpy.utils.plotting

      • plot_results: plot the forecast
      • plot_residues_correlation: the name says it all.
    • API Change (new): sysidentpy.utils.display_results

      • results: return the model regressors, estimated parameter and ERR index of the fitted model in a table.
    • DOC: Air passenger benchmark Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__

      • Added notebook with Air passenger forecasting benchmark.
      • We compare SysIdentPy against prophet, neuralprophet, autoarima, tbats and many more.
    • DOC: Load forecasting benchmark Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__

      • Added notebook with load forecasting benchmark.
    • DOC: PV forecasting benchmark Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__

      • Added notebook with PV forecasting benchmark.
    • DOC: Presenting main functionality

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Multiple Inputs usage

      • Example rewritten following the new api
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Information Criteria - Examples

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Important notes and examples of how to use Extended Least Squares

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Setting specific lags

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Parameter Estimation

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Using the Meta-Model Structure Selection (MetaMSS) algorithm for building Polynomial NARX models

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Using the Accelerated Orthogonal Least-Squares algorithm for building Polynomial NARX models

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Example: F-16 Ground Vibration Test benchmark

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Building NARX Neural Network using Sysidentpy

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Building NARX models using general estimators

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Simulate a Predefined Model

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: System Identification Using Adaptive Filters

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Identification of an electromechanical system

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Example: N-steps-ahead prediction - F-16 Ground Vibration Test benchmark

      • Example rewritten following the new api.
      • Fixed minor grammatical and spelling mistakes.
    • DOC: Introduction to NARMAX models

      • Fixed grammatical and spelling mistakes.

    v0.1.6

    CONTRIBUTORS

    • wilsonrljr

    CHANGES

    • MAJOR: Meta-Model Structure Selection Algorithm (Meta-MSS).

      • A new method for build NARMAX models based on metaheuristics. The algorithm uses a Binary hybrid Particle Swarm Optimization and Gravitational Search Algorithm with a new cost function to build parsimonious models.
      • New class for the BPSOGSA algorithm. New algorithms can be adapted in the Meta-MSS framework.
      • Future updates will add NARX models for classification and multiobjective model structure selection.
    • MAJOR: Accelerated Orthogonal Least-Squares algorithm.

      • Added the new class AOLS to build NARX models using the Accelerated Orthogonal Least-Squares algorithm.
      • At the best of my knowledge, this is the first time this algorithm is used in the NARMAX framework. The tests I've made are promising, but use it with caution until the results are formalized into a research paper.
    • Added notebook with a simple example of how to use MetaMSS and a simple model comparison of the Electromechanical system.

    • Added notebook with a simple example of how to use AOLS

    • Added ModelInformation class. This class have methods to return model information such as max_lag of a model code.

      • added _list_output_regressor_code
      • added _list_input_regressor_code
      • added _get_lag_from_regressor_code
      • added _get_max_lag_from_model_code
    • Minor performance improvement: added the argument "predefined_regressors" in build_information_matrix function on base.py to improve the performance of the Simulation method.

    • Pytorch is now an optional dependency. Use pip install sysidentpy['full']

    • Fix code format issues.

    • Fixed minor grammatical and spelling mistakes.

    • Fix issues related to html on Jupyter notebooks examples on documentation.

    • Updated Readme with examples of how to use.

    • Improved descriptions and comments in methods.

    • metaheuristics.bpsogsa (detailed description on code docstring)

      • added evaluate_objective_function
      • added optimize
      • added generate_random_population
      • added mass_calculation
      • added calculate_gravitational_constant
      • added calculate_acceleration
      • added update_velocity_position
    • FIX issue #52

    v0.1.5

    CONTRIBUTORS

    • wilsonrljr

    CHANGES

    • MAJOR: n-steps-ahead prediction.

      • Now you can define the numbers of steps ahead in the predict function.
      • Only for Polynomial models for now. Next update will bring this functionality to Neural NARX and General Estimators.
    • MAJOR: Simulating predefined models.

      • Added the new class SimulatePolynomialNarmax to handle the simulation of known model structures.
      • Now you can simulate predefined models by just passing the model structure codification. Check the notebook examples.
    • Added 4 new notebooks in the example section.

    • Added iterative notebooks. Now you can run the notebooks in Jupyter notebook section of the documentation in Colab.

    • Fix code format issues.

    • Added new tests for SimulatePolynomialNarmax and generate_data.

    • Started changes related to numpy 1.19.4 update. There are still some Deprecation warnings that will be fixed in next update.

    • Fix issues related to html on Jupyter notebooks examples on documentation.

    • Updated Readme with examples of how to use.

    v0.1.4

    CONTRIBUTORS

    • wilsonrljr

    CHANGES

    • MAJOR: Introducing NARX Neural Network in SysIdentPy.

      • Now you can build NARX Neural Network on SysIdentPy.
      • This feature is built on top of Pytorch. See the docs for more details and examples of how to use.
    • MAJOR: Introducing general estimators in SysIdentPy.

      • Now you are able to use any estimator that have Fit/Predict methods (estimators from Sklearn and Catboost, for example) and build NARX models based on those estimators.
      • We use the core functions of SysIdentPy and keep the Fit/Predict approach from those estimators to keep the process easy to use.
      • More estimators are coming soon like XGboost.
    • Added notebooks to show how to build NARX neural Network.

    • Added notebooks to show how to build NARX models using general estimators.

    • Changed the default parameters of the plot_results function.

    • NOTE: We will keeping improving the Polynomial NARX models (new model structure selection algorithms and multiobjective identification is on our roadmap). These recent modifications will allow us to introduce new NARX models like PWARX models very soon.

    • New template for the documentation site.

    • Fix issues related to html on Jupyter notebooks examples on documentation.

    • Updated Readme with examples of how to use.

    v0.1.3

    CONTRIBUTORS

    • wilsonrljr
    • renard162

    CHANGES

    • Fixed a bug concerning the xlag and ylag in multiple input scenarios.
    • Refactored predict function. Improved performance up to 87% depending on the number of regressors.
    • You can set lags with different size for each input.
    • Added a new function to get the max value of xlag and ylag. Work with int, list, nested lists.
    • Fixed tests for information criteria.
    • Added SysIdentPy logo.
    • Refactored code of all classes following PEP 8 guidelines to improve readability.
    • Added Citation information on Readme.
    • Changes on information Criteria tests.
    • Added workflow to run the tests when merge branch into master.
    • Added new site domain.
    • Updated docs.
    \ No newline at end of file + + + + + + + + + + + + + Changes in SysIdentPy - SysIdentPy + + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + + + + + +

    Changes in SysIdentPy

    +

    v0.3.3

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    • GabrielBuenoLeandro
    • +
    • samirmartins
    • +
    +

    CHANGES

    +
      +
    • +

      The update v0.3.3 has been released with additional features, API + changes and fixes.

      +
    • +
    • +

      MAJOR: Multiobjective Framework: Affine Information Least Squares Algorithm (AILS) +

      +
        +
      • Now you can use AILS to estimate parameters of NARMAX models (and variants) + using a multiobjective approach.
      • +
      • AILS can be accessed using + from sysidentpy.multiobjective_parameter_estimation import AILS +
      • +
      • See the docs for a more in depth explanation of how to use AILS.
      • +
      • This feature is related to Issue #101. This work is + the result of an undergraduate research conducted by Gabriel Bueno Leandro under + the supervision of Samir Milani Martins and Wilson Rocha Lacerda Junior.
      • +
      • Several new methods were implemented to get the new feature and you can check + all of it in sysidentpy -> multiobjective_parameter_estimation.
      • +
      +
    • +
    • +

      API Change: regressor_code variable was renamed as + enconding to avoid using the same name as the method in + narmax_tool regressor_code method. +

      +
    • +
    • +

      DATASET: Added buck_id.csv and buck_valid.csv dataset to SysIdentPy repository.

      +
    • +
    • +

      DOC: Add a Multiobjetive Parameter Optimization Notebook showing how to use the new + AILS method

      +
    • +
    • +

      DOC: Minor additions and grammar fixes.

      +
    • +
    +

    v0.3.2

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    +

    CHANGES +

    +
      +
    • +

      The update v0.3.2 has been released with API changes and fixes.

      +
    • +
    • +

      Major:

      +
        +
      • Added Akaike Information Criteria corrected in FROLS. Now the user can use aicc + as the information criteria to select the model order when using FROLS + algorithm.
      • +
      +
    • +
    • +

      FIX: Issue #114. Replace yhat with + y in root relative squared error. Thanks @miroder

      +
    • +
    • +

      TESTS: Minor changes in tests by removing unnecessary data load.

      +
    • +
    • +

      Remove unused code and comments.

      +
    • +
    • +

      Docs: Minor changes in notebooks. Added AICc method in the information criteria + example.

      +
    • +
    +

    v0.3.1

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    +

    CHANGES +

    +
      +
    • +

      The update v0.3.1 has been released with API changes and fixes.

      +
    • +
    • +

      API Change:

      +
        +
      • MetaMSS was returning the max lag of the final model instead of the maximum lag + related to the xlag and ylag. This is not wrong (its related to the issue #55), but this + change will be made for all methods at the same time. In this respect, I'm + reverted this to return the maximum lag of the xlag and ylag.
      • +
      +
    • +
    • +

      API Change: Added build_matrix method in BaseMSS. This change improved overall code + readability by rewriting if/elif/else clauses in every model structure selection + algorithm.

      +
    • +
    • +

      API Change: Added bic, aic, fpe, and lilc methods in FROLS. Now the method is + selected by using a predefined dictionary with the available options. This change + improved overall code readability by rewriting if/elif/else clauses in the FROLS + algorithm.

      +
    • +
    • +

      TESTS: Added tests for Neural NARX class. The issue with pytorch was fixed and now we + have the tests for every model class.

      +
    • +
    • +

      Remove unused code and comments.

      +
    • +
    +

    v0.3.0

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    • gamcorn
    • +
    • Gabo-Tor
    • +
    +

    CHANGES +

    +
      +
    • +

      The update v0.3.0 has been released with additional features, API + changes and fixes.

      +
    • +
    • +

      MAJOR: Estimators support in AOLS

      +
        +
      • Now you can use any SysIdentPy estimator in AOLS model structure selection. +
      • +
      +
    • +
    • +

      API Change:

      +
        +
      • Refactored base class for model structure selection. A refactored base class for + model structure selection has been introduced in SysIdentPy. This update aims to + enhance the system identification process by preparing the package for new + features that are currently in development, like multiobjective parameter + estimation, new basis functions and more.
      • +
      +

      Several methods within the base class have undergone significant restructuring to + improve their functionality and optimize their performance. This reorganization will + facilitate the incorporation of advanced model selection techniques in the future, + which will enable users to obtain dynamic models with robust dynamic and static + performance. - Avoid unnecessary inheritance in every MSS method and improve the + readability with better structured classes. - Rewritten methods to avoid code + duplication. - Improve overall code readability by rewriting if/elif/else clauses. +

      +
    • +
    • +

      Breaking Change: X_train and y_train were replaced + respectively by X and y in fit method in + MetaMSS model structure selection algorithm. X_test and + y_test were replaced by X and y in + predict method in MetaMSS. +

      +
    • +
    • +

      API Change: Added BaseBasisFunction class, an abstract base class for implementing + basis functions.

      +
    • +
    • +

      Enhancement: Added support for python 3.11.

      +
    • +
    • +

      Future Deprecation Warning: The user will have to define the estimator and pass it to + every model structure selection algorithm instead of using a string to define the + Estimator. Currently the estimator is defined like "estimator='least_squares'". In + version 0.4.0 the definition will be like "estimator=LeastSquares()"

      +
    • +
    • +

      FIX: Issue #96. Fix issue with + numpy 1.24.* version. Thanks for the contribution @gamcorn.

      +
    • +
    • +

      FIX: Issue #91. Fix r2_score metric + issue with 2 dimensional arrays.

      +
    • +
    • +

      FIX: Issue #90.

      +
    • +
    • +

      FIX: Issue #88 .Fix one step ahead + prediction error in SimulateNARMAX class (thanks for pointing out, Lalith).

      +
    • +
    • +

      FIX: Fix error in selecting the correct regressors in AOLS.

      +
    • +
    • +

      Fix: Fix n step ahead prediction method not returning all values of the defined + steps-ahead value when passing only the initial condition.

      +
    • +
    • +

      FIX: Fix Visible Deprecation Warning raised in get_max_lag method.

      +
    • +
    • +

      FIX: Fix deprecation warning in Extended Least Squares Example

      +
    • +
    • +

      DATASET: Added air passengers dataset to SysIdentPy repository.

      +
    • +
    • +

      DATASET: Added San Francisco Hospital Load dataset to SysIdentPy repository.

      +
    • +
    • +

      DATASET: Added San Francisco PV GHI dataset to SysIdentPy repository.

      +
    • +
    • +

      DOC: Improved documentation in Setting Specif Lags page. Now we bring an example of + how to set specific lags for MISO models.

      +
    • +
    • +

      DOC: Minor additions and grammar fixes.

      +
    • +
    • +

      DOC: Improve image visualization using mkdocs-glightbox.

      +
    • +
    • +

      Update dev packages versions

      +
    • +
    +

    v0.2.1

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    +

    CHANGES +

    +
      +
    • +

      The update v0.2.1 has been released with additional feature, minor + API changes and fixes.

      +
    • +
    • +

      MAJOR: Neural NARX now support CUDA

      +
        +
      • Now the user can build Neural NARX models with CUDA support. Just add + device='cuda' to use the GPU benefits. +
      • +
      • Updated docs to show how to use the new feature.
      • +
      +
    • +
    • +

      MAJOR: New documentation website

      +
        +
      • The documentation is now entirely based on Markdown (no rst anymore).
      • +
      • We use MkDocs and Material for MkDocs theme now.
      • +
      • Dark theme option.
      • +
      • The Contribute page have more details to help those who wants to contribute with + SysIdentPy.
      • +
      • New sections (e.g., Blog, Sponsors, etc.)
      • +
      • Many improvements under the hood.
      • +
      +
    • +
    • +

      MAJOR: Github Sponsor

      + +
    • +
    • +

      Tests:

      +
        +
      • Now there are test for almost every function.
      • +
      • Neural NARX tests are raising numpy issues. It'll be fixed til next update.
      • +
      +
    • +
    • +

      FIX: NFIR models in General Estimators

      +
        +
      • Fix support for NFIR models using sklearn estimators.
      • +
      +
    • +
    • +

      The setup is now handled by the pyproject.toml file.

      +
    • +
    • +

      Remove unused code.

      +
    • +
    • +

      Fix docstring variables.

      +
    • +
    • +

      Fix code format issues.

      +
    • +
    • +

      Fix minor grammatical and spelling mistakes.

      +
    • +
    • +

      Fix issues related to html on Jupyter notebooks examples on documentation.

      +
    • +
    • +

      Updated Readme.

      +
    • +
    +

    v0.2.0

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    +

    CHANGES +

    +
      +
    • +

      The update v0.2.0 has been released with additional feature, minor + API changes and fixes.

      +
    • +
    • +

      MAJOR: Many new features for General Estimators

      +
        +
      • Now the user can build General NARX models with Fourier basis function.
      • +
      • The user can choose which basis they want by importing it from + sysidentpy.basis_function. Check the notebooks with examples of how to use it. +
      • +
      • Now it is possible to build General NAR models. The user just need to pass + model_type="NAR" to build NAR models.
      • +
      • Now it is possible to build General NFIR models. The user just need to pass + model_type="NFIR" to build NAR models.
      • +
      • Now it is possible to run n-steps ahead prediction using General Estimators. + Until now only infinity-steps ahead were allowed. Now the users can set any + steps they want.
      • +
      • Polynomial and Fourier are supported for now. New basis functions will be added + in next releases.
      • +
      • No need to pass the number of inputs anymore.
      • +
      • Improved docstring.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      • many under the hood changes.
      • +
      +
    • +
    • +

      MAJOR: Many new features for NARX Neural Network

      +
        +
      • Now the user can build Neural NARX models with Fourier basis function.
      • +
      • The user can choose which basis they want by importing it from + sysidentpy.basis_function. Check the notebooks with examples of how to use it. +
      • +
      • Now it is possible to build Neural NAR models. The user just need to pass + model_type="NAR" to build NAR models.
      • +
      • Now it is possible to build Neural NFIR models. The user just need to pass + model_type="NFIR" to build NAR models.
      • +
      • Now it is possible to run n-steps ahead prediction using Neural NARX. Until now + only infinity-steps ahead were allowed. Now the users can set any steps they + want.
      • +
      • Polynomial and Fourier are supported for now. New basis functions will be added + in next releases.
      • +
      • No need to pass the number of inputs anymore.
      • +
      • Improved docstring.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      • many under the hood changes.
      • +
      +
    • +
    • +

      Major: Support for old methods removed.

      +
        +
      • Now the old sysidentpy.PolynomialNarmax is not available anymore. All the old + features are included in the new API with a lot of new features and performance + improvements.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.general_estimators.ModelPrediction

      +
        +
      • ModelPrediction class was adapted to support General Estimators as a stand-alone + class.
      • +
      • predict: base method for prediction. Support infinity_steps ahead, one-step + ahead and n-steps ahead prediction and any basis function.
      • +
      • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis + function.
      • +
      • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial + basis.
      • +
      • _model_prediction: Perform the infinity-step-ahead prediction for polynomial + basis.
      • +
      • _narmax_predict: wrapper for NARMAX and NAR models.
      • +
      • _nfir_predict: wrapper for NFIR models.
      • +
      • _basis_function_predict: Perform the infinity-step-ahead prediction for basis + functions other than polynomial.
      • +
      • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis + functions other than polynomial.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.neural_network.ModelPrediction

      +
        +
      • ModelPrediction class was adapted to support Neural NARX as a stand-alone class. +
      • +
      • predict: base method for prediction. Support infinity_steps ahead, one-step + ahead and n-steps ahead prediction and any basis function.
      • +
      • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis + function.
      • +
      • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial + basis.
      • +
      • _model_prediction: Perform the infinity-step-ahead prediction for polynomial + basis.
      • +
      • _narmax_predict: wrapper for NARMAX and NAR models.
      • +
      • _nfir_predict: wrapper for NFIR models.
      • +
      • _basis_function_predict: Perform the infinity-step-ahead prediction for basis + functions other than polynomial.
      • +
      • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis + functions other than polynomial.
      • +
      +
    • +
    • +

      API Change: Fit method for Neural NARX revamped.

      +
        +
      • No need to convert the data to tensor before calling Fit method anymore.
      • +
      +
    • +
    +

    API Change: Keyword and positional arguments - Now users have to provide parameters with + their names, as keyword arguments, instead of positional arguments. This is valid for every + model class now.

    +
      +
    • +

      API Change (new): sysidentpy.utils.narmax_tools

      +
        +
      • New functions to help user getting useful information to build model. Now we + have the regressor_code helper function to help to build neural NARX models. +
      • +
      +
    • +
    • +

      DOC: Improved Basic Steps notebook with new details about the prediction function. +

      +
    • +
    • DOC: NARX Neural Network notebook was updated following the new api and showing new + features.
    • +
    • DOC: General Estimators notebook was updated following the new api and showing new + features.
    • +
    • DOC: Fixed minor grammatical and spelling mistakes, including Issues #77 and #78.
    • +
    • DOC: Fix issues related to html on Jupyter notebooks examples on documentation.
    • +
    +

    v0.1.9

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    • samirmartins
    • +
    +

    CHANGES +

    +
      +
    • +

      The update v0.1.9 has been released with additional feature, minor + API changes and fixes of the new features added in v0.1.7.

      +
    • +
    • +

      MAJOR: Entropic Regression Algorithm

      +
        +
      • Added the new class ER to build NARX models using the Entropic Regression + algorithm.
      • +
      • Only the Mutual Information KNN is implemented in this version and it may take + too long to run on a high number of regressor, so the user should be careful + regarding the number of candidates to put in the model.
      • +
      +
    • +
    • +

      API: save_load

      +
        +
      • Added a function to save and load models from file.
      • +
      +
    • +
    • +

      API: Added tests for python 3.9

      +
    • +
    • +

      Fix : Change condition for n_info_values in FROLS. Now the value defined by the user + is compared against X matrix shape instead of regressor space shape. This fix the + Fourier basis function usage with more the 15 regressors in FROLS.

      +
    • +
    • +

      DOC: Save and Load models

      +
        +
      • Added a notebook showing how to use the save_load method.
      • +
      +
    • +
    • +

      DOC: Entropic Regression example

      +
        +
      • Added notebook with a simple example of how to use AOLS
      • +
      +
    • +
    • +

      DOC: Fourier Basis Function Example

      +
        +
      • Added notebook with a simple example of how to use Fourier Basis Function
      • +
      +
    • +
    • +

      DOC: PV forecasting benchmark

      +
        +
      • FIX AOLS prediction. The example was using the meta_mss model in prediction, so + the results for AOLS were wrong.
      • +
      +
    • +
    • +

      DOC: Fixed minor grammatical and spelling mistakes.

      +
    • +
    • +

      DOC: Fix issues related to html on Jupyter notebooks examples on documentation.

      +
    • +
    +

    v0.1.8

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    +

    CHANGES +

    +
      +
    • +

      The update v0.1.8 has been released with additional feature, minor + API changes and fixes of the new features added in v0.1.7.

      +
    • +
    • +

      MAJOR: Ensemble Basis Functions

      +
        +
      • Now you can use different basis function together. For now we allow to use + Fourier combined with Polynomial of different degrees.
      • +
      +
    • +
    • +

      API change: Add "ensemble" parameter in basis function to combine the features of + different basis function.

      +
    • +
    • +

      Fix: N-steps ahead prediction for model_type="NAR" is working properly now with + different forecast horizon.

      +
    • +
    • +

      DOC: Air passenger benchmark

      +
        +
      • Remove unused code.
      • +
      • Use default hyperparameter in SysIdentPy models.
      • +
      +
    • +
    • +

      DOC: Load forecasting benchmark

      +
        +
      • Remove unused code.
      • +
      • Use default hyperparameter in SysIdentPy models.
      • +
      +
    • +
    • +

      DOC: PV forecasting benchmark

      +
        +
      • Remove unused code.
      • +
      • Use default hyperparameter in SysIdentPy models.
      • +
      +
    • +
    +

    v0.1.7

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    +

    CHANGES +

    +
      +
    • +

      The update v0.1.7 has been released with major changes and + additional features. There are several API modifications and you will need to change + your code to have the new (and upcoming) features. All modifications are meant to + make future expansion easier.

      +
    • +
    • +

      On the user's side, the changes are not that disruptive, but in the background there + are many changes that allowed the inclusion of new features and bug fixes that would + be complex to solve without the changes. Check the + documentation page <http://sysidentpy.org/notebooks.html>__ +

      +
    • +
    • +

      Many classes were basically rebuild it from scratch, so I suggest to look at the new + examples of how to use the new version.

      +
    • +
    • +

      I will present the main updates below in order to highlight features and usability + and then all API changes will be reported.

      +
    • +
    • +

      MAJOR: NARX models with Fourier basis function + Issue63 <https://github.com/wilsonrljr/sysidentpy/issues/63>, + Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64> +

      +
        +
      • The user can choose which basis they want by importing it from + sysidentpy.basis_function. Check the notebooks with examples of how to use it. +
      • +
      • Polynomial and Fourier are supported for now. New basis functions will be added + in next releases.
      • +
      +
    • +
    • +

      MAJOR: NAR models + Issue58 <https://github.com/wilsonrljr/sysidentpy/issues/58>__ +

      +
        +
      • It was already possible to build Polynomial NAR models, but with some hacks. Now + the user just need to pass model_type="NAR" to build NAR models.
      • +
      • The user doesn't need to pass a vector of zeros as input anymore.
      • +
      • Works for any model structure selection algorithm (FROLS, AOLS, MetaMSS)
      • +
      +
    • +
    • +

      Major: NFIR models + Issue59 <https://github.com/wilsonrljr/sysidentpy/issues/59>__ +

      +
        +
      • NFIR models are models where the output depends only on past inputs. It was + already possible to build Polynomial NFIR models, but with a lot of code on the + user's side (much more than NAR, btw). Now the user just need to pass + model_type="NFIR" to build NFIR models.
      • +
      • Works for any model structure selection algorithm (FROLS, AOLS, MetaMSS)
      • +
      +
    • +
    • +

      Major: Select the order for the residues lags to use in Extended Least Squares - elag +

      +
        +
      • The user can select the maximum lag of the residues to be used in the Extended + Least Squares algorithm. In previous versions sysidentpy used a predefined + subset of residual lags.
      • +
      • The degree of the lags follows the degree of the basis function
      • +
      +
    • +
    • +

      Major: Residual analysis methods + Issue60 <https://github.com/wilsonrljr/sysidentpy/issues/60>__ +

      +
        +
      • There are now specific functions to calculate the autocorrelation of the + residuals and cross-correlation for the analysis of the residuals. In previous + versions the calculation was limited to just two inputs, for example, limiting + user usability.
      • +
      +
    • +
    • +

      Major: Plotting methods + Issue61 <https://github.com/wilsonrljr/sysidentpy/issues/61>__ +

      +
        +
      • The plotting functions are now separated from the models objects, so there are + more flexibility regarding what to plot.
      • +
      • Residual plots were separated from the forecast plot
      • +
      +
    • +
    • +

      API Change: sysidentpy.polynomial_basis.PolynomialNarmax is deprecated. Use + sysidentpy.model_structure_selection.FROLS instead. + Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/62>__ +

      +
        +
      • Now the user doesn't need to pass the number of inputs as a parameter.
      • +
      • Added the elag parameter for unbiased_estimator. Now the user can define the + number of lags of the residues for parameter estimation using the Extended Least + Squares algorithm.
      • +
      • model_type parameter: now the user can select the model type to be built. The + options are "NARMAX", "NAR" and "NFIR". "NARMAX" is the default. If you want to + build a NAR model without any "hack", just set model_type="NAR". The same for + "NFIR" models.
      • +
      +
    • +
    • +

      API Change: sysidentpy.polynomial_basis.MetaMSS is deprecated. Use + sysidentpy.model_structure_selection.MetaMSS instead. + Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__ +

      +
        +
      • Now the user doesn't need to pass the number of inputs as a parameter.
      • +
      • Added the elag parameter for unbiased_estimator. Now the user can define the + number of lags of the residues for parameter estimation using the Extended Least + Squares algorithm.
      • +
      +
    • +
    • +

      API Change: sysidentpy.polynomial_basis.AOLS is deprecated. Use + sysidentpy.model_structure_selection.AOLS instead. + Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__ +

      +
    • +
    • +

      API Change: sysidentpy.polynomial_basis.SimulatePolynomialNarmax is deprecated. Use + sysidentpy.simulation.SimulateNARMAX instead.

      +
    • +
    • +

      API Change: Introducing sysidentpy.basis_function. Because NARMAX models can be built + on different basis function, a new module is added to make easier to implement new + basis functions in future updates + Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__. +

      +
        +
      • Each basis function class must have a fit and predict method to be used in + training and prediction respectively.
      • +
      +
    • +
    • +

      API Change: unbiased_estimator method moved to Estimators class.

      +
        +
      • added elag option
      • +
      • change the build_information_matrix method to build_output_matrix
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.narmax_base

      +
        +
      • This is the new base for building NARMAX models. The classes have been rewritten + to make it easier to expand functionality.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.narmax_base.GenerateRegressors

      +
        +
      • create_narmax_code: Creates the base coding that allows representation for the + NARMAX, NAR, and NFIR models.
      • +
      • regressor_space: Creates the encoding representation for the NARMAX, NAR, and + NFIR models.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.narmax_base.ModelInformation

      +
        +
      • _get_index_from_regressor_code: Get the index of the model code representation + in regressor space.
      • +
      • _list_output_regressor_code: Create a flattened array of output regressors.
      • +
      • _list_input_regressor_code: Create a flattened array of input regressors.
      • +
      • _get_lag_from_regressor_code: Get the maximum lag from array of regressors.
      • +
      • _get_max_lag_from_model_code: the name says it all.
      • +
      • _get_max_lag: Get the maximum lag from ylag and xlag.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.narmax_base.InformationMatrix

      +
        +
      • _create_lagged_X: Create a lagged matrix of inputs without combinations.
      • +
      • _create_lagged_y: Create a lagged matrix of the output without combinations. +
      • +
      • build_output_matrix: Build the information matrix of output values.
      • +
      • build_input_matrix: Build the information matrix of input values.
      • +
      • build_input_output_matrix: Build the information matrix of input and output + values.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.narmax_base.ModelPrediction

      +
        +
      • predict: base method for prediction. Support infinity_steps ahead, one-step + ahead and n-steps ahead prediction and any basis function.
      • +
      • _one_step_ahead_prediction: Perform the 1-step-ahead prediction for any basis + function.
      • +
      • _n_step_ahead_prediction: Perform the n-step-ahead prediction for polynomial + basis.
      • +
      • _model_prediction: Perform the infinity-step-ahead prediction for polynomial + basis.
      • +
      • _narmax_predict: wrapper for NARMAX and NAR models.
      • +
      • _nfir_predict: wrapper for NFIR models.
      • +
      • _basis_function_predict: Perform the infinity-step-ahead prediction for basis + functions other than polynomial.
      • +
      • basis_function_n_step_prediction: Perform the n-step-ahead prediction for basis + functions other than polynomial.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.model_structure_selection.FROLS + Issue62 <https://github.com/wilsonrljr/sysidentpy/issues/62>, + Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64> +

      +
        +
      • Based on the old sysidentpy.polynomial_basis.PolynomialNARMAX. The class has + been rebuilt with new functions and optimized code.
      • +
      • Enforcing keyword-only arguments. This is an effort to promote clear and + non-ambiguous use of the library.
      • +
      • Add support for new basis functions.
      • +
      • The user can choose the residual lags.
      • +
      • No need to pass the number of inputs anymore.
      • +
      • Improved docstring.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      • New prediction method.
      • +
      • many under the hood changes.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.model_structure_selection.MetaMSS + Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__ +

      +
        +
      • Based on the old sysidentpy.polynomial_basis.MetaMSS. The class has been rebuilt + with new functions and optimized code.
      • +
      • Enforcing keyword-only arguments. This is an effort to promote clear and + non-ambiguous use of the library.
      • +
      • The user can choose the residual lags.
      • +
      • Extended Least Squares support.
      • +
      • Add support for new basis functions.
      • +
      • No need to pass the number of inputs anymore.
      • +
      • Improved docstring.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      • New prediction method.
      • +
      • many under the hood changes.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.model_structure_selection.AOLS + Issue64 <https://github.com/wilsonrljr/sysidentpy/issues/64>__ +

      +
        +
      • Based on the old sysidentpy.polynomial_basis.AOLS. The class has been rebuilt + with new functions and optimized code.
      • +
      • Enforcing keyword-only arguments. This is an effort to promote clear and + non-ambiguous use of the library.
      • +
      • Add support for new basis functions.
      • +
      • No need to pass the number of inputs anymore.
      • +
      • Improved docstring.
      • +
      • Change "l" parameter to "L".
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      • New prediction method.
      • +
      • many under the hood changes.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.simulation.SimulateNARMAX

      +
        +
      • Based on the old sysidentpy.polynomial_basis.SimulatePolynomialNarmax. The class + has been rebuilt with new functions and optimized code.
      • +
      • Fix the Extended Least Squares support.
      • +
      • Fix n-steps ahead prediction and 1-step ahead prediction.
      • +
      • Enforcing keyword-only arguments. This is an effort to promote clear and + non-ambiguous use of the library.
      • +
      • The user can choose the residual lags.
      • +
      • Improved docstring.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      • New prediction method.
      • +
      • Do not inherit from the structure selection algorithm anymore, only from + narmax_base. Avoid circular import and other issues.
      • +
      • many under the hood changes.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.residues

      +
        +
      • compute_residues_autocorrelation: the name says it all.
      • +
      • calculate_residues: get the residues from y and yhat.
      • +
      • get_unnormalized_e_acf: compute the unnormalized autocorrelation of the + residues.
      • +
      • compute_cross_correlation: compute cross correlation between two signals.
      • +
      • _input_ccf
      • +
      • _normalized_correlation: compute the normalized correlation between two signals. +
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.utils.plotting

      +
        +
      • plot_results: plot the forecast
      • +
      • plot_residues_correlation: the name says it all.
      • +
      +
    • +
    • +

      API Change (new): sysidentpy.utils.display_results

      +
        +
      • results: return the model regressors, estimated parameter and ERR index of the + fitted model in a table.
      • +
      +
    • +
    • +

      DOC: Air passenger benchmark + Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__ +

      +
        +
      • Added notebook with Air passenger forecasting benchmark.
      • +
      • We compare SysIdentPy against prophet, neuralprophet, autoarima, tbats and many + more.
      • +
      +
    • +
    • +

      DOC: Load forecasting benchmark + Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__ +

      +
        +
      • Added notebook with load forecasting benchmark.
      • +
      +
    • +
    • +

      DOC: PV forecasting benchmark + Issue65 <https://github.com/wilsonrljr/sysidentpy/issues/65>__ +

      +
        +
      • Added notebook with PV forecasting benchmark.
      • +
      +
    • +
    • +

      DOC: Presenting main functionality

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Multiple Inputs usage

      +
        +
      • Example rewritten following the new api
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Information Criteria - Examples

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Important notes and examples of how to use Extended Least Squares

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Setting specific lags

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Parameter Estimation

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Using the Meta-Model Structure Selection (MetaMSS) algorithm for building + Polynomial NARX models

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Using the Accelerated Orthogonal Least-Squares algorithm for building Polynomial + NARX models

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Example: F-16 Ground Vibration Test benchmark

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Building NARX Neural Network using Sysidentpy

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Building NARX models using general estimators

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Simulate a Predefined Model

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: System Identification Using Adaptive Filters

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Identification of an electromechanical system

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Example: N-steps-ahead prediction - F-16 Ground Vibration Test benchmark

      +
        +
      • Example rewritten following the new api.
      • +
      • Fixed minor grammatical and spelling mistakes.
      • +
      +
    • +
    • +

      DOC: Introduction to NARMAX models

      +
        +
      • Fixed grammatical and spelling mistakes.
      • +
      +
    • +
    +

    v0.1.6

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    +

    CHANGES +

    +
      +
    • +

      MAJOR: Meta-Model Structure Selection Algorithm (Meta-MSS).

      +
        +
      • A new method for build NARMAX models based on metaheuristics. The algorithm uses + a Binary hybrid Particle Swarm Optimization and Gravitational Search Algorithm + with a new cost function to build parsimonious models.
      • +
      • New class for the BPSOGSA algorithm. New algorithms can be adapted in the + Meta-MSS framework.
      • +
      • Future updates will add NARX models for classification and multiobjective model + structure selection.
      • +
      +
    • +
    • +

      MAJOR: Accelerated Orthogonal Least-Squares algorithm.

      +
        +
      • Added the new class AOLS to build NARX models using the Accelerated Orthogonal + Least-Squares algorithm.
      • +
      • At the best of my knowledge, this is the first time this algorithm is used in + the NARMAX framework. The tests I've made are promising, but use it with caution + until the results are formalized into a research paper.
      • +
      +
    • +
    • +

      Added notebook with a simple example of how to use MetaMSS and a simple model + comparison of the Electromechanical system.

      +
    • +
    • +

      Added notebook with a simple example of how to use AOLS

      +
    • +
    • +

      Added ModelInformation class. This class have methods to return model information + such as max_lag of a model code.

      +
        +
      • added _list_output_regressor_code
      • +
      • added _list_input_regressor_code
      • +
      • added _get_lag_from_regressor_code
      • +
      • added _get_max_lag_from_model_code
      • +
      +
    • +
    • +

      Minor performance improvement: added the argument "predefined_regressors" in + build_information_matrix function on base.py to improve the performance of the + Simulation method.

      +
    • +
    • +

      Pytorch is now an optional dependency. Use pip install sysidentpy['full']

      +
    • +
    • +

      Fix code format issues.

      +
    • +
    • +

      Fixed minor grammatical and spelling mistakes.

      +
    • +
    • +

      Fix issues related to html on Jupyter notebooks examples on documentation.

      +
    • +
    • +

      Updated Readme with examples of how to use.

      +
    • +
    • +

      Improved descriptions and comments in methods.

      +
    • +
    • +

      metaheuristics.bpsogsa (detailed description on code docstring)

      +
        +
      • added evaluate_objective_function
      • +
      • added optimize
      • +
      • added generate_random_population
      • +
      • added mass_calculation
      • +
      • added calculate_gravitational_constant
      • +
      • added calculate_acceleration
      • +
      • added update_velocity_position
      • +
      +
    • +
    • +

      FIX issue #52

      +
    • +
    +

    v0.1.5

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    +

    CHANGES +

    +
      +
    • +

      MAJOR: n-steps-ahead prediction.

      +
        +
      • Now you can define the numbers of steps ahead in the predict function.
      • +
      • Only for Polynomial models for now. Next update will bring this functionality to + Neural NARX and General Estimators.
      • +
      +
    • +
    • +

      MAJOR: Simulating predefined models.

      +
        +
      • Added the new class SimulatePolynomialNarmax to handle the simulation of known + model structures.
      • +
      • Now you can simulate predefined models by just passing the model structure + codification. Check the notebook examples.
      • +
      +
    • +
    • +

      Added 4 new notebooks in the example section.

      +
    • +
    • +

      Added iterative notebooks. Now you can run the notebooks in Jupyter notebook section + of the documentation in Colab.

      +
    • +
    • +

      Fix code format issues.

      +
    • +
    • +

      Added new tests for SimulatePolynomialNarmax and generate_data.

      +
    • +
    • +

      Started changes related to numpy 1.19.4 update. There are still some Deprecation + warnings that will be fixed in next update.

      +
    • +
    • +

      Fix issues related to html on Jupyter notebooks examples on documentation.

      +
    • +
    • +

      Updated Readme with examples of how to use.

      +
    • +
    +

    v0.1.4

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    +

    CHANGES +

    +
      +
    • +

      MAJOR: Introducing NARX Neural Network in SysIdentPy.

      +
        +
      • Now you can build NARX Neural Network on SysIdentPy.
      • +
      • This feature is built on top of Pytorch. See the docs for more details and + examples of how to use.
      • +
      +
    • +
    • +

      MAJOR: Introducing general estimators in SysIdentPy.

      +
        +
      • Now you are able to use any estimator that have Fit/Predict methods (estimators + from Sklearn and Catboost, for example) and build NARX models based on those + estimators.
      • +
      • We use the core functions of SysIdentPy and keep the Fit/Predict approach from + those estimators to keep the process easy to use.
      • +
      • More estimators are coming soon like XGboost.
      • +
      +
    • +
    • +

      Added notebooks to show how to build NARX neural Network.

      +
    • +
    • +

      Added notebooks to show how to build NARX models using general estimators.

      +
    • +
    • +

      Changed the default parameters of the plot_results function.

      +
    • +
    • +

      NOTE: We will keeping improving the Polynomial NARX models (new model structure + selection algorithms and multiobjective identification is on our roadmap). These + recent modifications will allow us to introduce new NARX models like PWARX models + very soon.

      +
    • +
    • +

      New template for the documentation site.

      +
    • +
    • +

      Fix issues related to html on Jupyter notebooks examples on documentation.

      +
    • +
    • +

      Updated Readme with examples of how to use.

      +
    • +
    +

    v0.1.3

    +

    CONTRIBUTORS

    +
      +
    • wilsonrljr
    • +
    • renard162
    • +
    +

    CHANGES +

    +
      +
    • Fixed a bug concerning the xlag and ylag in multiple input scenarios.
    • +
    • Refactored predict function. Improved performance up to 87% depending on the number of + regressors.
    • +
    • You can set lags with different size for each input.
    • +
    • Added a new function to get the max value of xlag and ylag. Work with int, list, nested + lists.
    • +
    • Fixed tests for information criteria.
    • +
    • Added SysIdentPy logo.
    • +
    • Refactored code of all classes following PEP 8 guidelines to improve readability.
    • +
    • Added Citation information on Readme.
    • +
    • Changes on information Criteria tests.
    • +
    • Added workflow to run the tests when merge branch into master.
    • +
    • Added new site domain.
    • +
    • Updated docs.
    • +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file