-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathKMeans.hs
More file actions
27 lines (22 loc) · 834 Bytes
/
KMeans.hs
File metadata and controls
27 lines (22 loc) · 834 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import Space
import Control.Monad.State
import Control.Monad.Trans.Maybe
import Control.Arrow
type KMeansState v = State (Maybe [v])
kMeansStep :: (Distanceable v, Averageable v, Eq v) => [v] -> KMeansState v ()
kMeansStep vs = do
maybeMs <- get
put $ do
ms <- maybeMs
sequence $ map meanPoint $ cluster vs ms -- map (flip filter vs . (>>>) (flip closest ms) . (==)) $ ms
cluster :: (Distanceable v, Eq v) => [v] -> [v] -> [[v]]
cluster vs ms = map (flip filter vs . (>>>) (flip closest ms) . (==)) $ ms
kMeansF :: (Distanceable v, Averageable v, Eq v) => [v] -> KMeansState v ()
kMeansF vs = do
ms <- get
kMeansStep vs
ms' <- get
if ms == ms' then return () else kMeansF vs
kMeans :: (Distanceable v, Averageable v, Eq v) => Int -> [v] -> Maybe [v]
kMeans n vs =
execState (kMeansF vs) $ Just $ take n vs