Mercurial > hg > tvii
changeset 28:77f68c241b37
[logistic regression] propagate
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Mon, 04 Sep 2017 11:53:23 -0700 |
parents | 22218d90d33f |
children | cf7584f0a29f |
files | tests/test_logistic_regression.py tvii/logistic_regression.py |
diffstat | 2 files changed, 38 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/tests/test_logistic_regression.py Mon Sep 04 11:38:46 2017 -0700 +++ b/tests/test_logistic_regression.py Mon Sep 04 11:53:23 2017 -0700 @@ -9,6 +9,7 @@ import unittest from tvii import logistic_regression + class LogisticRegresionTests(unittest.TestCase): def test_cost(self): @@ -23,5 +24,23 @@ 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 = [[ 0.99993216], [ 1.99980262]] + db_expected = 0.499935230625 + cost_expected = 6.000064773192205 + + if __name__ == '__main__': unittest.main()
--- a/tvii/logistic_regression.py Mon Sep 04 11:38:46 2017 -0700 +++ b/tvii/logistic_regression.py Mon Sep 04 11:53:23 2017 -0700 @@ -43,12 +43,28 @@ - Write your code step by step for the propagation. np.log(), np.dot() """ - m = X.shape[1] + + # FORWARD PROPAGATION (FROM X TO COST) cost = cost_function(w, b, X, Y) # compute cost - A = sigmoid(w.T*X + b) # compute activation - raise NotImplementedError('TODO') + # BACKWARD PROPAGATION (TO FIND GRADIENT) + m = X.shape[1] + A = sigmoid(np.dot(w.T, X) + b) # compute activation + dw = (1./m)*np.dot(X, (A - Y).T) + db = (1./m)*np.sum(A - Y) + + # sanity check + assert(A.shape[1] == m) + assert(dw.shape == w.shape), "dw.shape is {}; w.shape is {}".format(dw.shape, w.shape) + assert(db.dtype == float) + cost = np.squeeze(cost) + assert(cost.shape == ()) + + # return gradients + grads = {"dw": dw, + "db": db} + return grads, cost def cost_function(w, b, X, Y):