module HLearn.Algebra.Models.HomTrainer
(
HomTrainer (..)
, WeightedHomTrainer (..)
, NumDP(..)
, sub1dp
, subBatch
, sub1dpW
, subBatchW
)
where
import qualified Control.ConstraintKinds as CK
import Data.Foldable
import HLearn.Algebra.Functions
import HLearn.Algebra.Structures.Groups
import HLearn.Algebra.Structures.Modules
class (HasRing model) => NumDP model where
numdp :: model -> Ring model
class (Monoid model) => HomTrainer model where
type Datapoint model
train1dp :: Datapoint model -> model
train1dp = unbatch train
train ::
( Functor container
, Foldable container
) => container (Datapoint model) -> model
train = batch train1dp
add1dp :: model -> Datapoint model -> model
add1dp model = online train1dp model
addBatch ::
( Functor container
, Foldable container
) => model -> container (Datapoint model) -> model
addBatch model = online train model
trainCK ::
( CK.Functor container
, CK.FunctorConstraint container model
, CK.FunctorConstraint container (Datapoint model)
, CK.Foldable container
, CK.FoldableConstraint container model
, CK.FoldableConstraint container (Datapoint model)
) => container (Datapoint model) -> model
trainCK = batchCK train1dp
addBatchCK ::
( CK.Functor container
, CK.FunctorConstraint container model
, CK.FunctorConstraint container (Datapoint model)
, CK.Foldable container
, CK.FoldableConstraint container model
, CK.FoldableConstraint container (Datapoint model)
) => model -> container (Datapoint model) -> model
addBatchCK model = online trainCK model
type WeightedDatapoint model = (Ring model, Datapoint model)
class (Module model, HomTrainer model) =>
WeightedHomTrainer model
where
train1dpW :: (Ring model,Datapoint model) -> model
train1dpW (r,dp) = r .* train1dp dp
trainW :: (Foldable container, Functor container) =>
container (Ring model,Datapoint model) -> model
trainW = batch train1dpW
add1dpW :: model -> WeightedDatapoint model -> model
add1dpW = online $ unbatch $ offline addBatchW
addBatchW :: (Foldable container, Functor container) =>
model -> container (WeightedDatapoint model) -> model
addBatchW = online trainW
instance (Module model, HomTrainer model) => WeightedHomTrainer model
sub1dp :: (Group model, HomTrainer model) => model -> Datapoint model -> model
sub1dp m dp = m <> inverse (train1dp dp)
subBatch :: (Group model, HomTrainer model, Foldable container, Functor container) =>
model -> container (Datapoint model) -> model
subBatch m dpL = m <> inverse (train dpL)
sub1dpW :: (Group model, WeightedHomTrainer model) => model -> WeightedDatapoint model -> model
sub1dpW m dp = m <> inverse (train1dpW dp)
subBatchW :: (Group model, WeightedHomTrainer model, Foldable container, Functor container) =>
model -> container (WeightedDatapoint model) -> model
subBatchW m dpL = m <> inverse (trainW dpL)