python scipy/numpy 中的多项式 pmf

2023-12-29

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])

这样做的正确方法是什么?谢谢。


据我所知,没有内置函数,并且二项式概率不能泛化(您需要对一组不同的可能结果进行标准化,因为所有计数的总和必须为 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!)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python scipy/numpy 中的多项式 pmf 的相关文章

随机推荐