2010-09-28 10 views
11

मै मैक ओएस एक्स 10.6.4 पर पाइथन 2.6.5 चला रहा हूं (यह मूल संस्करण नहीं है, मैंने इसे स्वयं स्थापित किया है) Scipy 0.8.0 के साथ। यदि मैं निम्नलिखित करता हूं:क्या कुछ कुछ हद तक हाइपरजैमेट्रिक वितरण के इस अजीब व्यवहार को समझा सकते हैं?

>>> from scipy.stats import hypergeom 
>>> hypergeom.sf(5,10,2,5) 

मुझे IndexError मिलता है। फिर मैं करता हूं:

>>> hypergeom.sf(2,10,2,2) 
-4.44.... 

मुझे संदेह है कि ऋणात्मक मूल्य खराब फ़्लोटिंग पॉइंट परिशुद्धता के कारण है। फिर मैं पहले बार करता हूं:

>>> hypergeom.sf(5,10,2,5) 
0.0 

अब यह काम करता है! क्या कोई इसे समझा सकता है? क्या आप यह व्यवहार भी देख रहे हैं?

+2

यह डेबियन पर अजगर 2.6.6 पर एक ही करता है। – eumiro

+2

जो भी इसके लायक है, ऐसा लगता है कि यह एक बग हो सकता है, और इसलिए स्पष्ट रूप से उपयोगकर्ताओं की सूची पर बेहतर पूछा जा सकता है: http://mail.scipy.org/mailman/listinfo/scipy-user यह अधिक होने की संभावना है वहां देवों का ध्यान ... –

+5

मैंने इसके लिए टिकट खोला: http://projects.scipy.org/scipy/ticket/1291। जैसा कि जो किंगटन ने उल्लेख किया है, मेलिंग सूची या पैकेज के बग ट्रैकर को बग या अप्रत्याशित व्यवहार की रिपोर्ट करना उपयोगी होगा। – user333700

उत्तर

3

समस्या तब उत्पन्न होती है जब अस्तित्व समारोह में पहला कॉल उस सीमा में होता है जो स्पष्ट रूप से शून्य होना चाहिए (पिछले उत्तर में मेरी टिप्पणी देखें)। उदा।, Hypergeom.sf (x, एम, एन, एन) पर कॉल के लिए यह विफल रहता है अगर फ़ंक्शन में हाइपरजैमेट्रिक फ़ंक्शन पर पहली कॉल एक ऐसी स्थिति है जहां x> n, जहां अस्तित्व कार्य हमेशा शून्य होगा।

आप तुच्छता द्वारा अस्थायी रूप से इसे ठीक कर सकता है: अब

def new_hypergeom_sf(k, *args, **kwds): 
    from scipy.stats import hypergeom 
    (M, n, N) = args[0:3] 
    try: 
     return hypergeom.sf(k, *args, **kwds) 
    except Exception as inst: 
     if k >= n and type(inst) == IndexError: 
      return 0 ## or conversely 1 - hypergeom.cdf(k, *args, **kwds) 
     else: 
      raise inst 

आप कोई समस्या नहीं संपादन /usr/share/pyshared/scipy/stats/distributions.py (या समतुल्य फ़ाइल) है, ठीक लाइन 3966 जहां अभी इसे पढ़ता है पर संभावना है:

place(output,cond,self._sf(*goodargs)) 
    if output.ndim == 0: 
     return output[()] 
    return output 

लेकिन आप बदल देते हैं तो:

if output.ndim == 0: 
     return output[()] 
    place(output,cond,self._sf(*goodargs)) 
    if output.ndim == 0: 
     return output[()] 
    return output 

अब यह इंडेक्स त्रुटि के बिना काम करता है। असल में यदि आउटपुट शून्य आयामी है क्योंकि यह चेक विफल रहता है, तो यह स्थान कॉल करने में विफल रहता है, विफल रहता है, और वितरण उत्पन्न नहीं करता है। (ऐसा तब नहीं होता है जब कोई पिछला वितरण पहले से ही बनाया जा चुका है, संभवतः यह पहले परीक्षणों पर क्यों नहीं पकड़ा गया था।) ध्यान दें कि जगह (numpy के function_base.py में परिभाषित) सरणी के तत्वों को बदल देगा (हालांकि मैं हूं सुनिश्चित नहीं है कि यह आयामता को बदलता है) तो यह भी हो सकता है कि यह अभी भी स्थान के बाद 0 मंद जांच छोड़ दे। मैंने यह देखने के लिए पूरी तरह से परीक्षण नहीं किया है कि यह परिवर्तन कुछ और तोड़ता है (और यह सभी असतत यादृच्छिक परिवर्तनीय वितरण पर लागू होता है), तो शायद यह पहला फिक्स करने के लिए सबसे अच्छा हो सकता है।

यह इसे तोड़ देता है; उदाहरण के लिए, figures.hypergeom.sf (1,10,2,5) शून्य के रूप में लौटाता है (2/9 के बजाय)।

इस सुधार में काफी बेहतर काम करने के लिए, एक ही अनुभाग में लगता है:

class rv_discrete(rv_generic): 
... 
    def sf(self, k, *args, **kwds): 
    ... 
     if any(cond): 
      place(output,cond,self._sf(*goodargs)) 
     if output.ndim == 0: 
      return output[()] 
     return output 
1

मैं अजगर पता नहीं है, लेकिन समारोह इस तरह परिभाषित किया गया है: hypergeom.sf (एक्स, एम, एन, एन, loc = 0)

एम दिलचस्प वस्तुओं की संख्या है, एन वस्तुओं की कुल संख्या, और एन यह है कि आप कितनी बार "एक चुनते हैं" (क्षमा करें, जर्मन सांख्यिकीविद्)।

आप 20 गेंदों, उन पीले रंग के 7 के साथ एक कटोरा था (एक दिलचस्प पीला), तो एन 20 और एम 7.

शायद समारोह (बकवास) के लिए अपरिभाषित व्यवहार करता है मामला है, जब M> एन?

+0

पायथन में परिभाषित फ़ंक्शन एम, एन, एन के मानों के लिए अच्छी तरह से परिभाषित किया गया है। Scipy.stats.hypergeom के लिए python में docstring से, एम वस्तुओं की कुल संख्या है, एन प्रकार 1 वस्तुओं की संख्या है, और एन प्रतिस्थापन के बिना खींचे जाते हैं। तो जांच hypergeom (x = 0,10,2,5) = 2/9, hypergeom (x = 1,10,2,5) = 5/9, hypergeom (x = 2,10,2,5) = 2/9; इसलिए x <0 0 के लिए उत्तरजीविता कार्य, 0 के लिए 7/9 <= x <1, 2/9 1 <= x <2, और 0 के लिए 0 <= x है। हाइपरजैमेट्रिक वितरण के एसएफ (अस्तित्व समारोह, 1-सीडीएफ, संचयी वितरण समारोह के रूप में पढ़ें) के लिए, हम जानते हैं कि उत्तर 0 होना चाहिए। –

संबंधित मुद्दे