https://www.pycodemates.com/2021/09/optimize-linear-regression-using-gradient-descent.html