Estimação de Parâmetros - Visão Geral¶
Exemplo criado por Wilson Rocha Lacerda Junior
Procurando mais detalhes sobre modelos NARMAX? Para informações completas sobre modelos, métodos e uma ampla variedade de exemplos e benchmarks implementados no SysIdentPy, confira nosso livro: Nonlinear System Identification and Forecasting: Theory and Practice With SysIdentPy
Este livro oferece orientação aprofundada para apoiar seu trabalho com o SysIdentPy.
Aqui importamos o modelo NARMAX, a métrica para avaliação do modelo e os métodos para gerar dados de amostra para testes. Também importamos o pandas para uso específico.
import pandas as pd
from sysidentpy.model_structure_selection import FROLS
from sysidentpy.basis_function import Polynomial
from sysidentpy.parameter_estimation import (
TotalLeastSquares,
RecursiveLeastSquares,
NonNegativeLeastSquares,
LeastMeanSquares,
AffineLeastMeanSquares,
)
from sysidentpy.metrics import root_relative_squared_error
from sysidentpy.utils.generate_data import get_siso_data
from sysidentpy.utils.display_results import results
Gerando dados de amostra com 1 entrada e 1 saída¶
Os dados são gerados simulando o seguinte modelo:
\(y_k = 0.2y_{k-1} + 0.1y_{k-1}x_{k-1} + 0.9x_{k-1} + e_{k}\)
Se colored_noise for definido como True:
\(e_{k} = 0.8\nu_{k-1} + \nu_{k}\)
onde \(x\) é uma variável aleatória uniformemente distribuída e \(\nu\) é uma variável com distribuição gaussiana com \(\mu=0\) e \(\sigma=0.1\)
No próximo exemplo, geraremos dados com 1000 amostras com ruído branco e selecionando 90% dos dados para treinar o modelo.
x_train, x_valid, y_train, y_valid = get_siso_data(
n=1000, colored_noise=False, sigma=0.001, train_percentage=90
)
Existem vários métodos para estimação de parâmetros.¶
- Least Squares;
- Total Least Squares;
- Recursive Least Squares
- Ridge Regression
- NonNegative Least Squares
- Least Squares Minimal Residues
- Bounded Variable Least Squares
- Least Mean Squares
- Affine Least Mean Squares
- Least Mean Squares Sign Error
- Normalized Least Mean Squares
- Least Mean Squares Normalized Sign Error
- Least Mean Squares Sign Regressor
- Least Mean Squares Normalized Sign Regressor
- Least Mean Squares Sign Sign
- Least Mean Squares Normalized Sign Sign
- Least Mean Squares Normalized Leaky
- Least Mean Squares Leaky
- Least Mean Squares Fourth
- Least Mean Squares Mixed Norm
Modelos NARMAX polinomiais são lineares nos parâmetros, então métodos baseados em Least Squares funcionam bem para a maioria dos casos (usando com o algoritmo Extended Least Squares ao lidar com ruído colorido).
No entanto, o usuário pode escolher alguns métodos recursivos e de gradiente descendente estocástico (neste caso, o algoritmo Least Mean Squares e suas variantes) para essa tarefa também.
Escolher o método é simples: passe qualquer um dos métodos mencionados acima no parâmetro estimator.
- Nota: Cada algoritmo tem parâmetros específicos que precisam ser ajustados. Nos exemplos a seguir, usaremos os valores padrão. Mais exemplos sobre ajuste de parâmetros estarão disponíveis em breve. Por enquanto, o usuário pode ler a documentação do método para mais informações.
Total Least Squares¶
basis_function = Polynomial(degree=2)
estimator = TotalLeastSquares()
model = FROLS(
order_selection=False,
n_terms=3,
ylag=2,
xlag=2,
estimator=estimator,
basis_function=basis_function,
)
model.fit(X=x_train, y=y_train)
yhat = model.predict(X=x_valid, y=y_valid)
rrse = root_relative_squared_error(y_valid, yhat)
print(rrse)
r = pd.DataFrame(
results(
model.final_model,
model.theta,
model.err,
model.n_terms,
err_precision=8,
dtype="sci",
),
columns=["Regressors", "Parameters", "ERR"],
)
print(r)
0.0021167167052431584
Regressors Parameters ERR
0 x1(k-2) 9.0000E-01 9.56200123E-01
1 y(k-1) 1.9995E-01 4.05078042E-02
2 x1(k-1)y(k-1) 1.0004E-01 3.28866604E-03
Recursive Least Squares¶
# recursive least squares
basis_function = Polynomial(degree=2)
estimator = RecursiveLeastSquares()
model = FROLS(
order_selection=False,
n_terms=3,
ylag=2,
xlag=2,
estimator=estimator,
basis_function=basis_function,
)
model.fit(X=x_train, y=y_train)
yhat = model.predict(X=x_valid, y=y_valid)
rrse = root_relative_squared_error(y_valid, yhat)
print(rrse)
r = pd.DataFrame(
results(
model.final_model,
model.theta,
model.err,
model.n_terms,
err_precision=8,
dtype="sci",
),
columns=["Regressors", "Parameters", "ERR"],
)
print(r)
0.0020703083403116164
Regressors Parameters ERR
0 x1(k-2) 9.0012E-01 9.56200123E-01
1 y(k-1) 2.0021E-01 4.05078042E-02
2 x1(k-1)y(k-1) 9.9550E-02 3.28866604E-03
Least Mean Squares¶
basis_function = Polynomial(degree=2)
estimator = LeastMeanSquares()
model = FROLS(
order_selection=False,
n_terms=3,
ylag=2,
xlag=2,
estimator=estimator,
basis_function=basis_function,
)
model.fit(X=x_train, y=y_train)
yhat = model.predict(X=x_valid, y=y_valid)
rrse = root_relative_squared_error(y_valid, yhat)
print(rrse)
r = pd.DataFrame(
results(
model.final_model,
model.theta,
model.err,
model.n_terms,
err_precision=8,
dtype="sci",
),
columns=["Regressors", "Parameters", "ERR"],
)
print(r)
0.015488793944313425
Regressors Parameters ERR
0 x1(k-2) 8.9775E-01 9.56200123E-01
1 y(k-1) 2.0085E-01 4.05078042E-02
2 x1(k-1)y(k-1) 7.5708E-02 3.28866604E-03
Affine Least Mean Squares¶
basis_function = Polynomial(degree=2)
estimator = AffineLeastMeanSquares()
model = FROLS(
order_selection=False,
n_terms=3,
ylag=2,
xlag=2,
estimator=estimator,
basis_function=basis_function,
)
model.fit(X=x_train, y=y_train)
yhat = model.predict(X=x_valid, y=y_valid)
rrse = root_relative_squared_error(y_valid, yhat)
print(rrse)
r = pd.DataFrame(
results(
model.final_model,
model.theta,
model.err,
model.n_terms,
err_precision=8,
dtype="sci",
),
columns=["Regressors", "Parameters", "ERR"],
)
print(r)
0.0021441596280611167
Regressors Parameters ERR
0 x1(k-2) 8.9989E-01 9.56200123E-01
1 y(k-1) 1.9992E-01 4.05078042E-02
2 x1(k-1)y(k-1) 1.0003E-01 3.28866604E-03
NonNegative Least Squares¶
basis_function = Polynomial(degree=2)
estimator = NonNegativeLeastSquares()
model = FROLS(
order_selection=False,
n_terms=3,
ylag=2,
xlag=2,
estimator=estimator,
basis_function=basis_function,
)
model.fit(X=x_train, y=y_train)
yhat = model.predict(X=x_valid, y=y_valid)
rrse = root_relative_squared_error(y_valid, yhat)
print(rrse)
r = pd.DataFrame(
results(
model.final_model,
model.theta,
model.err,
model.n_terms,
err_precision=8,
dtype="sci",
),
columns=["Regressors", "Parameters", "ERR"],
)
print(r)
0.0021170157359329173
Regressors Parameters ERR
0 x1(k-2) 9.0000E-01 9.56200123E-01
1 y(k-1) 1.9995E-01 4.05078042E-02
2 x1(k-1)y(k-1) 1.0004E-01 3.28866604E-03