input: Write a function to implement the Gradient Descent Algorithm for linear regression. The function should take inputs x (independent variable), y (dependent variable), learning_rate (default to 0.01), and iterations (default to 100). It should update the slope (m) and intercept (b) iteratively and print the current values of m, b, and the cost at each iteration. Finally, it should return the updated values of m and b.
  
  import numpy as np
  
  def gradient_descent(x, y, learning_rate=0.01, iterations=100):
      m_curr = b_curr = 0
      n = len(x)
      for i in range(iterations):
          y_predicted = m_curr * x + b_curr
          cost = (1/n) * sum([val**2 for val in (y-y_predicted)])
          md = -(2/n)*sum(x*(y-y_predicted))
          bd = -(2/n)*sum(y-y_predicted)
          m_curr = m_curr - learning_rate * md
          b_curr = b_curr - learning_rate * bd
          print ("m {}, b {}, cost {} iteration {}".format(m_curr,b_curr,cost, i))
      return m_curr, b_curr
  
  assert gradient_descent(np.array([1, 2, 3, 4, 5]), np.array([5, 7, 9, 11, 13]))==(2.0, 3.0)
  assert gradient_descent(np.array([1, 2, 3, 4, 5]), np.array([5, 8, 11, 14, 17]))==(3.0, 2.0)
output: def gradient_descent(x, y, learning_rate=0.01, iterations=100):
      m_curr = b_curr = 0
      n = len(x)
      for i in range(iterations):
          y_predicted = m_curr * x + b_curr
          cost = (1/n) * sum([val**2 for val in (y-y_predicted)])
          md = -(2/n)*sum(x*(y-y_predicted))
          bd = -(2/n)*sum(y-y_predicted)
          m_curr = m_curr - learning_rate * md
          b_curr = b_curr - learning_rate * bd
          print ("m {}, b {}, cost {} iteration {}".format(m_curr,b_curr,cost, i))
      return m_curr, b_curr