code: def ridge_regression(X, Y, c1=0.0, c2=0.0, offset=None, ix=None):
      
      _, d = X.shape
  
      if c1 > 0 or c2 > 0:
          penalizer_matrix = (c1 + c2) * np.eye(d)
          A = np.dot(X.T, X) + penalizer_matrix
      else:
          A = np.dot(X.T, X)
  
      if offset is None or c2 == 0:
          b = np.dot(X.T, Y)
      else:
          b = np.dot(X.T, Y) + c2 * offset
  
      if ix is not None:
          M = np.c_[X.T[:, ix], b]
      else:
          M = np.c_[X.T, b]
      R = solve(A, M, assume_a="pos", check_finite=False)
      return R[:, -1], R[:, :-1]
docs: Also known as Tikhonov regularization. This solves the minimization problem:
  
      min_{beta} ||(beta X - Y)||^2 + c1||beta||^2 + c2||beta - offset||^2
  
      One can find more information here: http://en.wikipedia.org/wiki/Tikhonov_regularization
  
      Parameters
      ----------
      X: a (n,d) numpy array
      Y: a (n,) numpy array
      c1: float
      c2: float
      offset: a (d,) numpy array.
      ix: a boolean array of index to slice.
  
      Returns
      -------
      beta_hat: numpy array
        the solution to the minimization problem. V = (X*X^T + (c1+c2)I)^{-1} X^T