Source code for pysindy.optimizers.wrapped_optimizer

import numpy as np
from sklearn.multioutput import MultiOutputRegressor

from .base import BaseOptimizer

COEF_THRESHOLD = 1e-14


[docs]class WrappedOptimizer(BaseOptimizer): """Wrapper class for generic optimizers/sparse regression methods Enables single target regressors (i.e. those whose predictions are 1-dimensional) to perform multi target regression (i.e. predictions are 2-dimensional). Also allows unbiasing & normalization for optimizers that would otherwise not include it. Args: optimizer: wrapped optimizer/sparse regression method Parameters ---------- optimizer: estimator object The optimizer/sparse regressor to be wrapped, implementing ``fit`` and ``predict``. ``optimizer`` should also have the attribute ``coef_``. Any optimizer that supports a ``fit_intercept`` argument should be initialized to False. """ def __init__(self, optimizer, *args, **kwargs): super().__init__(*args, **kwargs) self.optimizer = MultiOutputRegressor(optimizer) def _reduce(self, x, y): coef_shape = (y.shape[1], x.shape[1]) self.coef_ = np.zeros(coef_shape) self.ind_ = np.ones(coef_shape) self.optimizer.fit(x, y) coef_list = [ np.reshape(est.coef_, (-1, coef_shape[1])) for est in self.optimizer.estimators_ ] self.coef_ = np.concatenate(coef_list, axis=0) self.ind_ = np.abs(self.coef_) > COEF_THRESHOLD self.intercept_ = 0.0 return self
[docs] def predict(self, x): return self.optimizer.predict(x)
@property def complexity(self): return np.count_nonzero(self.coef_) + np.count_nonzero(self.intercept_)