2012-12-16 10 views
13

क्या बहुमूल्य के पीएमएफ प्राप्त करने के लिए scipy/numpy में अंतर्निहित कार्य है? मुझे यकीन नहीं है कि binom सही तरीके से सामान्यीकृत है, उदा।पाइथन scipy/numpy में multinomial pmf

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

ऐसा करने का सही तरीका क्या है? धन्यवाद।

उत्तर

9

कोई अंतर्निहित कार्य नहीं है जिसे मैं जानता हूं, और द्विपक्षीय संभावनाएं सामान्य नहीं होती हैं (आपको संभावित परिणामों के एक अलग सेट पर सामान्यीकृत करने की आवश्यकता होती है, क्योंकि सभी गणनाओं का योग होना चाहिए जो नहीं होगा स्वतंत्र बिनोमिअल्स द्वारा देखभाल की गई)। हालांकि, यह अपने आप को लागू करने के लिए उदाहरण के लिए काफी सीधा है:

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 पैरामीटर के रूप में अनिवार्य है, क्योंकि यह गणनाओं के योग द्वारा दिया जाता है (और उसी पैरामीटर सेट किसी भी एन के लिए काम करता है)। इसके अलावा, चूंकि यह जल्दी से मध्यम एन या बड़ी आयामीता के लिए कम हो जाएगा, इसलिए आप लॉग स्पेस में बेहतर काम कर रहे हैं (लॉगपएमएफ यहां भी प्रदान किया गया है!)