Naive tuning of the the learning rate on the in-sample data
        
        Parameters
        ----------
        h : int
            How many steps to run Aggregate on

        parameter_list: list
            List of parameters to search for a good learning rate over

        Returns
        ----------
        - Void (changes self.learning_rate)

def tune_learning_rate(self, h, parameter_list=None):
        """ Naive tuning of the the learning rate on the in-sample data
        
        Parameters
        ----------
        h : int
            How many steps to run Aggregate on

        parameter_list: list
            List of parameters to search for a good learning rate over

        Returns
        ----------
        - Void (changes self.learning_rate)
        """

        if parameter_list is None:
            parameter_list = [0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0, 10000.0,100000.0]
        
        for parameter in parameter_list:
            self.learning_rate = parameter
            _, losses, _ = self.run(h, recalculate=False)
            loss = losses[0]
            if parameter == parameter_list[0]:
                best_rate = parameter
                best_loss = loss
            else:
                if loss < best_loss:
                    best_loss = loss
                    best_rate = parameter

        self.learning_rate = best_rate