code: def _compute_projection(self, X, W):
          
          # TODO: check W input; handle sparse case
          X = check_array(X)
  
          D = np.diag(W.sum(1))
          L = D - W
          evals, evecs = eigh_robust(np.dot(X.T, np.dot(L, X)),
                                     np.dot(X.T, np.dot(D, X)),
                                     eigvals=(0, self.n_components - 1))
          return evecs
docs: Compute the LPP projection matrix
  
          Parameters
          ----------
          X : array_like, (n_samples, n_features)
              The input data
          W : array_like or sparse matrix, (n_samples, n_samples)
              The precomputed adjacency matrix
  
          Returns
          -------
          P : ndarray, (n_features, self.n_components)
              The matrix encoding the locality preserving projection