docs: def poisson_objective(X, m, w):
      """
      Creates an objective function and its derivative for M, given W and X
      Args:
          w (array): clusters x cells
          X (array): genes x cells
          selected_genes (array): array of ints - genes to be selected
      """
      clusters, cells = w.shape
      genes = X.shape[0]
      #m = m.reshape((X.shape[0], w.shape[0]))
      d = m.dot(w)+eps
      #temp = X/d
      #w_sum = w.sum(1)
      #w2 = w.dot(temp.T)
      #deriv = w_sum - w2.T
      return np.sum(d - X*np.log(d))/genes