text: # demonstration of L2 regularization
  #
  # notes for this course can be found at:
  # https://deeplearningcourses.com/c/data-science-linear-regression-in-python
  # https://www.udemy.com/data-science-linear-regression-in-python
  
  import numpy as np
  import matplotlib.pyplot as plt
  
  N = 50
  
  # generate the data
  X = np.linspace(0,10,N)
  Y = 0.5*X + np.random.randn(N)
  
  # make outliers
  Y[-1] += 30
  Y[-2] += 30
  
  # plot the data
  plt.scatter(X, Y)
  plt.show()
  
  # add bias term
  X = np.vstack([np.ones(N), X]).T
  
  # plot the maximum likelihood solution
  w_ml = np.linalg.solve(X.T.dot(X), X.T.dot(Y))
  Yhat_ml = X.dot(w_ml)
  plt.scatter(X[:,1], Y)
  plt.plot(X[:,1], Yhat_ml)
  plt.show()
  
  # plot the regularized solution
  # probably don't need an L2 regularization this high in many problems
  # everything in this example is exaggerated for visualization purposes
  l2 = 1000.0
  w_map = np.linalg.solve(l2*np.eye(2) + X.T.dot(X), X.T.dot(Y))
  Yhat_map = X.dot(w_map)
  plt.scatter(X[:,1], Y)
  plt.plot(X[:,1], Yhat_ml, label='maximum likelihood')
  plt.plot(X[:,1], Yhat_map, label='map')
  plt.legend()
  plt.show()