module Data.Clustering.Hierarchical
(
Dendrogram(..)
,Distance
,elements
,cutAt
,Linkage(..)
,dendrogram
) where
import Data.Clustering.Hierarchical.Internal.Types (Dendrogram(..), Linkage(..), Distance)
import qualified Data.Clustering.Hierarchical.Internal.DistanceMatrix as DM
import qualified Data.Clustering.Hierarchical.Internal.Optimal as O
elements :: Dendrogram a -> [a]
elements :: Dendrogram a -> [a]
elements = [a] -> Dendrogram a -> [a]
forall a. [a] -> Dendrogram a -> [a]
go []
where
go :: [a] -> Dendrogram a -> [a]
go acc :: [a]
acc (Leaf x :: a
x) = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
acc
go acc :: [a]
acc (Branch _ l :: Dendrogram a
l r :: Dendrogram a
r) = [a] -> Dendrogram a -> [a]
go ([a] -> Dendrogram a -> [a]
go [a]
acc Dendrogram a
r) Dendrogram a
l
cutAt :: Dendrogram a -> Distance -> [Dendrogram a]
cutAt :: Dendrogram a -> Distance -> [Dendrogram a]
cutAt dendro :: Dendrogram a
dendro threshold :: Distance
threshold = [Dendrogram a] -> Dendrogram a -> [Dendrogram a]
forall a. [Dendrogram a] -> Dendrogram a -> [Dendrogram a]
go [] Dendrogram a
dendro
where
go :: [Dendrogram a] -> Dendrogram a -> [Dendrogram a]
go acc :: [Dendrogram a]
acc x :: Dendrogram a
x@(Leaf _) = Dendrogram a
x Dendrogram a -> [Dendrogram a] -> [Dendrogram a]
forall a. a -> [a] -> [a]
: [Dendrogram a]
acc
go acc :: [Dendrogram a]
acc x :: Dendrogram a
x@(Branch d :: Distance
d l :: Dendrogram a
l r :: Dendrogram a
r) | Distance
d Distance -> Distance -> Bool
forall a. Ord a => a -> a -> Bool
<= Distance
threshold = Dendrogram a
x Dendrogram a -> [Dendrogram a] -> [Dendrogram a]
forall a. a -> [a] -> [a]
: [Dendrogram a]
acc
| Bool
otherwise = [Dendrogram a] -> Dendrogram a -> [Dendrogram a]
go ([Dendrogram a] -> Dendrogram a -> [Dendrogram a]
go [Dendrogram a]
acc Dendrogram a
r) Dendrogram a
l
dendrogram :: Linkage
-> [a]
-> (a -> a -> Distance)
-> Dendrogram a
dendrogram :: Linkage -> [a] -> (a -> a -> Distance) -> Dendrogram a
dendrogram SingleLinkage = [a] -> (a -> a -> Distance) -> Dendrogram a
forall a. [a] -> (a -> a -> Distance) -> Dendrogram a
O.singleLinkage
dendrogram CompleteLinkage = [a] -> (a -> a -> Distance) -> Dendrogram a
forall a. [a] -> (a -> a -> Distance) -> Dendrogram a
DM.completeLinkage
dendrogram CLINK = [a] -> (a -> a -> Distance) -> Dendrogram a
forall a. [a] -> (a -> a -> Distance) -> Dendrogram a
O.completeLinkage
dendrogram UPGMA = [a] -> (a -> a -> Distance) -> Dendrogram a
forall a. [a] -> (a -> a -> Distance) -> Dendrogram a
DM.upgma
dendrogram FakeAverageLinkage = [a] -> (a -> a -> Distance) -> Dendrogram a
forall a. [a] -> (a -> a -> Distance) -> Dendrogram a
DM.fakeAverageLinkage