diff --git a/Ch07/Code01_avg/Code0701.cabal b/Ch07/Code01_avg/Code0701.cabal new file mode 100644 index 0000000..79a5e8e --- /dev/null +++ b/Ch07/Code01_avg/Code0701.cabal @@ -0,0 +1,25 @@ +-- Initial Code0601.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0701 +version: 0.1.0.0 +synopsis: Moving average. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Math +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0701 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code01_avg/Main.hs b/Ch07/Code01_avg/Main.hs new file mode 100644 index 0000000..b83b04b --- /dev/null +++ b/Ch07/Code01_avg/Main.hs @@ -0,0 +1,22 @@ +-- Computing the moving average +main = do + rawInput <- readFile "input.txt" + let input = clean rawInput + print input + putStrLn $ "mean is " ++ (show.mean) input + putStrLn $ "moving average is " ++ (show.avg) input + +clean :: String -> [Double] +clean raw = map (\s -> read s :: Double) (lines raw) + +avg :: [Double] -> Double +avg (x:xs) = a*x + (1-a)*(avg xs) + where a = 0.95 +avg [] = 0 + +mean :: Fractional a => [a] -> a +mean xs = (sum xs) / (fromIntegral (length xs)) + +-- [4.0,3.0,2.0,5.0,3.0,4.0,1.0,3.0,12.0,3.0] +-- mean is 4.0 +-- moving average is 3.9478627675211913 diff --git a/Ch07/Code01_avg/Makefile b/Ch07/Code01_avg/Makefile new file mode 100644 index 0000000..b6db2e6 --- /dev/null +++ b/Ch07/Code01_avg/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0701 *~ diff --git a/Ch07/Code01_avg/input.txt b/Ch07/Code01_avg/input.txt new file mode 100644 index 0000000..abdfbe9 --- /dev/null +++ b/Ch07/Code01_avg/input.txt @@ -0,0 +1,10 @@ +4 +3 +2 +5 +3 +4 +1 +3 +12 +3 diff --git a/Ch07/Code02_med/Code0702.cabal b/Ch07/Code02_med/Code0702.cabal new file mode 100644 index 0000000..7e43fae --- /dev/null +++ b/Ch07/Code02_med/Code0702.cabal @@ -0,0 +1,25 @@ +-- Initial Code0602.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0702 +version: 0.1.0.0 +synopsis: Moving median. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Math +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0702 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7, heap >=1.0 && <1.1 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code02_med/Main.hs b/Ch07/Code02_med/Main.hs new file mode 100644 index 0000000..f8bab82 --- /dev/null +++ b/Ch07/Code02_med/Main.hs @@ -0,0 +1,34 @@ +import Data.Heap +import Data.Maybe (fromJust) + +-- Computing the moving median +main = do + rawInput <- readFile "input.txt" + let input = clean rawInput + print $ input + print $ median input (empty :: MaxHeap Int) (empty :: MinHeap Int) + +clean :: String -> [Int] +clean raw = map (\s -> read s :: Int) (lines raw) + +median (x:xs) maxheap minheap = case viewHead maxheap of + Just theMax -> if x < theMax + then median xs (insert x maxheap) minheap + else median xs maxheap (insert x minheap) + Nothing -> median xs (insert x maxheap) minheap + +median [] maxheap minheap + | size maxheap + 1 < size minheap = + median [] (insert minelem maxheap) $ + (snd.fromJust.view) minheap + | size minheap + 1 < size maxheap = + median [] ((snd.fromJust.view) maxheap) $ + insert maxelem minheap + | size maxheap == size minheap = + (fromIntegral maxelem + fromIntegral minelem)/2.0 + | size maxheap > size minheap = fromIntegral maxelem + | otherwise = fromIntegral minelem + where maxelem = fromJust (viewHead maxheap) + minelem = fromJust (viewHead minheap) + + diff --git a/Ch07/Code02_med/Makefile b/Ch07/Code02_med/Makefile new file mode 100644 index 0000000..1dea985 --- /dev/null +++ b/Ch07/Code02_med/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0702 *~ diff --git a/Ch07/Code02_med/input.txt b/Ch07/Code02_med/input.txt new file mode 100644 index 0000000..f1bbb88 --- /dev/null +++ b/Ch07/Code02_med/input.txt @@ -0,0 +1,10 @@ +3 +4 +2 +5 +6 +4 +2 +6 +4 +1 diff --git a/Ch07/Code03_lin/Code0703.cabal b/Ch07/Code03_lin/Code0703.cabal new file mode 100644 index 0000000..c472dac --- /dev/null +++ b/Ch07/Code03_lin/Code0703.cabal @@ -0,0 +1,25 @@ +-- Initial Code0603.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0703 +version: 0.1.0.0 +synopsis: Linear regression. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Math +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0703 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7, statistics-linreg >=0.2 && <0.3, vector >=0.10 && <0.11 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code03_lin/Main.hs b/Ch07/Code03_lin/Main.hs new file mode 100644 index 0000000..39e647e --- /dev/null +++ b/Ch07/Code03_lin/Main.hs @@ -0,0 +1,9 @@ +import Statistics.LinearRegression +import qualified Data.Vector.Unboxed as U + +-- Computing a linear regression +main = do + let xs = U.fromList [1.0, 2.0, 3.0, 4.0, 5.0] :: U.Vector Double + let ys = U.fromList [1.0, 2.0, 1.3, 3.75, 2.25] :: U.Vector Double + let (b, m) = linearRegression xs ys + print $ concat ["y = ", show m, " x + ", show b] diff --git a/Ch07/Code03_lin/Makefile b/Ch07/Code03_lin/Makefile new file mode 100644 index 0000000..35c8548 --- /dev/null +++ b/Ch07/Code03_lin/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0703 *~ diff --git a/Ch07/Code04_quad/Code0704.cabal b/Ch07/Code04_quad/Code0704.cabal new file mode 100644 index 0000000..aef9365 --- /dev/null +++ b/Ch07/Code04_quad/Code0704.cabal @@ -0,0 +1,25 @@ +-- Initial Code0604.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0704 +version: 0.1.0.0 +synopsis: Quadratic regression. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Math +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0704 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7, array >=0.4 && <0.5, dsp >=0.2 && <0.3 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code04_quad/Main.hs b/Ch07/Code04_quad/Main.hs new file mode 100644 index 0000000..3d55fe5 --- /dev/null +++ b/Ch07/Code04_quad/Main.hs @@ -0,0 +1,13 @@ +import Data.Array (listArray, elems) +import Matrix.LU (solve) + +-- Computing the quadratic regression +fit d vals = elems $ solve mat vec where + mat = listArray ((1,1), (d,d)) $ matrixArray + vec = listArray (1,d) $ take d vals + matrixArray = concat [polys x d | x <- [0..fromIntegral (d-1)]] + polys x d = map (x**) [0..fromIntegral (d-1)] + +main = print $ fit 3 [1,6,17,34,57,86,121,162,209,262,321] + +equation coeffs = zip coeffs (reverse [1..length coeffs]) diff --git a/Ch07/Code04_quad/Makefile b/Ch07/Code04_quad/Makefile new file mode 100644 index 0000000..aa7a3f0 --- /dev/null +++ b/Ch07/Code04_quad/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0704 *~ diff --git a/Ch07/Code05_cov/Code0705.cabal b/Ch07/Code05_cov/Code0705.cabal new file mode 100644 index 0000000..b5075a5 --- /dev/null +++ b/Ch07/Code05_cov/Code0705.cabal @@ -0,0 +1,25 @@ +-- Initial Code0605.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0705 +version: 0.1.0.0 +synopsis: Covariance matrix. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Math +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0705 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7, hstats + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code05_cov/Main.hs b/Ch07/Code05_cov/Main.hs new file mode 100644 index 0000000..489dff7 --- /dev/null +++ b/Ch07/Code05_cov/Main.hs @@ -0,0 +1,8 @@ +import Math.Statistics + +-- Computing the covariance matrix +main = do print $ covMatrix matrixArray + where matrixArray = [ [1,1,0,0] + , [0,1,0,1] + , [1,1,0,1] ] + diff --git a/Ch07/Code05_cov/Makefile b/Ch07/Code05_cov/Makefile new file mode 100644 index 0000000..9ef7cf5 --- /dev/null +++ b/Ch07/Code05_cov/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0705 *~ diff --git a/Ch07/Code06_pair/Code0706.cabal b/Ch07/Code06_pair/Code0706.cabal new file mode 100644 index 0000000..a519841 --- /dev/null +++ b/Ch07/Code06_pair/Code0706.cabal @@ -0,0 +1,25 @@ +-- Initial Code0606.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0706 +version: 0.1.0.0 +synopsis: Pairwise tuples. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Data +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0706 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code06_pair/Main.hs b/Ch07/Code06_pair/Main.hs new file mode 100644 index 0000000..7ec7b3c --- /dev/null +++ b/Ch07/Code06_pair/Main.hs @@ -0,0 +1,7 @@ +import Data.List (tails, nub, sort) + +-- Finding all pairs in a list +main = do + print $ pairs [1,2,3,4] + +pairs xs = [(x, y) | (x:ys) <- tails (nub xs), y <- ys] diff --git a/Ch07/Code06_pair/Makefile b/Ch07/Code06_pair/Makefile new file mode 100644 index 0000000..9a86927 --- /dev/null +++ b/Ch07/Code06_pair/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0706 *~ diff --git a/Ch07/Code07_pear/Code0707.cabal b/Ch07/Code07_pear/Code0707.cabal new file mode 100644 index 0000000..4642c09 --- /dev/null +++ b/Ch07/Code07_pear/Code0707.cabal @@ -0,0 +1,25 @@ +-- Initial Code0607.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0707 +version: 0.1.0.0 +synopsis: Pearson coefficient. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Math +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0707 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7, hstats >=0.3 && <0.4, csv >=0.1 && <0.2 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code07_pear/Main.hs b/Ch07/Code07_pear/Main.hs new file mode 100644 index 0000000..133ee6d --- /dev/null +++ b/Ch07/Code07_pear/Main.hs @@ -0,0 +1,21 @@ +import Math.Statistics (pearson) +import Text.CSV +import Data.List (tails, nub) + +-- Computing the pearson coefficient to detect similarities +main = do + let fileName = "ratings.csv" + input <- readFile fileName + let csv = parseCSV fileName input + print $ calcSimilarities csv + +calcSimilarities :: Either e [Record] -> (Double, ([String],[String])) +calcSimilarities (Left err) = error "error parsing" +calcSimilarities (Right csv) = maximum $ zip + [ pearson (convertList a) (convertList b) + | (a,b) <- csvPairs] $ csvPairs + where csvPairs = pairs $ filter (/= [""]) csv +convertList :: [String] -> [Double] +convertList = map read + +pairs xs = [(x, y) | (x:ys) <- tails (nub xs), y <- ys] diff --git a/Ch07/Code07_pear/Makefile b/Ch07/Code07_pear/Makefile new file mode 100644 index 0000000..519b9b8 --- /dev/null +++ b/Ch07/Code07_pear/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0707 *~ diff --git a/Ch07/Code07_pear/ratings.csv b/Ch07/Code07_pear/ratings.csv new file mode 100644 index 0000000..ab9032b --- /dev/null +++ b/Ch07/Code07_pear/ratings.csv @@ -0,0 +1,3 @@ +4,5,4,4,3 +2,5,4,3,1 +5,5,5,5,5 diff --git a/Ch07/Code08_net/Code0708.cabal b/Ch07/Code08_net/Code0708.cabal new file mode 100644 index 0000000..e9fe268 --- /dev/null +++ b/Ch07/Code08_net/Code0708.cabal @@ -0,0 +1,25 @@ +-- Initial Code0608.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0708 +version: 0.1.0.0 +synopsis: Bayesian network. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Math +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0708 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7, probability >=0.2 && <0.3 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code08_net/Main.hs b/Ch07/Code08_net/Main.hs new file mode 100644 index 0000000..7fc43a7 --- /dev/null +++ b/Ch07/Code08_net/Main.hs @@ -0,0 +1,47 @@ +import qualified Numeric.Probability.Distribution as Dist +import Numeric.Probability.Distribution ((??), (?=<<), ) + +prob p = Dist.choose p True False + +-- P (A) "formatting error" +a :: Dist.T Rational Bool +a = prob 0.2 + +-- P (B) "semantic error" +b :: Dist.T Rational Bool +b = prob 0.05 + +-- P (C | AB) "runs" +c :: Bool -> Bool -> Dist.T Rational Bool +c False False = prob 0.9 +c False True = prob 0.5 +c True False = prob 0.3 +c True True = prob 0.1 + +-- P (D | C) "passes test cases" +d :: Bool -> Dist.T Rational Bool +d False = prob 0.1 +d True = prob 0.4 + +-- P (E | C) "well written" +e :: Bool -> Dist.T Rational Bool +e False = prob 0.5 +e True = prob 0.2 + +data Network = N { aVal :: Bool + , bVal :: Bool + , cVal :: Bool + , dVal :: Bool + , eVal :: Bool } + deriving (Eq, Ord, Show) -- need all? + +bNetwork :: Dist.T Rational Network +bNetwork = do a' <- a + b' <- b + c' <- c a' b' + d' <- d c' + e' <- e c' + return (N a' b' c' d' e') + +-- Using Baysian networks to compute probabilities +main = print $ eVal ?? dVal ?=<< bNetwork diff --git a/Ch07/Code08_net/Makefile b/Ch07/Code08_net/Makefile new file mode 100644 index 0000000..f2f8ae5 --- /dev/null +++ b/Ch07/Code08_net/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0708 *~ diff --git a/Ch07/Code09_cards/Code0709.cabal b/Ch07/Code09_cards/Code0709.cabal new file mode 100644 index 0000000..bf5f6ff --- /dev/null +++ b/Ch07/Code09_cards/Code0709.cabal @@ -0,0 +1,25 @@ +-- Initial Code0609.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0709 +version: 0.1.0.0 +synopsis: Playing cards. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Math +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0709 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7, probability >=0.2 && <0.3, transformers >=0.3 && <0.4 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code09_cards/Main.hs b/Ch07/Code09_cards/Main.hs new file mode 100644 index 0000000..c00949f --- /dev/null +++ b/Ch07/Code09_cards/Main.hs @@ -0,0 +1,48 @@ +import qualified Numeric.Probability.Distribution as Dist +import Numeric.Probability.Distribution ((??)) +import Control.Monad.Trans.State (StateT(StateT, runStateT), evalStateT) +import Control.Monad (replicateM) +import Data.List (delete) + +data Suit = Club | Spade | Heart | Diamond + deriving (Eq,Ord,Show,Enum) + +data Rank = Plain Int | Jack | Queen | King | Ace + deriving (Eq,Ord,Show) + +type Card = (Rank,Suit) + +plains :: [Rank] +plains = map Plain [2..10] + +faces :: [Rank] +faces = [Jack,Queen,King,Ace] + +isFace :: Card -> Bool +isFace (r,_) = r `elem` faces + +isPlain :: Card -> Bool +isPlain (r,_) = r `elem` plains + +ranks :: [Rank] +ranks = plains ++ faces + +suits :: [Suit] +suits = [Club, Spade, Heart, Diamond] + +deck :: [Card] +deck = [ (r,s) | r <- ranks, s <- suits ] + +selectOne :: (Fractional prob, Eq a) => + StateT ([a]) (Dist.T prob) a +selectOne = + StateT $ Dist.uniform . removeEach + +select :: (Fractional prob, Eq a) => Int -> [a] -> Dist.T prob [a] +select n = evalStateT (replicateM n selectOne) + +removeEach xs = zip xs (map (flip delete xs) xs) + +-- Finding probabilities in playing cards +main = do + print $ Dist.just [(Plain 3, Heart), (Plain 3, Diamond)] ?? select 2 deck diff --git a/Ch07/Code09_cards/Makefile b/Ch07/Code09_cards/Makefile new file mode 100644 index 0000000..1224144 --- /dev/null +++ b/Ch07/Code09_cards/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0709 *~ diff --git a/Ch07/Code10_markov/Code0710.cabal b/Ch07/Code10_markov/Code0710.cabal new file mode 100644 index 0000000..d2b9363 --- /dev/null +++ b/Ch07/Code10_markov/Code0710.cabal @@ -0,0 +1,25 @@ +-- Initial Code0610.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0710 +version: 0.1.0.0 +synopsis: Markov chain. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Math +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0710 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7, markov-chain >=0.0 && <0.1, random >=1.0 && <1.1 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code10_markov/Main.hs b/Ch07/Code10_markov/Main.hs new file mode 100644 index 0000000..933d2bc --- /dev/null +++ b/Ch07/Code10_markov/Main.hs @@ -0,0 +1,11 @@ +import Data.MarkovChain +import System.Random (mkStdGen) + +-- Using a Markov chain +main = do + rawText <- readFile "big.txt" + let g = mkStdGen 100 + putStrLn $ "Generated character by character: \n" + putStrLn $ take 100 $ run 3 rawText 0 g + putStrLn $ "\nGenerated word by word: \n" + putStrLn $ unwords $ take 100 $ run 2 (words rawText) 0 g diff --git a/Ch07/Code10_markov/Makefile b/Ch07/Code10_markov/Makefile new file mode 100644 index 0000000..4d9cc24 --- /dev/null +++ b/Ch07/Code10_markov/Makefile @@ -0,0 +1,6 @@ +default: + wget -N norvig.com/big.txt + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0710 big.txt *~ diff --git a/Ch07/Code11_ngram/Code0711.cabal b/Ch07/Code11_ngram/Code0711.cabal new file mode 100644 index 0000000..dfe5158 --- /dev/null +++ b/Ch07/Code11_ngram/Code0711.cabal @@ -0,0 +1,25 @@ +-- Initial Code0611.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0711 +version: 0.1.0.0 +synopsis: Constructing an n-gram. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Data +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0711 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code11_ngram/Main.hs b/Ch07/Code11_ngram/Main.hs new file mode 100644 index 0000000..9b37d57 --- /dev/null +++ b/Ch07/Code11_ngram/Main.hs @@ -0,0 +1,7 @@ +main = print $ ngram 3 "hello world" + +-- Creating all n-grams of a list +ngram :: Int -> [a] -> [[a]] +ngram n xs + | n <= length xs = take n xs : ngram n (drop 1 xs) + | otherwise = [] diff --git a/Ch07/Code11_ngram/Makefile b/Ch07/Code11_ngram/Makefile new file mode 100644 index 0000000..d42fb4f --- /dev/null +++ b/Ch07/Code11_ngram/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0711 *~ diff --git a/Ch07/Code12_NN/Code0712.cabal b/Ch07/Code12_NN/Code0712.cabal new file mode 100644 index 0000000..d238180 --- /dev/null +++ b/Ch07/Code12_NN/Code0712.cabal @@ -0,0 +1,25 @@ +-- Initial Code0612.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/ + +name: Code0712 +version: 0.1.0.0 +synopsis: Neural networks. +-- description: +homepage: haskelldata.com +license: GPL-2 +license-file: ../LICENSE +author: Nishant Shukla +maintainer: nick722@gmail.com +-- copyright: +category: Math +build-type: Simple +-- extra-source-files: +cabal-version: >=1.10 + +executable Code0712 + main-is: Main.hs + -- other-modules: + -- other-extensions: + build-depends: base >=4.6 && <4.7, random >=1.0 && <1.1 + -- hs-source-dirs: + default-language: Haskell2010 \ No newline at end of file diff --git a/Ch07/Code12_NN/Main.hs b/Ch07/Code12_NN/Main.hs new file mode 100644 index 0000000..2b45bf1 --- /dev/null +++ b/Ch07/Code12_NN/Main.hs @@ -0,0 +1,55 @@ +import Control.Monad (replicateM) +import System.Random (randomR, getStdRandom) + +type Inputs = [Float] +type Weights = [Float] +type Threshold = Float +type Output = Float +type Expected = Float +type Actual = Float +type Delta = Float +type Interval = Int +type Step = (Weights, Interval) + +output :: Inputs -> Weights -> Threshold -> Output +output xs ws t + | (dot xs ws) > t = 1 + | otherwise = 0 + where dot as bs = sum $ zipWith (*) as bs + +adjustWeights :: Inputs -> Weights -> Expected -> Actual -> Weights +adjustWeights xs ws ex ac = add ws delta + where delta = map (err * learningRate *) xs + add = zipWith (+) + err = ex - ac + learningRate = 0.1 + +step :: Inputs -> Weights -> Expected -> Weights +step xs ws ex = adjustWeights xs ws ex (output xs ws t) + where t = 0.2 + +epoch :: [(Inputs, Expected)] -> Weights -> (Weights, Delta) +epoch inputs ws = (newWeights, delta) + where newWeights = foldl (\acc (xs, ex) -> step xs acc ex) ws inputs + delta = (sum (absSub newWeights ws)) / length' ws + absSub as bs = map abs $ zipWith (-) as bs + length' = fromIntegral . length + +run :: [(Inputs, Expected)] -> Weights -> Interval -> Step +run inputs ws n + | delta == 0.0 = (newWeights, n) + | otherwise = run inputs newWeights (n+1) + where (newWeights, delta) = epoch inputs ws + + +initialWeights :: Int -> IO [Float] +initialWeights nb = do + let interval = randomR (-0.5,0.5) + (replicateM nb (getStdRandom interval)) + +-- Classifying points using a neural network +main :: IO () +main = do + w <- initialWeights 2 + let (ws,i) = run [([0,0],0),([0,1],0),([1,0],0),([1,1],1)] w 1 + print (ws,i) diff --git a/Ch07/Code12_NN/Makefile b/Ch07/Code12_NN/Makefile new file mode 100644 index 0000000..e371135 --- /dev/null +++ b/Ch07/Code12_NN/Makefile @@ -0,0 +1,5 @@ +default: + cabal install --bindir=./ + +clean: + rm -rf dist Setup.hs Code0712 *~ diff --git a/Ch07/LICENSE b/Ch07/LICENSE new file mode 100644 index 0000000..1f53f40 --- /dev/null +++ b/Ch07/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Ch07/README.md b/Ch07/README.md index 097e4b1..969b04c 100644 --- a/Ch07/README.md +++ b/Ch07/README.md @@ -6,8 +6,21 @@ Refer to the book for step-by-step explanations.

-# How to use +# Recipes: +* **Code01**: Calculating a moving average +* **Code02**: Calculating a moving median +* **Code03**: Approximating a linear regression +* **Code04**: Approximating a quadratic regression +* **Code05**: Obtaining the covariance matrix from samples +* **Code06**: Finding all unique pairings in a list +* **Code07**: Using the Pearson correlation coefficient +* **Code08**: Evaluating a Bayesian network +* **Code09**: Creating a data structure for playing cards +* **Code10**: Using a Markov chain to generate text +* **Code11**: Creating n-grams from a list +* **Code12**: Constructing a neural network perception +# How to use ### Setting up the environment Install the [Haskell Platform](http://www.haskell.org/platform/).