packages feed

clustering-0.4.0: benchmarks/Bench/KMeans.hs

module Bench.KMeans
    ( benchKMeans ) where

import           Criterion.Main
import qualified Data.Matrix.Unboxed  as MU
import qualified Data.Vector.Unboxed  as U
import           Data.Word
import           System.IO.Unsafe
import           System.Random.MWC

import           AI.Clustering.KMeans
import           Bench.Utils

gen :: U.Vector Word32
gen = unsafePerformIO $ do
    g <- createSystemRandom
    fmap fromSeed $ save g

matrix_1000_10 :: MU.Matrix Double
matrix_1000_10 = unsafePerformIO $ fmap MU.fromRows $ randVectors 1000 10

matrix_30000_50 :: MU.Matrix Double
matrix_30000_50 = unsafePerformIO $ fmap MU.fromRows $ randVectors 30000 50

benchKMeans :: Benchmark
benchKMeans = bgroup "KMeans clustering"
    [ bgroup "AI.Clustering.KMeans"
        [ bench "k-means++ (size = 1000 X 10, k = 7)" $
            whnf ( \x -> membership $ kmeans 7 x defaultKMeansOpts
                { kmeansMethod = KMeansPP
                , kmeansSeed = gen } ) matrix_1000_10
        , bench "forgy (size = 1000 X 10, k = 7)" $
            whnf ( \x -> membership $ kmeans 7 x defaultKMeansOpts
                { kmeansMethod = Forgy
                , kmeansSeed = gen } ) matrix_1000_10
        , bench "k-means++ (size = 30000 X 50, k = 10)" $
            whnf ( \x -> membership $ kmeans 10 x defaultKMeansOpts
                { kmeansMethod = KMeansPP
                , kmeansSeed = gen } ) matrix_30000_50
        , bench "forgy (size = 30000 X 50, k = 10)" $
            whnf ( \x -> membership $ kmeans 10 x defaultKMeansOpts
                { kmeansMethod = Forgy
                , kmeansSeed = gen } ) matrix_30000_50
        ]
    ]