code: def PCA_reduce(X, Q):
      
      assert Q <= X.shape[1], 'Cannot have more latent dimensions than observed'
      evals, evecs = np.linalg.eigh(np.cov(X.T))
      W = evecs[:, -Q:]
      return (X - X.mean(0)).dot(W)
docs: A helpful function for linearly reducing the dimensionality of the data X
      to Q.
      :param X: data array of size N (number of points) x D (dimensions)
      :param Q: Number of latent dimensions, Q < D
      :return: PCA projection array of size N x Q.