Python scipy.special.polygamma() Examples
The following are 22
code examples of scipy.special.polygamma().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
scipy.special
, or try the search function
.
Example #1
Source File: test_basic.py From Computable with MIT License | 6 votes |
def test_polygamma(self): poly2 = special.polygamma(2,1) poly3 = special.polygamma(3,1) assert_almost_equal(poly2,-2.4041138063,10) assert_almost_equal(poly3,6.4939394023,10) # Test polygamma(0, x) == psi(x) x = [2, 3, 1.1e14] assert_almost_equal(special.polygamma(0, x), special.psi(x)) # Test broadcasting n = [0, 1, 2] x = [0.5, 1.5, 2.5] expected = [-1.9635100260214238, 0.93480220054467933, -0.23620405164172739] assert_almost_equal(special.polygamma(n, x), expected) expected = np.row_stack([expected]*2) assert_almost_equal(special.polygamma(n, np.row_stack([x]*2)), expected) assert_almost_equal(special.polygamma(np.row_stack([n]*2), x), expected)
Example #2
Source File: test_basic.py From GraphicDesignPatternByPython with MIT License | 6 votes |
def test_polygamma(self): poly2 = special.polygamma(2,1) poly3 = special.polygamma(3,1) assert_almost_equal(poly2,-2.4041138063,10) assert_almost_equal(poly3,6.4939394023,10) # Test polygamma(0, x) == psi(x) x = [2, 3, 1.1e14] assert_almost_equal(special.polygamma(0, x), special.psi(x)) # Test broadcasting n = [0, 1, 2] x = [0.5, 1.5, 2.5] expected = [-1.9635100260214238, 0.93480220054467933, -0.23620405164172739] assert_almost_equal(special.polygamma(n, x), expected) expected = np.row_stack([expected]*2) assert_almost_equal(special.polygamma(n, np.row_stack([x]*2)), expected) assert_almost_equal(special.polygamma(np.row_stack([n]*2), x), expected)
Example #3
Source File: polygamma.py From chainer with MIT License | 5 votes |
def polygamma(n, x): """Polygamma function. .. note:: Forward computation in CPU can not be done if `SciPy <https://www.scipy.org/>`_ is not available. Args: n (:class:`~chainer.Variable` or :ref:`ndarray`): Input variable. x (:class:`~chainer.Variable` or :ref:`ndarray`): Input variable. Returns: ~chainer.Variable: Output variable. """ return PolyGamma().apply((n, x))[0]
Example #4
Source File: ldamodel.py From topical_word_embeddings with MIT License | 5 votes |
def update_alpha(self, gammat, rho): """ Update parameters for the Dirichlet prior on the per-document topic weights `alpha` given the last `gammat`. Uses Newton's method, described in **Huang: Maximum Likelihood Estimation of Dirichlet Distribution Parameters.** (http://www.stanford.edu/~jhuang11/research/dirichlet/dirichlet.pdf) """ N = float(len(gammat)) logphat = sum(dirichlet_expectation(gamma) for gamma in gammat) / N dalpha = numpy.copy(self.alpha) gradf = N * (psi(numpy.sum(self.alpha)) - psi(self.alpha) + logphat) c = N * polygamma(1, numpy.sum(self.alpha)) q = -N * polygamma(1, self.alpha) b = numpy.sum(gradf / q) / ( 1 / c + numpy.sum(1 / q)) dalpha = -(gradf - b) / q if all(rho() * dalpha + self.alpha > 0): self.alpha += rho() * dalpha else: logger.warning("updated alpha not positive") logger.info("optimized alpha %s" % list(self.alpha)) return self.alpha
Example #5
Source File: ldamodel.py From topical_word_embeddings with MIT License | 5 votes |
def update_alpha(self, gammat, rho): """ Update parameters for the Dirichlet prior on the per-document topic weights `alpha` given the last `gammat`. Uses Newton's method, described in **Huang: Maximum Likelihood Estimation of Dirichlet Distribution Parameters.** (http://www.stanford.edu/~jhuang11/research/dirichlet/dirichlet.pdf) """ N = float(len(gammat)) logphat = sum(dirichlet_expectation(gamma) for gamma in gammat) / N dalpha = numpy.copy(self.alpha) gradf = N * (psi(numpy.sum(self.alpha)) - psi(self.alpha) + logphat) c = N * polygamma(1, numpy.sum(self.alpha)) q = -N * polygamma(1, self.alpha) b = numpy.sum(gradf / q) / ( 1 / c + numpy.sum(1 / q)) dalpha = -(gradf - b) / q if all(rho() * dalpha + self.alpha > 0): self.alpha += rho() * dalpha else: logger.warning("updated alpha not positive") logger.info("optimized alpha %s" % list(self.alpha)) return self.alpha
Example #6
Source File: ldamodel.py From topical_word_embeddings with MIT License | 5 votes |
def update_alpha(self, gammat, rho): """ Update parameters for the Dirichlet prior on the per-document topic weights `alpha` given the last `gammat`. Uses Newton's method: http://www.stanford.edu/~jhuang11/research/dirichlet/dirichlet.pdf """ N = float(len(gammat)) logphat = sum(dirichlet_expectation(gamma) for gamma in gammat) / N dalpha = numpy.copy(self.alpha) gradf = N * (psi(numpy.sum(self.alpha)) - psi(self.alpha) + logphat) c = N * polygamma(1, numpy.sum(self.alpha)) q = -N * polygamma(1, self.alpha) b = numpy.sum(gradf / q) / ( 1 / c + numpy.sum(1 / q)) dalpha = -(gradf - b) / q if all(rho() * dalpha + self.alpha > 0): self.alpha += rho() * dalpha else: logger.warning("updated alpha not positive") logger.info("optimized alpha %s" % list(self.alpha)) return self.alpha
Example #7
Source File: _continuous_distns.py From Splunking-Crime with GNU Affero General Public License v3.0 | 5 votes |
def _stats(self, c): # See, for example, "A Statistical Study of Log-Gamma Distribution", by # Ping Shing Chan (thesis, McMaster University, 1993). mean = sc.digamma(c) var = sc.polygamma(1, c) skewness = sc.polygamma(2, c) / np.power(var, 1.5) excess_kurtosis = sc.polygamma(3, c) / (var*var) return mean, var, skewness, excess_kurtosis
Example #8
Source File: BurstyVariationalOptimizer.py From refinery with MIT License | 5 votes |
def objectiveGradient(lambda_k, nu, tau, Elog_eta_k, nDoc): ''' Calculate gradient of objectiveFunc, objective for HDP variational Returns ------- gvec : 2*K length vector, where each entry gives partial derivative with respect to the corresponding entry of Cvec ''' # lvec is the derivative of log(lambda_k) via chain rule lvec = 1/(lambda_k) W = lvec.size # Derivative of log eta digammaAll = digamma(np.sum(lambda_k)) Elog_lambda_k = digamma(lambda_k) - digammaAll # Derivative of Elog_phi_k and E_phi_k polygammaAll = polygamma(1,np.sum(lambda_k)) dElog_phi_k = polygamma(1,lambda_k) - polygammaAll lambda_k_sum = np.sum(lambda_k) dE_phi_k = (lambda_k_sum - lambda_k) / np.power(lambda_k_sum,2) gvec = dElog_phi_k * (N + tau - lambda_k) \ + dE_phi_k * nu * Elog_eta_k gvec = -1 * gvec # Apply chain rule! gvecC = lvec * gvec return gvecC
Example #9
Source File: test_mpmath.py From GraphicDesignPatternByPython with MIT License | 5 votes |
def test_polygamma(self): assert_mpmath_equal(sc.polygamma, time_limited()(exception_to_nan(mpmath.polygamma)), [IntArg(0, 1000), Arg()])
Example #10
Source File: _continuous_distns.py From GraphicDesignPatternByPython with MIT License | 5 votes |
def _stats(self, c): # See, for example, "A Statistical Study of Log-Gamma Distribution", by # Ping Shing Chan (thesis, McMaster University, 1993). mean = sc.digamma(c) var = sc.polygamma(1, c) skewness = sc.polygamma(2, c) / np.power(var, 1.5) excess_kurtosis = sc.polygamma(3, c) / (var*var) return mean, var, skewness, excess_kurtosis
Example #11
Source File: lda.py From numpy-ml with GNU General Public License v3.0 | 5 votes |
def _maximize_alpha(self, max_iters=1000, tol=0.1): """ Optimize alpha using Blei's O(n) Newton-Raphson modification for a Hessian with special structure """ D = self.D T = self.T alpha = self.alpha gamma = self.gamma for _ in range(max_iters): alpha_old = alpha # Calculate gradient g = D * (digamma(np.sum(alpha)) - digamma(alpha)) + np.sum( digamma(gamma) - np.tile(digamma(np.sum(gamma, axis=1)), (T, 1)).T, axis=0, ) # Calculate Hessian diagonal component h = -D * polygamma(1, alpha) # Calculate Hessian constant component z = D * polygamma(1, np.sum(alpha)) # Calculate constant c = np.sum(g / h) / (z ** (-1.0) + np.sum(h ** (-1.0))) # Update alpha alpha = alpha - (g - c) / h # Check convergence if np.sqrt(np.mean(np.square(alpha - alpha_old))) < tol: break return alpha
Example #12
Source File: _continuous_distns.py From lambda-packs with MIT License | 5 votes |
def _stats(self, c): # See, for example, "A Statistical Study of Log-Gamma Distribution", by # Ping Shing Chan (thesis, McMaster University, 1993). mean = sc.digamma(c) var = sc.polygamma(1, c) skewness = sc.polygamma(2, c) / np.power(var, 1.5) excess_kurtosis = sc.polygamma(3, c) / (var*var) return mean, var, skewness, excess_kurtosis
Example #13
Source File: polygamma.py From chainer with MIT License | 5 votes |
def backward(self, indexes, gy): n, x = self.get_retained_inputs() return None, polygamma(n + 1, x) * gy[0],
Example #14
Source File: polygamma.py From chainer with MIT License | 5 votes |
def forward_gpu(self, inputs): n, x = inputs self.retain_inputs((0, 1)) return utils.force_array( cuda.cupyx.scipy.special.polygamma(n, x), dtype=x.dtype),
Example #15
Source File: polygamma.py From chainer with MIT License | 5 votes |
def forward_cpu(self, inputs): n, x = inputs global _polygamma_cpu if _polygamma_cpu is None: try: from scipy import special _polygamma_cpu = special.polygamma except ImportError: raise ImportError('SciPy is not available. Forward computation' ' of polygamma can not be done.') self.retain_inputs((0, 1)) return utils.force_array(_polygamma_cpu(n, x), dtype=x.dtype),
Example #16
Source File: polygamma.py From chainer with MIT License | 5 votes |
def label(self): return 'polygamma'
Example #17
Source File: test_mpmath.py From Computable with MIT License | 5 votes |
def test_polygamma(self): assert_mpmath_equal(sc.polygamma, _time_limited()(_exception_to_nan(mpmath.polygamma)), [IntArg(0, 1000), Arg()])
Example #18
Source File: ldamodel.py From topical_word_embeddings with MIT License | 5 votes |
def update_alpha(self, gammat, rho): """ Update parameters for the Dirichlet prior on the per-document topic weights `alpha` given the last `gammat`. Uses Newton's method, described in **Huang: Maximum Likelihood Estimation of Dirichlet Distribution Parameters.** (http://www.stanford.edu/~jhuang11/research/dirichlet/dirichlet.pdf) """ N = float(len(gammat)) logphat = sum(dirichlet_expectation(gamma) for gamma in gammat) / N dalpha = numpy.copy(self.alpha) gradf = N * (psi(numpy.sum(self.alpha)) - psi(self.alpha) + logphat) c = N * polygamma(1, numpy.sum(self.alpha)) q = -N * polygamma(1, self.alpha) b = numpy.sum(gradf / q) / ( 1 / c + numpy.sum(1 / q)) dalpha = -(gradf - b) / q if all(rho() * dalpha + self.alpha > 0): self.alpha += rho() * dalpha else: logger.warning("updated alpha not positive") logger.info("optimized alpha %s" % list(self.alpha)) return self.alpha
Example #19
Source File: ldamodel.py From topical_word_embeddings with MIT License | 5 votes |
def update_alpha(self, gammat, rho): """ Update parameters for the Dirichlet prior on the per-document topic weights `alpha` given the last `gammat`. Uses Newton's method, described in **Huang: Maximum Likelihood Estimation of Dirichlet Distribution Parameters.** (http://www.stanford.edu/~jhuang11/research/dirichlet/dirichlet.pdf) """ N = float(len(gammat)) logphat = sum(dirichlet_expectation(gamma) for gamma in gammat) / N dalpha = numpy.copy(self.alpha) gradf = N * (psi(numpy.sum(self.alpha)) - psi(self.alpha) + logphat) c = N * polygamma(1, numpy.sum(self.alpha)) q = -N * polygamma(1, self.alpha) b = numpy.sum(gradf / q) / ( 1 / c + numpy.sum(1 / q)) dalpha = -(gradf - b) / q if all(rho() * dalpha + self.alpha > 0): self.alpha += rho() * dalpha else: logger.warning("updated alpha not positive") logger.info("optimized alpha %s" % list(self.alpha)) return self.alpha
Example #20
Source File: ldamodel.py From topical_word_embeddings with MIT License | 5 votes |
def update_alpha(self, gammat, rho): """ Update parameters for the Dirichlet prior on the per-document topic weights `alpha` given the last `gammat`. Uses Newton's method: http://www.stanford.edu/~jhuang11/research/dirichlet/dirichlet.pdf """ N = float(len(gammat)) logphat = sum(dirichlet_expectation(gamma) for gamma in gammat) / N dalpha = numpy.copy(self.alpha) gradf = N * (psi(numpy.sum(self.alpha)) - psi(self.alpha) + logphat) c = N * polygamma(1, numpy.sum(self.alpha)) q = -N * polygamma(1, self.alpha) b = numpy.sum(gradf / q) / ( 1 / c + numpy.sum(1 / q)) dalpha = -(gradf - b) / q if all(rho() * dalpha + self.alpha > 0): self.alpha += rho() * dalpha else: logger.warning("updated alpha not positive") logger.info("optimized alpha %s" % list(self.alpha)) return self.alpha
Example #21
Source File: OptimizerForHDPFullVarModel.py From refinery with MIT License | 4 votes |
def _calcGradients(u1, u0, E): ''' ''' dU1 = dict() dU0 = dict() K = u1.size uboth = u1 + u0 polygamma1Both = polygamma(1, uboth) dU1['Elogv'] = polygamma(1, u1) - polygamma1Both dU0['Elogv'] = -polygamma1Both dU1['Elog1-v'] = -polygamma1Both dU0['Elog1-v'] = polygamma(1,u0) - polygamma1Both Q1 = u1 / (uboth * uboth) Q0 = u0 / (uboth * uboth) dU1_Ebeta = np.tile(E['beta'], (K,1)) dU1_Ebeta /= E['1-v'][:,np.newaxis] diagIDs = np.diag_indices(K) dU1_Ebeta[diagIDs] /= -E['v']/E['1-v'] # Slow way to force lower-triangle of dU1 to be all zeros #lowTriIDs = np.tril_indices(K, -1) #dU1_Ebeta[lowTriIDs] = 0 # Fast way lowTriIDs = get_lowTriIDs(K) dU1_Ebeta[lowTriIDs] = 0 # Fastest way #lowTriIDs = get_lowTriIDs_flat(K) #dU1_Ebeta.ravel()[flatlowTriIDs] = 0 dU0_Ebeta = dU1_Ebeta * Q1[:,np.newaxis] dU1_Ebeta *= -1 * Q0[:,np.newaxis] dU1['Ebeta'] = dU1_Ebeta dU0['Ebeta'] = dU0_Ebeta return dU1, dU0 ########################################################### Objective/gradient ########################################################### in terms of c
Example #22
Source File: discrete_model.py From vnpy_crypto with MIT License | 4 votes |
def _hessian_nb2(self, params): """ Hessian of NB2 model. """ if self._transparams: # lnalpha came in during fit alpha = np.exp(params[-1]) else: alpha = params[-1] a1 = 1/alpha params = params[:-1] exog = self.exog y = self.endog[:,None] mu = self.predict(params)[:,None] prob = a1 / (a1 + mu) dgpart = digamma(a1 + y) - digamma(a1) # for dl/dparams dparams dim = exog.shape[1] hess_arr = np.empty((dim+1,dim+1)) const_arr = a1*mu*(a1+y)/(mu+a1)**2 for i in range(dim): for j in range(dim): if j > i: continue hess_arr[i,j] = np.sum(-exog[:,i,None] * exog[:,j,None] * const_arr, axis=0) tri_idx = np.triu_indices(dim, k=1) hess_arr[tri_idx] = hess_arr.T[tri_idx] # for dl/dparams dalpha da1 = -alpha**-2 dldpda = -np.sum(mu*exog*(y-mu)*a1**2/(mu+a1)**2 , axis=0) hess_arr[-1,:-1] = dldpda hess_arr[:-1,-1] = dldpda # for dl/dalpha dalpha #NOTE: polygamma(1,x) is the trigamma function da2 = 2*alpha**-3 dalpha = da1 * (dgpart + np.log(prob) - (y - mu)/(a1+mu)) dada = (da2 * dalpha/da1 + da1**2 * (special.polygamma(1, a1+y) - special.polygamma(1, a1) + 1/a1 - 1/(a1 + mu) + (y - mu)/(mu + a1)**2)).sum() hess_arr[-1,-1] = dada return hess_arr #TODO: replace this with analytic where is it used?