class _LstsqL2Solver(Solver): """Base class for L2-regularized least-squares solvers.""" reg = NumberParam('reg', low=0) solver = LeastSquaresSolverParam('solver') def __init__(self, weights=False, reg=0.1, solver=lstsq.Cholesky()): """ Parameters ---------- weights : bool, optional (Default: False) If False, solve for decoders. If True, solve for weights. reg : float, optional (Default: 0.1) Amount of regularization, as a fraction of the neuron activity. solver : `.LeastSquaresSolver`, optional (Default: ``Cholesky()``) Subsolver to use for solving the least squares problem. Attributes ---------- reg : float Amount of regularization, as a fraction of the neuron activity. solver : `.LeastSquaresSolver` Subsolver to use for solving the least squares problem. weights : bool If False, solve for decoders. If True, solve for weights. """ super(_LstsqL2Solver, self).__init__(weights=weights) self.reg = reg self.solver = solver
class _LstsqNoiseSolver(Solver): """Base class for least-squares solvers with noise.""" noise = NumberParam('noise', low=0) solver = LeastSquaresSolverParam('solver') def __init__(self, weights=False, noise=0.1, solver=lstsq.Cholesky()): """ Parameters ---------- weights : bool, optional (Default: False) If False, solve for decoders. If True, solve for weights. noise : float, optional (Default: 0.1) Amount of noise, as a fraction of the neuron activity. solver : `.LeastSquaresSolver`, optional (Default: ``Cholesky()``) Subsolver to use for solving the least squares problem. Attributes ---------- noise : float Amount of noise, as a fraction of the neuron activity. solver : `.LeastSquaresSolver` Subsolver to use for solving the least squares problem. weights : bool If False, solve for decoders. If True, solve for weights. """ super(_LstsqNoiseSolver, self).__init__(weights=weights) self.noise = noise self.solver = solver
class LstsqL2(Solver): """Least-squares solver with L2 regularization.""" reg = NumberParam("reg", low=0) solver = LeastSquaresSolverParam("solver") def __init__(self, weights=False, reg=0.1, solver=lstsq.Cholesky()): super().__init__(weights=weights) self.reg = reg self.solver = solver def __call__(self, A, Y, rng=np.random): tstart = time.time() sigma = self.reg * A.max() X, info = self.solver(A, Y, sigma, rng=rng) info["time"] = time.time() - tstart return X, info
class LstsqNoise(Solver): """Least-squares solver with additive Gaussian white noise.""" noise = NumberParam("noise", low=0) solver = LeastSquaresSolverParam("solver") def __init__(self, weights=False, noise=0.1, solver=lstsq.Cholesky()): super().__init__(weights=weights) self.noise = noise self.solver = solver def __call__(self, A, Y, rng=np.random): tstart = time.time() sigma = self.noise * np.amax(np.abs(A)) A = A + rng.normal(scale=sigma, size=A.shape) X, info = self.solver(A, Y, 0, rng=rng) info["time"] = time.time() - tstart return X, info