首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python scipy/numpy中的多项pmf

python scipy/numpy中的多项pmf
EN

Stack Overflow用户
提问于 2012-12-17 01:51:19
回答 1查看 3.1K关注 0票数 13

在scipy/numpy中有没有一个内置的函数来获得多项式的PMF?我不确定binom是否以正确的方式进行了概括。

代码语言:javascript
复制
# 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])

执行此操作的正确方法是什么?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-20 22:39:08

据我所知,没有内置函数,二项式概率也不会泛化(你需要对一组不同的可能结果进行归一化,因为所有计数的和必须是n,这不会被独立的二项式处理)。然而,实现您自己是相当简单的,例如:

代码语言:javascript
复制
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都有效)。此外,由于对于中等维度或大维度,这将很快发生下溢,因此您最好在日志空间中工作(这里也提供了logPMF!)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13903922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档