2014-09-23 11 views
7

तक नहीं है मेरे पास एक बड़ा कोड है जो probability density function (पीडीएफ) से ली गई संभावनाओं के अनुसार एक बिंदु पर नमूने मानता है।numpy 1.9.0: ValueError: संभावनाएं 1

ऐसा करने के लिए मैं numpy.random.choice का उपयोग करता हूं जो numpy 1.8.0 तक ठीक काम करता है। यहाँ एक मेगावाट (फ़ाइल pdf_probs.txthere डाउनलोड किया जा सकता) है:

import simplejson 
import numpy as np 

# Read probabilities from file. 
f = open('pdf_probs.txt', 'r') 
probs = simplejson.load(f) 
f.close() 

print sum(probs) # <-- Not *exactly* 1. but very close: 1.00000173042 
# Define array. 
arr = np.linspace(1., 100., len(probs)) 

# Get samples using the probabilities in probs. 
samples = np.random.choice(arr, size=1000, replace=True, p=probs) 

बात यह है कि numpy 1.9.0 साथ परीक्षण के बाद उपरोक्त कोड त्रुटि के साथ विफल है:

Traceback (most recent call last): 
    File "numpy_180_vs_190_np_random_choice.py", line 13, in <module> 
    samples = np.random.choice(arr, size=1000, replace=True, p=probs) 
    File "mtrand.pyx", line 1083, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:10106) 
ValueError: probabilities do not sum to 1 

पीडीएफ संभावनाओं का योग बिल्कुल पर राशि नहीं होगी 1. बहुत छोटी तैयारी का उपयोग करते समय दिखाई देने वाले छोटे विचलन दिए गए।

जो मैं numpy (1.8.0) के पिछले संस्करण को इकट्ठा कर सकता हूं उससे स्पष्ट रूप से नए 1.9.0 संस्करण की तुलना में बड़ी सहनशीलता थी, लेकिन मैं गलत हो सकता था।

यह numpy 1.8.0 के साथ क्यों काम करता है लेकिन 1.9.0 के साथ नहीं? मैं अपना कोड नए 1.9.0 संस्करण के साथ कैसे काम कर सकता हूं?

+2

यहाँ सहिष्णुता परीक्षण करने के लिए परिवर्तन है: [1.9 संस्करण] (https://github.com/numpy/numpy/blob /maintenance/1.9.x/numpy/random/mtrand/mtrand.pyx#L1082) बनाम [1.8 संस्करण] (https://github.com/numpy/numpy/blob/maintenance/1.8.x/numpy/random/mtrand /mtrand.pyx#L1030)। – user2357112

उत्तर

9

मुझे लगता है कि 1.7e-6 शिकायत के लायक होने के लिए एक बड़ी पर्याप्त सापेक्ष त्रुटि है। आप आसानी से पर्याप्त renormalize कर सकते हैं, हालांकि, अगर आप आश्वस्त हैं त्रुटि नगण्य है:

>>> probs = np.array(probs) 
>>> probs /= probs.sum() 
>>> probs.sum() 
1.0 
>>> samples = np.random.choice(arr, size=1000, replace=True, p=probs) 
>>> samples[:5] 
array([ 1.37635054, 1.1287515 , 1.7229892 , 19.8967587 , 2.07953181]) 
+0

धन्यवाद @DSM, यह एक बहुत ही सरल समाधान है जिसे मैंने नहीं सोचा था। क्या आपको पता है कि कोड अब काम करने के लिए '1.8.0' से' 1.9.0' में क्या बदल गया है? – Gabriel

+0

यह मेरे लिए काम नहीं कर रहा है, मेरी संभावनाएं बड़े पूर्णांक हैं। जब मैं इस चरण 'robs/= probs.sum()' के माध्यम से जाता हूं, तो यह सिर्फ 0 की सरणी बनाता है, इसलिए मेरा योग() शून्य – jrubins

+0

@jrubins है जो पूर्णांक विभाजन का परिणाम है। यदि आप 'probs/= probs.sum()। Astype (float)' करते हैं, तो आपको ठीक होना चाहिए। – wflynny

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