code: def ppca(Y, Q, iterations=100):
      
      from numpy.ma import dot as madot
      N, D = Y.shape
      # Initialise W randomly
      W = np.random.randn(D, Q) * 1e-3
      Y = np.ma.masked_invalid(Y, copy=0)
      mu = Y.mean(0)
      Ycentered = Y - mu
      try:
          for _ in range(iterations):
              exp_x = np.asarray_chkfinite(np.linalg.solve(W.T.dot(W), madot(W.T, Ycentered.T))).T
              W = np.asarray_chkfinite(np.linalg.solve(exp_x.T.dot(exp_x), madot(exp_x.T, Ycentered))).T
      except np.linalg.linalg.LinAlgError:
          #"converged"
          pass
      return np.asarray_chkfinite(exp_x), np.asarray_chkfinite(W)
docs: EM implementation for probabilistic pca.
  
      :param array-like Y: Observed Data
      :param int Q: Dimensionality for reduced array
      :param int iterations: number of iterations for EM