Source code for esnpy.train

# -*- coding: utf-8 -*-
from abc import ABC, abstractmethod
import numpy as np
from scipy import linalg
from .type import MatrixType
from .reader import MatrixReader, SklearnReader

__all__ = ["Trainer", "RidgeTrainer", "SklearnTrainer"]


[docs]class Trainer(ABC):
[docs] def train( self, inputs: MatrixType, states: MatrixType, target: MatrixType ) -> MatrixType: data = [] if self._bias: data.append(np.ones((states.shape[0], 1))) if self._input: data.append(inputs) data.append(states) data = np.hstack(data) return self.compute_readout(data, target)
[docs] @abstractmethod def compute_readout( self, data: MatrixType, target: MatrixType ) -> MatrixType: pass
@property @abstractmethod def use_bias(self): pass @property @abstractmethod def use_input(self): pass
[docs]class RidgeTrainer(Trainer): def __init__(self, alpha: float, use_bias: bool = True, use_input=True): super().__init__() self._alpha = alpha self._bias = use_bias self._input = use_input @property def use_bias(self): return self._bias @property def use_input(self): return self._input
[docs] def compute_readout( self, data: MatrixType, target: MatrixType ) -> MatrixType: return MatrixReader( linalg.solve( data.T @ data + self._alpha * np.eye(data.shape[1]), data.T @ target, ) )
[docs]class SklearnTrainer(Trainer): def __init__(self, sklearn_model, use_bias: bool = True, use_input=True): super().__init__() self._model = sklearn_model self._bias = use_bias self._input = use_input @property def use_bias(self): return self._bias @property def use_input(self): return self._input
[docs] def compute_readout( self, data: MatrixType, target: MatrixType ) -> MatrixType: self._model.fit(data, target) return SklearnReader(self._model)