Source code for uncurl.pois_ll

# Poisson log-likelihood

import numpy as np
from scipy import sparse
from scipy.special import xlogy, gammaln

from uncurl.sparse_utils import sparse_poisson_ll_csc

eps = 1e-10

[docs]def sparse_poisson_ll(data, means): data = sparse.csc_matrix(data) return sparse_poisson_ll_csc( data.data, data.indices, data.indptr, data.shape[0], data.shape[1], means, eps)
[docs]def poisson_ll(data, means): """ Calculates the Poisson log-likelihood. Args: data (array): 2d numpy array of genes x cells means (array): 2d numpy array of genes x k Returns: cells x k array of log-likelihood for each cell/cluster pair """ if sparse.issparse(data): return sparse_poisson_ll(data, means) genes, cells = data.shape clusters = means.shape[1] ll = np.zeros((cells, clusters)) for i in range(clusters): means_i = np.tile(means[:,i], (cells, 1)) means_i = means_i.transpose() + eps #ll[:,i] = np.sum(xlogy(data, means_i) - gammaln(data+1) - means_i, 0) ll[:,i] = np.sum(xlogy(data, means_i) - means_i, 0) return ll
[docs]def poisson_ll_2(p1, p2): """ Calculates Poisson LL(p1|p2). """ p1_1 = p1 + eps p2_1 = p2 + eps return np.sum(-p2_1 + p1_1*np.log(p2_1))
[docs]def poisson_dist(p1, p2): """ Calculates the Poisson distance between two vectors. p1 can be a sparse matrix, while p2 has to be a dense matrix. """ # ugh... p1_ = p1 + eps p2_ = p2 + eps return np.dot(p1_-p2_, np.log(p1_/p2_))