view tests/test_logistic_regression.py @ 48:2a3cb44802a7

[doc] illustration of fwd+back propagation
author Jeff Hammel <k0scist@gmail.com>
date Sun, 17 Sep 2017 14:19:18 -0700
parents 0f29b02f4806
children
line wrap: on
line source

#!/usr/bin/env python

"""
test logistic regression
"""

import numpy as np
import os
import unittest
from tvii import logistic_regression


class LogisticRegresionTests(unittest.TestCase):

    def compare_arrays(self, a, b):
        assert a.shape == b.shape
        for x, y in zip(a.flatten(),
                        b.flatten()):
            self.assertAlmostEqual(x, y)


    def test_cost(self):
        """test cost function"""

        w, b, X, Y = (np.array([[1],[2]]),
                      2,
                      np.array([[1,2],[3,4]]),
                      np.array([[1,0]]))

        expected_cost = 6.000064773192205
        cost = logistic_regression.cost_function(w, b, X, Y)
        assert abs(cost - expected_cost) < 1e-6

    def test_propagate(self):
        """test canned logistic regression example"""

        # sample variables
        w = np.array([[1],[2]])
        b = 2
        X = np.array([[1,2],[3,4]])
        Y = np.array([[1,0]])

        # calculate gradient and cost
        grads, cost = logistic_regression.propagate(w, b, X, Y)

        # compare to expected,
        dw_expected = np.array([[ 0.99993216], [ 1.99980262]])
        db_expected = 0.499935230625
        cost_expected = 6.000064773192205

        self.assertAlmostEqual(cost_expected, cost)
        self.assertAlmostEqual(grads['db'], db_expected)
        assert grads['dw'].shape == dw_expected.shape
        for a, b in zip(grads['dw'].flatten(),
                           dw_expected.flatten()):
            self.assertAlmostEqual(a, b)

    def test_optimize(self):
        """test gradient descent method"""

        # test examples
        w, b, X, Y = (np.array([[1],[2]]), 2, np.array([[1,2],[3,4]]), np.array([[1,0]]))

        params, grads, costs = logistic_regression.optimize(w, b, X, Y, num_iterations= 100, learning_rate = 0.009, print_cost = False)

        # expected output
        w_expected = np.array([[0.1124579 ],
                               [0.23106775]])
        dw_expected = np.array([[ 0.90158428],
                                [ 1.76250842]])
        b_expected = 1.55930492484
        db_expected = 0.430462071679

        # compare output
        self.assertAlmostEqual(params['b'], b_expected)
        self.assertAlmostEqual(grads['db'], db_expected)
        self.compare_arrays(w_expected, params['w'])
        self.compare_arrays(dw_expected, grads['dw'])

    def test_predict(self):

        w, b, X, Y = (np.array([[1],[2]]), 2, np.array([[1,2],[3,4]]), np.array([[1,0]]))

        predictions = logistic_regression.predict(w, b, X)

        assert predictions[0][0] == 1
        assert predictions[0][1] == 1

if __name__ == '__main__':
    unittest.main()