https://noisrucer.github.io/posts/4_2_gradient_descent/
Gradient Descent and Numpy Implementation - noisrucer