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
]
]