def poisson_objective(X, m, w):
clusters, cells = w.shape<EOL>genes = X.shape[<NUM_LIT:0>]<EOL>d = m.dot(w)+eps<EOL>return np.sum(d - X*np.log(d))/genes<EOL>
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