Подтвердить что ты не робот

Multinomial pmf в python scipy/numpy

Есть ли встроенная функция в 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])

Каков правильный способ сделать это? спасибо.

4b9b3361

Ответ 1

Нет встроенной функции, о которой я знаю, и биномиальные вероятности не обобщаются (вам нужно нормализовать другой набор возможных результатов, так как сумма всех счетчиков должна быть 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!)