Skip to content

Commit

Permalink
added Gradient Descent unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
aligusnet committed Jan 7, 2017
1 parent 5b74081 commit 8fe809b
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 0 deletions.
1 change: 1 addition & 0 deletions mltool.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ test-suite mltool-test
main-is: Main.hs
build-depends: base
, mltool
, vector
, hmatrix
, test-framework
, test-framework-hunit
Expand Down
45 changes: 45 additions & 0 deletions test/MachineLearning/Regression/GradientDescentTest.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
module MachineLearning.Regression.GradientDescentTest
(
tests
)

where

import Test.Framework (testGroup)
import Test.Framework.Providers.HUnit
import Test.HUnit
import Test.HUnit.Approx
import Test.HUnit.Plus

import qualified Data.Vector.Storable as V
import qualified Numeric.LinearAlgebra as LA

import qualified MachineLearning as ML
import MachineLearning.Regression.LeastSquares (LeastSquaresModel(..))
import MachineLearning.Regression.GradientDescent

import MachineLearning.Regression.DataSets (dataset1)

(x, y) = ML.splitToXY dataset1

muSigma = ML.meanStddev x
xNorm = ML.featureNormalization muSigma x
x1 = ML.addColumnOfOnes xNorm
initialTheta = LA.konst 0 (LA.cols x1)
lsExpectedTheta = LA.vector [340412.660, 110630.879, -8737.743]
eps = 1e-3


isInDescendingOrder :: [Double] -> Bool
isInDescendingOrder lst = and . snd . unzip $ scanl (\(prev, _) current -> (current, prev >= current)) (1/0, True) lst

testGradientDescent model expectedTheta = do
let (theta, optPath) = gradientDescent 0.01 model eps 5000 0 x1 y initialTheta
js = V.toList $ (LA.toColumns optPath) !! 1
assertVector "theta" 0.01 expectedTheta theta
assertBool "non-increasing errors" $ isInDescendingOrder js

tests = [testGroup "gradientDescent" [
testCase "leastSquares" $ testGradientDescent LeastSquares lsExpectedTheta
]
]
2 changes: 2 additions & 0 deletions test/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import Test.Framework (defaultMain, testGroup)
import qualified MachineLearning.RegressionTest as Regression
import qualified MachineLearning.Regression.LeastSquaresTest as LeastSquares
import qualified MachineLearning.Regression.LogisticTest as Logistic
import qualified MachineLearning.Regression.GradientDescentTest as GradientDescent
import qualified MachineLearning.NeuralNetworkTest as NeuralNetwork
import qualified MachineLearning.PCATest as PCA

Expand All @@ -13,6 +14,7 @@ tests = [
testGroup "MachineLearning.Regression" Regression.tests
, testGroup "MachineLearning.Regression.LeastSquares" LeastSquares.tests
, testGroup "MachineLearning.Regression.Logistic" Logistic.tests
, testGroup "MachineLearning.Regression.GradientDescent" GradientDescent.tests
, testGroup "MachineLearning.NeuralNetwork" NeuralNetwork.tests
, testGroup "MachineLearning.PCA" PCA.tests
]

0 comments on commit 8fe809b

Please sign in to comment.