rc-0.3.0.0: examples/NTC/Main.hs
import Numeric.LinearAlgebra
import System.Random ( mkStdGen )
import Learning ( nrmse )
import RC.NTC as RC
-- Get training data
takePast :: Element a => Int -> Matrix a -> Matrix a
takePast horizon xs = xs ?? (All, Take (len - horizon))
where
len = cols xs
-- Get target data
takeFuture :: Element a => Int -> Matrix a -> Matrix a
takeFuture horizon = (?? (All, Drop horizon))
-- Manipulate the data matrix: horizontal split
splitAtRatio :: Element a => Double -> Matrix a -> (Matrix a, Matrix a)
splitAtRatio ratio m = splitAt' spl m
where
total = cols m
spl = round $ ratio * fromIntegral total
splitAt' :: Element a => Int -> Matrix a -> (Matrix a, Matrix a)
splitAt' i m = (m ?? (All, Take i), m ?? (All, Drop i))
main :: IO ()
main = do
-- Load and transpose time series to predict
dta <- tr <$> loadMatrix "examples/data/mg.txt"
-- Train on 50% of data
let (train, validate) = splitAtRatio 0.50 dta
-- Configure a new NTC network
let p = RC.par0 { RC._inputWeightsRange = (0.1, 0.3) }
g = mkStdGen 1111
ntc = RC.new g p (1, 1000, 1)
-- 20 steps ahead prediction horizon
let horizon = 20
let train' = takePast horizon train -- Past series
trainTeacher = takeFuture horizon train -- Predicted series
let forgetPts = 300 -- Washout
-- Train
case RC.learn ntc forgetPts train' trainTeacher of
Left s -> error s
Right ntc' -> do
let target = (takeFuture horizon validate) ?? (All, Drop forgetPts)
-- Predict
case RC.predict ntc' forgetPts (takePast horizon validate) of
Left s -> error s
Right prediction -> do
let tgt' = flatten target
predic' = flatten prediction
err = nrmse tgt' predic'
putStrLn $ "Error: " ++ show err
let result = (tr target) ||| (tr prediction)
saveMatrix "examples/NTC/result.txt" "%g" result