i. Create a NeuralNetwork class with an __init__ method that initializes a random weight vector, learning rate, and history variable to save weights and costs after each epoch. ii. The class includes a sigmoid activation function and forward_propagation method that takes inputs, multiplies them by weights, applies the sigmoid, and outputs the result. iii. A train method performs gradient descent learning for a specified number of iterations, using the inputs, labels, and learning rate to update the weights each iteration.