def __init__(self, training_data, dim_no=3, k_order=1, alpha=0.001):
     LinearRegressor.__init__(self, training_data, dim_no, k_order, alpha, normalize=False)
def run_linear_regression_test(part):
    # Construct data sets

    dir_path = os.path.dirname(os.path.realpath(__file__))
    data = ConcreteData.ConcreteData(dir_path +
                                     '/../../Data/concrete/train.csv')

    # Test data
    test_data = ConcreteData.ConcreteData(dir_path +
                                          '/../../Data/concrete/test.csv')

    if part != 3:

        manual_input = str(
            input("Do you wish to input parameters manually? y/n\n"))
        analytic_answer = str(
            input(
                "Do you wish to print out the analytic answer for comparison? y/n\n"
            ))
        if manual_input == "y":
            max_iters = int(
                input(
                    "Please enter max number of iterations for gradient descent\n"
                ))
            tolerance = float(
                input("Please enter a tolerance for algorithm termination\n"))
            step_size = float(
                input(
                    "Please enter a constant step size for each iteration\n"))
        else:
            max_iters = 10000
            tolerance = float(1e-6)
            step_size = 0.02

        grad_desc = GradientDescent.GradientDescent(data.features, data.output)
        if part == 1:
            step_size = 0.0145
            result = grad_desc.fit(obj_func=lr.objective_function,
                                   grad_func=lr.obj_gradient_function,
                                   args=None,
                                   max_iters=max_iters,
                                   step_function=lambda x: step_size,
                                   tolerance=tolerance)
        else:
            result = grad_desc.fit_stochastic(
                obj_func=lr.objective_function,
                grad_func=lr.stoch_gradient_function,
                args=None,
                max_iters=max_iters,
                step_function=lambda x: step_size,
                tolerance=tolerance)

        print("step size was " + str(step_size))
        if result[1] == max_iters + 1:
            print("Iteration did not converge after " + str(max_iters) +
                  " iterations. Resultant vector is:")
            print(result[0])
            print("Try with another constant step size.")
        else:
            print("Success! Converged after " + str(result[1]) +
                  " iterations. Resultant vector is: ")
            print(result[0])

        print("\nEvaluating at the vector yields train cost of %.16f" %
              (lr.objective_function(data.features, data.output, [result[0]])))
        t_vals = np.linspace(0, (len(result[2])) * 10, len(result[2]))

        print("Using the above, we then have the following test cost:")
        test_cost = lr.objective_function(test_data.features, test_data.output,
                                          [result[0]])
        print("%.16f" % test_cost)

        if analytic_answer == "y":
            print("\nAnalytic minimizer is:")
            minimizer = lr.analytic_solution(data.features, data.output)
            print(minimizer)
            print("Cost using analytic minimizer is: %.16f" %
                  (lr.objective_function(data.features, data.output,
                                         [minimizer])))
            minimizer_cost = lr.objective_function(test_data.features,
                                                   test_data.output,
                                                   [minimizer])
            print("Test cost using analytic minimizer is: %.16f" %
                  minimizer_cost)
            print("\n2-norm error in result vector vs. minimizer is %.16f" %
                  (la.norm(result[0] - minimizer)))

            print(
                "Absolute error in test cost vs analytic test cost is %.16f" %
                (np.abs(minimizer_cost - test_cost)))
            print(
                "Relative error in test cost vs analytic test cost is %.16f" %
                (np.abs((minimizer_cost - test_cost) / minimizer_cost)))

        plt.plot(t_vals, result[2], label='Cost')
        plt.legend(loc='best')
        plt.show()

    else:
        print("\nAnalytic minimizer is:")
        minimizer = lr.analytic_solution(data.features, data.output)
        print(minimizer)
        print("Cost using analytic minimizer is: %.16f" %
              (lr.objective_function(data.features, data.output, [minimizer])))
        print("Test cost using analytic minimizer is: %.16f" %
              (lr.objective_function(test_data.features, test_data.output,
                                     [minimizer])))
 def h_theta(self, theta, x_features):
     """
     This is the logistic function that uses the sigmoid
     """
     h_theta = LinearRegressor.h_theta(self, theta, x_features)
     return 1.0 / (1 + np.power(np.e, -h_theta))