hanalyze-0.2.0.0: test/Hanalyze/Model/HierarchicalClusterSpec.hs
{-# OPTIONS_GHC -Wno-unused-imports #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
module Hanalyze.Model.HierarchicalClusterSpec (spec) where
import Test.Hspec
import Test.Hspec.QuickCheck (prop)
import Test.QuickCheck
import Hanalyze.Model.Formula
import Hanalyze.Model.Formula.Frame
import Hanalyze.Model.Formula.Design
import Hanalyze.Model.Formula.RFormula
import Hanalyze.Model.Formula.Nonlinear
import Hanalyze.Model.Formula.Mixed
import Hanalyze.Model.GLMM
import Hanalyze.Model.GLM (Family (..), LinkFn (..))
import Hanalyze.Stat.Distribution (Transform)
import Data.List (sort, nub)
import Control.Monad (forM, forM_)
import System.IO.Temp (withSystemTempFile)
import System.IO (hPutStr, hClose)
import Hanalyze.Model.HBM.Ast (Expr (..), Lit (..), DoStmt (..), Err)
import Data.IORef (newIORef, readIORef, modifyIORef')
import qualified Data.Vector as V
import qualified Numeric.LinearAlgebra as LA
import qualified Hanalyze.Model.HierarchicalCluster as HC
import SpecHelper
spec :: Spec
spec = do
describe "Hanalyze.Model.HierarchicalCluster (Phase 12)" $ do
let blob = LA.fromLists
[ [0,0], [0.1,0], [0,0.1] -- cluster A
, [5,5], [5.1,5], [5,5.1] -- cluster B
]
it "fitHierarchical Ward: 6 サンプルで 5 マージ" $ do
let fit = HC.fitHierarchical HC.Ward blob
length (HC.hcMerges fit) `shouldBe` 5
length (HC.hcHeights fit) `shouldBe` 5
it "cutTree K=2 で 2 ブロブが分離" $ do
let fit = HC.fitHierarchical HC.Ward blob
ids = HC.cutTree fit 2
half = V.length (V.filter (== V.head ids) ids)
half `shouldBe` 3
it "Single linkage でも 5 マージ系列" $ do
let fit = HC.fitHierarchical HC.Single blob
length (HC.hcMerges fit) `shouldBe` 5
it "Complete linkage 高さは Single 以上" $ do
let fS = HC.fitHierarchical HC.Single blob
fC = HC.fitHierarchical HC.Complete blob
last (HC.hcHeights fC) `shouldSatisfy` (>= last (HC.hcHeights fS) - 1e-9)