From 11a6542bf2704de3cbba22843fa8322e87569cc0 Mon Sep 17 00:00:00 2001 From: Krishna Vedala <7001608+kvedala@users.noreply.github.com> Date: Fri, 26 Jun 2020 08:04:01 -0400 Subject: [PATCH 1/5] added test cases --- .../ordinary_least_squares_regressor.cpp | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/numerical_methods/ordinary_least_squares_regressor.cpp b/numerical_methods/ordinary_least_squares_regressor.cpp index bbd75a742..d36a84042 100644 --- a/numerical_methods/ordinary_least_squares_regressor.cpp +++ b/numerical_methods/ordinary_least_squares_regressor.cpp @@ -9,6 +9,7 @@ * * \author [Krishna Vedala](https://github.com/kvedala) */ +#include #include // for print formatting #include #include @@ -352,10 +353,48 @@ std::vector predict_OLS_regressor(std::vector> const &X, return result; } +/** Self test checks */ +void test() { + int F = 3, N = 5; + + // test function = x^2 -5 + std::cout << "Test 1 (quadratic function)...."; + std::vector> data1( + {{-5, 25, -125}, {-1, 1, -1}, {0, 0, 0}, {1, 1, 1}, {6, 36, 216}}); + std::vector Y1({20, -4, -5, -4, 31}); + std::vector beta1 = fit_OLS_regressor(data1, Y1); + std::vector> test1( + {{-2, 4, -8}, {2, 4, 8}, {-10, 100, -1000}, {10, 100, 1000}}); + std::vector expected1({-1, -1, 95, 95}); + std::vector out1 = predict_OLS_regressor(test1, beta1); + for (size_t rows = 0; rows < out1.size(); rows++) + assert(std::abs(out1[rows] - expected1[rows]) < 0.01); // accuracy + std::cout << "passed\n"; + + // test function = x^3 + x^2 - 100 + std::cout << "Test 2 (cubic function)...."; + std::vector> data2( + {{-5, 25, -125}, {-1, 1, -1}, {0, 0, 0}, {1, 1, 1}, {6, 36, 216}}); + std::vector Y2({-200, -100, -100, 98, 152}); + std::vector beta2 = fit_OLS_regressor(data2, Y2); + std::vector> test2( + {{-2, 4, -8}, {2, 4, 8}, {-10, 100, -1000}, {10, 100, 1000}}); + std::vector expected2({-104, -88, -1000, 1000}); + std::vector out2 = predict_OLS_regressor(test2, beta2); + for (size_t rows = 0; rows < out2.size(); rows++) + assert(std::abs(out2[rows] - expected2[rows]) < 0.01); // accuracy + std::cout << "passed\n"; + + std::cout << std::endl; // ensure test results are displayed on screen + // (flush stdout) +} + /** * main function */ int main() { + test(); + size_t N, F; std::cout << "Enter number of features: "; From 6d127e3adfbbb0f64abb94d1800fa5f5c66ec3cc Mon Sep 17 00:00:00 2001 From: Krishna Vedala <7001608+kvedala@users.noreply.github.com> Date: Fri, 26 Jun 2020 08:09:34 -0400 Subject: [PATCH 2/5] added inline documentation --- .../ordinary_least_squares_regressor.cpp | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/numerical_methods/ordinary_least_squares_regressor.cpp b/numerical_methods/ordinary_least_squares_regressor.cpp index d36a84042..614fdab9a 100644 --- a/numerical_methods/ordinary_least_squares_regressor.cpp +++ b/numerical_methods/ordinary_least_squares_regressor.cpp @@ -357,32 +357,46 @@ std::vector predict_OLS_regressor(std::vector> const &X, void test() { int F = 3, N = 5; - // test function = x^2 -5 + /* test function = x^2 -5 */ std::cout << "Test 1 (quadratic function)...."; + // create training data set with features = x, x^2, x^3 std::vector> data1( {{-5, 25, -125}, {-1, 1, -1}, {0, 0, 0}, {1, 1, 1}, {6, 36, 216}}); + // create corresponding outputs std::vector Y1({20, -4, -5, -4, 31}); + // perform regression modelling std::vector beta1 = fit_OLS_regressor(data1, Y1); + // create test data set with same features = x, x^2, x^3 std::vector> test1( {{-2, 4, -8}, {2, 4, 8}, {-10, 100, -1000}, {10, 100, 1000}}); + // expected regression outputs std::vector expected1({-1, -1, 95, 95}); + // predicted regression outputs std::vector out1 = predict_OLS_regressor(test1, beta1); + // compare predicted results are within +-0.01 limit of expected for (size_t rows = 0; rows < out1.size(); rows++) - assert(std::abs(out1[rows] - expected1[rows]) < 0.01); // accuracy + assert(std::abs(out1[rows] - expected1[rows]) < 0.01); std::cout << "passed\n"; - // test function = x^3 + x^2 - 100 + /* test function = x^3 + x^2 - 100 */ std::cout << "Test 2 (cubic function)...."; + // create training data set with features = x, x^2, x^3 std::vector> data2( {{-5, 25, -125}, {-1, 1, -1}, {0, 0, 0}, {1, 1, 1}, {6, 36, 216}}); + // create corresponding outputs std::vector Y2({-200, -100, -100, 98, 152}); + // perform regression modelling std::vector beta2 = fit_OLS_regressor(data2, Y2); + // create test data set with same features = x, x^2, x^3 std::vector> test2( {{-2, 4, -8}, {2, 4, 8}, {-10, 100, -1000}, {10, 100, 1000}}); + // expected regression outputs std::vector expected2({-104, -88, -1000, 1000}); + // predicted regression outputs std::vector out2 = predict_OLS_regressor(test2, beta2); + // compare predicted results are within +-0.01 limit of expected for (size_t rows = 0; rows < out2.size(); rows++) - assert(std::abs(out2[rows] - expected2[rows]) < 0.01); // accuracy + assert(std::abs(out2[rows] - expected2[rows]) < 0.01); std::cout << "passed\n"; std::cout << std::endl; // ensure test results are displayed on screen From 0d2a58409e3c9c4a1c77878555b93c8de36c1a01 Mon Sep 17 00:00:00 2001 From: Krishna Vedala <7001608+kvedala@users.noreply.github.com> Date: Fri, 26 Jun 2020 08:14:50 -0400 Subject: [PATCH 3/5] include cstdlib for std::abs() --- numerical_methods/ordinary_least_squares_regressor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/numerical_methods/ordinary_least_squares_regressor.cpp b/numerical_methods/ordinary_least_squares_regressor.cpp index 614fdab9a..4761a6d96 100644 --- a/numerical_methods/ordinary_least_squares_regressor.cpp +++ b/numerical_methods/ordinary_least_squares_regressor.cpp @@ -10,6 +10,7 @@ * \author [Krishna Vedala](https://github.com/kvedala) */ #include +#include // for std::abs #include // for print formatting #include #include From 7ff384e59b5741b2b1d0ff981efa10ed891b5350 Mon Sep 17 00:00:00 2001 From: Krishna Vedala <7001608+kvedala@users.noreply.github.com> Date: Fri, 26 Jun 2020 08:20:53 -0400 Subject: [PATCH 4/5] replace cstdlib with cmath for float overload of std::abs() --- numerical_methods/ordinary_least_squares_regressor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/numerical_methods/ordinary_least_squares_regressor.cpp b/numerical_methods/ordinary_least_squares_regressor.cpp index 4761a6d96..7482d84da 100644 --- a/numerical_methods/ordinary_least_squares_regressor.cpp +++ b/numerical_methods/ordinary_least_squares_regressor.cpp @@ -10,7 +10,7 @@ * \author [Krishna Vedala](https://github.com/kvedala) */ #include -#include // for std::abs +#include // for std::abs #include // for print formatting #include #include From 9a8b6ddd2ee2854032245a348298a33fdaf8202d Mon Sep 17 00:00:00 2001 From: Krishna Vedala <7001608+kvedala@users.noreply.github.com> Date: Fri, 26 Jun 2020 08:22:12 -0400 Subject: [PATCH 5/5] typo correction from #910 --- numerical_methods/ordinary_least_squares_regressor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/numerical_methods/ordinary_least_squares_regressor.cpp b/numerical_methods/ordinary_least_squares_regressor.cpp index 7482d84da..dcbbcf8c7 100644 --- a/numerical_methods/ordinary_least_squares_regressor.cpp +++ b/numerical_methods/ordinary_least_squares_regressor.cpp @@ -423,7 +423,7 @@ int main() { std::vector Y(N); std::cout - << "Enter training data. Per sample, provide features ad one output." + << "Enter training data. Per sample, provide features and one output." << std::endl; for (size_t rows = 0; rows < N; rows++) {