hmm-hmatrix 0.1 → 0.1.0.1
raw patch · 7 files changed
+32/−37 lines, 7 filesdep ~containers
Dependency ranges changed: containers
Files
- hmm-hmatrix.cabal +3/−3
- src/Math/HiddenMarkovModel.hs +2/−2
- src/Math/HiddenMarkovModel/CSV.hs +3/−8
- src/Math/HiddenMarkovModel/Distribution.hs +10/−12
- src/Math/HiddenMarkovModel/Normalized.hs +3/−5
- src/Math/HiddenMarkovModel/Private.hs +9/−3
- src/Math/HiddenMarkovModel/Utility.hs +2/−4
hmm-hmatrix.cabal view
@@ -1,5 +1,5 @@ Name: hmm-hmatrix-Version: 0.1+Version: 0.1.0.1 Synopsis: Hidden Markov Models using HMatrix primitives Description: Hidden Markov Models implemented using HMatrix data types and operations.@@ -41,7 +41,7 @@ Changes.md Source-Repository this- Tag: 0.1+ Tag: 0.1.0.1 Type: darcs Location: http://hub.darcs.net/thielema/hmm-hmatrix @@ -72,7 +72,7 @@ transformers >= 0.2 && <0.6, non-empty >=0.2.1 && <0.4, semigroups >=0.17 && <0.19,- containers >=0.4.2 && <0.6,+ containers >=0.4.2 && <0.7, array >=0.4 && <0.6, utility-ht >=0.0.12 && <0.1, deepseq >=1.3 && <1.5,
src/Math/HiddenMarkovModel.hs view
@@ -96,8 +96,8 @@ (NC.atIndex (initial hmm)) generate ::- (Rnd.RandomGen g, Ord prob, Rnd.Random prob,- Distr.Generate distr, Distr.Probability distr ~ prob, Distr.Emission distr ~ emission) =>+ (Rnd.RandomGen g, Ord prob, Rnd.Random prob, Distr.Generate distr,+ Distr.Probability distr ~ prob, Distr.Emission distr ~ emission) => T distr prob -> g -> [emission] generate hmm = MS.evalState $
src/Math/HiddenMarkovModel/CSV.hs view
@@ -20,14 +20,10 @@ import qualified Data.List.HT as ListHT -cellsFromVector ::- (Show a, Algo.Field a) =>- Vector a -> [String]+cellsFromVector :: (Show a, Algo.Field a) => Vector a -> [String] cellsFromVector = map show . Vector.toList -cellsFromMatrix ::- (Show a, Matrix.Element a) =>- Matrix.Matrix a -> [[String]]+cellsFromMatrix :: (Show a, Matrix.Element a) => Matrix a -> [[String]] cellsFromMatrix = map (map show) . Matrix.toLists padTable :: a -> [[a]] -> [[a]]@@ -145,8 +141,7 @@ assert (all ((n==) . Vector.dim) rows) "inconsistent matrix dimensions" return $ Matrix.fromRows rows -parseStringList ::- CSV.CSVRow -> CSVParser [String]+parseStringList :: CSV.CSVRow -> CSVParser [String] parseStringList = MT.lift . mapM cellContent . Rev.dropWhile (null . CSV.csvFieldContent)
src/Math/HiddenMarkovModel/Distribution.hs view
@@ -163,8 +163,7 @@ transposeVectorList = Matrix.toRows . Matrix.fromColumns mapLookup :: (Ord k) => String -> Map.Map k a -> k -> a-mapLookup msg dict x =- Map.findWithDefault (error msg) x dict+mapLookup msg dict x = Map.findWithDefault (error msg) x dict newtype Gaussian a = Gaussian (Array State (Vector a, Matrix a, a))@@ -234,10 +233,10 @@ weight0 + weight1) in GaussianTrained $ Map.unionWith comb distr0 distr1 {-- Sum_i (xi-mi) * (xi-mi)^T- = Sum_i xi*xi^T + Sum_i mi*mi^T - Sum_i xi*mi^T - Sum_i mi*xi^T- = Sum_i xi*xi^T - Sum_i mi*mi^T- = Sum_i xi*xi^T - n * mi*mi^T+ Sum_i (xi-m) * (xi-m)^T+ = Sum_i xi*xi^T + Sum_i m*m^T - Sum_i xi*m^T - Sum_i m*xi^T+ = Sum_i xi*xi^T - Sum_i m*m^T+ = Sum_i xi*xi^T - n * m*m^T -} normalize (GaussianTrained distr) = let params (centerSum, covarianceSum, weight) =@@ -252,8 +251,7 @@ gaussian :: (Algo.Field prob) => [(Vector prob, Matrix prob)] -> Gaussian prob-gaussian =- consGaussian . map gaussianParameters+gaussian = consGaussian . map gaussianParameters gaussianParameters :: (Algo.Field prob) =>@@ -262,8 +260,7 @@ gaussianFromCholesky center $ Algo.chol covariance consGaussian :: [(Vector a, Matrix a, a)] -> Gaussian a-consGaussian xs =- Gaussian $ listArray (State 0, State $ length xs - 1) xs+consGaussian xs = Gaussian $ listArray (State 0, State $ length xs - 1) xs gaussianFromCholesky :: (Algo.Field prob) =>@@ -316,9 +313,10 @@ in MT.lift $ ME.fromMaybe (printf "unknown symbol %s" str) $ symbolFromCell str) (do v <- HMMCSV.parseVectorFields cs- HMMCSV.assert (n == Vector.dim v)+ let m = Vector.dim v+ HMMCSV.assert (n == m) (printf "number of states (%d) and size of probability vector (%d) mismatch"- n (Vector.dim v))+ n m) return v)
src/Math/HiddenMarkovModel/Normalized.hs view
@@ -10,7 +10,8 @@ import qualified Math.HiddenMarkovModel.Distribution as Distr import Math.HiddenMarkovModel.Private- (T(..), Trained(..), emission, matrixMaxMul, sumTransitions)+ (T(..), Trained(..), emission,+ biscaleTransition, matrixMaxMul, sumTransitions) import Math.HiddenMarkovModel.Distribution (State(State)) import Math.HiddenMarkovModel.Utility (normalizeFactor, normalizeProb) @@ -94,10 +95,7 @@ let (cs,alphas) = Functor.unzip calphas in NonEmptyC.zipWith4 (\x alpha0 c1 beta1 ->- NC.scale (recip c1) $- NC.mul- (NC.outer (NC.mul (emission hmm x) beta1) alpha0)- (transition hmm))+ NC.scale (recip c1) $ biscaleTransition hmm x alpha0 beta1) (NonEmpty.tail xs) (NonEmpty.init alphas) (NonEmpty.tail cs)
src/Math/HiddenMarkovModel/Private.hs view
@@ -128,6 +128,14 @@ +biscaleTransition ::+ (Distr.EmissionProb distr, Distr.Probability distr ~ prob) =>+ T distr prob -> Distr.Emission distr ->+ Vector prob -> Vector prob -> Matrix prob+biscaleTransition hmm x alpha0 beta1 =+ NC.mul (transition hmm) $+ NC.outer (NC.mul (emission hmm x) beta1) alpha0+ xiFromAlphaBeta :: (Distr.EmissionProb distr, Distr.Probability distr ~ prob, Distr.Emission distr ~ emission) =>@@ -140,9 +148,7 @@ zipWith3 (\x alpha0 beta1 -> NC.scale recipLikelihood $- NC.mul- (NC.outer (NC.mul (emission hmm x) beta1) alpha0)- (transition hmm))+ biscaleTransition hmm x alpha0 beta1) (NonEmpty.tail xs) (NonEmpty.init alphas) (NonEmpty.tail betas)
src/Math/HiddenMarkovModel/Utility.hs view
@@ -9,12 +9,10 @@ import qualified Control.Monad.Trans.State as MS -normalizeProb ::- (NC.Container Vector a) => Vector a -> Vector a+normalizeProb :: (NC.Container Vector a) => Vector a -> Vector a normalizeProb = snd . normalizeFactor -normalizeFactor ::- (NC.Container Vector a) => Vector a -> (a, Vector a)+normalizeFactor :: (NC.Container Vector a) => Vector a -> (a, Vector a) normalizeFactor xs = let c = NC.sumElements xs in (c, NC.scale (recip c) xs)