Python中Scipy/Numpy的多项式概率质量函数

13

scipy/numpy中是否有用于获取多项式PMF的内置函数?我不确定binom是否以正确的方式进行了泛化,例如:

# Attempt to define multinomial with n = 10, p = [0.1, 0.1, 0.8]
rv = scipy.stats.binom(10, [0.1, 0.1, 0.8])
# Score the outcome 4, 4, 2
rv.pmf([4, 4, 2])

什么是正确的方法?谢谢。


仅为完整起见,自版本0.19.0(2017年3月)以来,scipy拥有一个名为scipy.stats.multinomial的类,实现了多项式分布。以下是文档链接: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.multinomial.html - L_W
1个回答

9

我不知道是否有内置函数可用,而且二项概率不具有普遍性(由于所有计数的总和必须为n,这将不能通过独立的二项式处理,因此需要对不同的可能结果进行归一化)。但是,自己实现相当简单,例如:

import math

class Multinomial(object):
  def __init__(self, params):
    self._params = params

  def pmf(self, counts):
    if not(len(counts)==len(self._params)):
      raise ValueError("Dimensionality of count vector is incorrect")

    prob = 1.
    for i,c in enumerate(counts):
      prob *= self._params[i]**counts[i]

    return prob * math.exp(self._log_multinomial_coeff(counts))

  def log_pmf(self,counts):
    if not(len(counts)==len(self._params)):
      raise ValueError("Dimensionality of count vector is incorrect")

    prob = 0.
    for i,c in enumerate(counts):
      prob += counts[i]*math.log(self._params[i])

    return prob + self._log_multinomial_coeff(counts)

  def _log_multinomial_coeff(self, counts):
    return self._log_factorial(sum(counts)) - sum(self._log_factorial(c)
                                                    for c in counts)

  def _log_factorial(self, num):
    if not round(num)==num and num > 0:
      raise ValueError("Can only compute the factorial of positive ints")
    return sum(math.log(n) for n in range(1,num+1))

m = Multinomial([0.1, 0.1, 0.8])
print m.pmf([4,4,2])

>>2.016e-05

我的多项式系数实现有些简单,并在对数空间中工作以防止溢出。还要注意,n作为参数是多余的,因为它是计数的总和(同一组参数适用于任何n)。此外,由于对于中等n或大维度这将迅速下溢,您最好在对数空间中工作(这里也提供了logPMF!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接