HNumeric 0.2.1.0 → 0.3.0.0
raw patch · 5 files changed
+78/−64 lines, 5 filesdep +randomPVP ok
version bump matches the API change (PVP)
Dependencies added: random
API changes (from Hackage documentation)
+ HNum.Stats: c :: Integral a => a -> a -> a
+ HNum.Stats: class VecOps v => Statistical v
+ HNum.Stats: cor :: (Statistical v, Floating a) => v a -> v a -> a
+ HNum.Stats: fac :: Integral a => a -> a
+ HNum.Stats: facStop :: Integral a => a -> a -> a
+ HNum.Stats: instance HNum.Stats.Statistical HNum.Vector.Vector
+ HNum.Stats: p :: Integral a => a -> a -> a
+ HNum.Vector: cycleMat :: [[a]] -> [[a]]
- HNum.Stats: cov :: Floating a => Vector a -> Vector a -> Matrix a
+ HNum.Stats: cov :: (Statistical v, Floating a) => v a -> v a -> Matrix a
- HNum.Stats: cov' :: Floating a => Vector a -> Vector a -> a
+ HNum.Stats: cov' :: (Statistical v, Floating a) => v a -> v a -> a
- HNum.Stats: mean :: Fractional a => Vector a -> a
+ HNum.Stats: mean :: (Statistical v, Fractional a) => v a -> a
- HNum.Stats: std :: Floating a => Vector a -> a
+ HNum.Stats: std :: (Statistical v, Floating a) => v a -> a
- HNum.Stats: var :: Floating a => Vector a -> a
+ HNum.Stats: var :: (Statistical v, Floating a) => v a -> a
- HNum.Vector: (%/%) :: (MatOps f, Fractional a) => f a -> f a -> f a
+ HNum.Vector: (%/%) :: (MatOps f, Eq a, Fractional a) => f a -> f a -> f a
- HNum.Vector: det :: (MatOps f, Fractional a) => f a -> a
+ HNum.Vector: det :: (MatOps f, Eq a, Fractional a) => f a -> a
- HNum.Vector: detMat :: Fractional a => [[a]] -> a
+ HNum.Vector: detMat :: (Eq a, Fractional a) => [[a]] -> a
- HNum.Vector: inv :: (MatOps f, Fractional a) => f a -> f a
+ HNum.Vector: inv :: (MatOps f, Eq a, Fractional a) => f a -> f a
- HNum.Vector: invMat :: Fractional a => [[a]] -> [[a]]
+ HNum.Vector: invMat :: (Eq a, Fractional a) => [[a]] -> [[a]]
Files
- HNumeric.cabal +4/−15
- README.md +2/−11
- app/Main.hs +0/−12
- src/HNum/Stats.hs +59/−18
- src/HNum/Vector.hs +13/−8
HNumeric.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: ec536934e686c8d7a1fa05bae8aa48636246af47efadc6019e11a8d8c8b0fd63+-- hash: 3e62d8d2cc17a8f3e541031e3eb49a7cd3da4b6da8e7837ff11ff044e7b895f1 name: HNumeric-version: 0.2.1.0+version: 0.3.0.0 synopsis: Haskell Numeric Library with pure functionality, R & MATLAB Syntax. description: Please see the README on GitHub at <https://github.com/Axect/HNumeric#readme> category: HNum, library, Numeric, LinearAlgebra, Statistics, bsd3@@ -37,19 +37,7 @@ build-depends: base >=4.7 && <5 , normaldistribution- default-language: Haskell2010--executable HNumeric-exe- main-is: Main.hs- other-modules:- Paths_HNumeric- hs-source-dirs:- app- ghc-options: -threaded -rtsopts -with-rtsopts=-N- build-depends:- HNumeric- , base >=4.7 && <5- , normaldistribution+ , random default-language: Haskell2010 test-suite HNumeric-test@@ -64,4 +52,5 @@ HNumeric , base >=4.7 && <5 , normaldistribution+ , random default-language: Haskell2010
README.md view
@@ -9,16 +9,7 @@ ## Installation -### 1. Native Use--You can use this package just change `app/Main.hs`-Then, just type next command--```bash-git clone https://github.com/Axect/HNumeric-```--### 2. Cabal Install+### 1. Cabal Install ```sh cabal update@@ -27,7 +18,7 @@ That's all! -### 3. Import to Stack project+### 2. Import to Stack project If you use this package to your own project, then you should change `stack.yaml` and `package.yaml`
− app/Main.hs
@@ -1,12 +0,0 @@-module Main where--import HNum.Vector-import HNum.Stats-import Data.Random.Normal--main :: IO ()-main = do- let a = Vector [1, 3, 4]- print a- print $ map ($ a) [mean, var, std]-
src/HNum/Stats.hs view
@@ -1,31 +1,72 @@+{-+Module : HNumeric.Stats+Description : Haskell Statistics Library with HNum.Vector+CopyRight : (c) Tae Geun Kim, 2018+License : BSD3+Maintainer : edeftg@gmail.com+Stability : Experimental+-} module HNum.Stats where import HNum.Vector+import Data.Random.Normal+import System.Random +-- | To contain coefficients of linear regression. type Coeff a = (a, a)+--------------------------------------------------------+-- Basic Probability+-------------------------------------------------------- --- | Expectation Value-mean :: Fractional a => Vector a -> a-mean v = sum v / fromIntegral (length v)+-- | Factorial+fac :: Integral a => a -> a+fac 0 = 1+fac 1 = 1+fac n = product [1 .. n] --- | Covariance (Single-Valued)-cov' :: Floating a => Vector a -> Vector a -> a-cov' x y- | length x <= 1 || length y <= 1 = error "Samples are not enough"- | length x /= length y = error "Length is not same"- | otherwise = ((x .- mean x) .*. (y .- mean y)) / fromIntegral (length x - 1)+-- | Factorial with start n,end s+facStop :: Integral a => a -> a -> a+facStop n s = product [s .. n] --- | Variance-var :: Floating a => Vector a -> a-var v = cov' v v+-- | Permutation+p :: Integral a => a -> a -> a+n `p` r = facStop n (n - r + 1) --- | Standard Deviation-std :: Floating a => Vector a -> a-std = sqrt . var+-- | Combination using permutation+c :: Integral a => a -> a -> a+n `c` r = (n `p` r) `div` fac r --- | Covariance Matrix-cov :: Floating a => Vector a -> Vector a -> Matrix a-cov x y = matrix [[var x, cov' x y], [cov' y x, var y]]+++--------------------------------------------------------+-- Basic Statistics+--------------------------------------------------------+-- | Basic Statistics Class for Vector+class VecOps v => Statistical v where+ mean :: Fractional a => v a -> a+ -- | Single Valued covariance+ cov' :: Floating a => v a -> v a -> a+ -- | Covariance Matrix+ cov :: Floating a => v a -> v a -> Matrix a+ var :: Floating a => v a -> a+ std :: Floating a => v a -> a+ -- | Correlation Coefficient+ cor :: Floating a => v a -> v a -> a++instance Statistical Vector where+ mean x = sum x / fromIntegral (length x)+ cov' x y+ | length x <= 1 || length y <= 1 = error "Samples are not enough"+ | length x /= length y = error "Length is not same"+ | otherwise = ((x .- mean x) .*. (y .- mean y)) / fromIntegral (length x - 1)+ cov x y = matrix [[var x, cov' x y], [cov' y x, var y]]+ var v = cov' v v+ std = sqrt . var+ cor x y = cov' x y / (std x * std y)++--------------------------------------------------------+-- Distribution +-------------------------------------------------------- -- | Least Square Method - (Intercept, Slope) lm :: Floating a => Vector a -> Vector a -> Coeff a
src/HNum/Vector.hs view
@@ -2,9 +2,9 @@ Module : HNumeric.Vector Description : Haskell Vector & Matrix & Linear Algebra Library to do machine learning CopyRight : (c) Tae Geun Kim, 2018-License : GPL-3+License : BSD3 Maintainer : edeftg@gmail.com-Stability : Experimental+Stability : Stable -} module HNum.Vector where @@ -178,9 +178,9 @@ -} class Functor f => MatOps f where (%*%) :: Num a => f a -> f a -> f a- (%/%) :: Fractional a => f a -> f a -> f a- det :: Fractional a => f a -> a- inv :: Fractional a => f a -> f a+ (%/%) :: (Eq a, Fractional a) => f a -> f a -> f a+ det :: (Eq a, Fractional a) => f a -> a+ inv :: (Eq a, Fractional a) => f a -> f a transpose :: f a -> f a instance VecOps Vector where@@ -352,6 +352,9 @@ colMaxIdx :: Ord a => [[a]] -> Int -> Int colMaxIdx m n = whichMax $ colMat m n +cycleMat :: [[a]] -> [[a]]+cycleMat (m : ms) = ms ++ [m]+ -- | Another Block Partitioning bpMat' :: Int -> [[a]] -> [[a]] bpMat' _ [] = []@@ -364,10 +367,11 @@ where l = length m - 1 -- | Determinant for Double List - Order ~ 4^n-detMat :: Fractional a => [[a]] -> a+detMat :: (Eq a, Fractional a) => [[a]] -> a detMat [[x]] = x detMat m | l == 2 = detMat m11 * detMat m22 - detMat m12 * detMat m21+ | d00 == 0 = (-1) ^ (l - 1) * detMat (cycleMat m) | otherwise = (detMat m11 * detMat m22 - detMat m12 * detMat m21) / detMat m00 where l = length m@@ -376,12 +380,13 @@ m21 = bpMat' 3 m m22 = bpMat' 4 m m00 = bpMat' 0 m+ d00 = detMat m00 -- | Inverse for Double List - Order ~ n * 2^n-invMat :: Fractional a => [[a]] -> [[a]]+invMat :: (Eq a, Fractional a) => [[a]] -> [[a]] invMat [] = [] invMat [[] ] = [[]]-invMat [[x]] = [[x]]+invMat [[x]] = [[1 / x]] invMat m | length m == 2 = map (map (/ detMat m))