module HLearn.Models.Classifiers.Centroid
where
import qualified Data.Vector.Unboxed as VU
import HLearn.Algebra
data Centroid vector = Centroid
{ c_numdp :: Ring vector
, vector :: vector
}
deriving instance (Show (Ring vector), Show vector) => Show (Centroid vector)
deriving instance (Read (Ring vector), Read vector) => Read (Centroid vector)
deriving instance (Eq (Ring vector), Eq vector) => Eq (Centroid vector)
deriving instance (Ord (Ring vector), Ord vector) => Ord (Centroid vector)
instance (HasRing vector, Monoid vector) => Monoid (Centroid vector) where
mempty = Centroid 0 mempty
c1 `mappend` c2 = Centroid
{ c_numdp = c_numdp c1 + c_numdp c2
, vector = vector c1 <> vector c2
}
instance (HasRing vector) => HasRing (Centroid vector) where
type Ring (Centroid vector) = Ring vector
instance
( MetricSpace vector
, VectorSpace vector
) => MetricSpace (Centroid vector)
where
distance v1 v2 = distance (vector v1 /. c_numdp v1) (vector v2 /. c_numdp v2)
instance (HasRing vector) => NumDP (Centroid vector) where
numdp = c_numdp
instance
( HasRing vector
, Monoid vector
) => HomTrainer (Centroid vector)
where
type Datapoint (Centroid vector) = vector
train1dp dp = Centroid { c_numdp=1, vector=dp }