packages feed

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