2010-10-22 10 views
10

ऐसा लगता है कि यह एक ही वितरण है, numpy.random से यादृच्छिक नमूने ड्राइंग scipy.stats.-.rvs से ऐसा करने से तेज़ है। मैं सोच रहा था कि दोनों के बीच गति अंतर क्या होता है?scipy.stats से यादृच्छिक ड्रॉ के बीच अंतर .... आरवीएस और numpy.random

उत्तर

10

scipy.stats.uniform वास्तव में, numpy का उपयोग करता है यहाँ आँकड़ों में इसी समारोह है (mtrand numpy.random के लिए एक उपनाम है)

class uniform_gen(rv_continuous): 
    def _rvs(self): 
     return mtrand.uniform(0.0,1.0,self._size) 

scipy.stats त्रुटि जाँच और बनाने के लिए भूमि के ऊपर का एक सा है इंटरफ़ेस अधिक लचीला। जब तक आप प्रत्येक ड्रॉ के लिए लूप में वर्दी.आरवी को कॉल नहीं करते हैं तब तक गति अंतर कम से कम होना चाहिए। आप प्राप्त कर सकते हैं बजाय सभी यादृच्छिक, एक बार में ड्रॉ उदाहरण (10 लाख) के लिए

>>> rvs = stats.uniform.rvs(size=(10000, 1000)) 
>>> rvs.shape 
(10000, 1000) 

यहां लंबा जवाब है, कि मैंने कुछ समय पहले लिखा था:

scipy/numpy में बुनियादी यादृच्छिक संख्या बनाई गई हैं मेर्सेन-ट्विस्टर पीआरएनजी numpy.random में। Numpy.random में वितरण के लिए यादृच्छिक संख्या साइथन/पायरेक्स में हैं और बहुत तेज हैं।

  • सीधे numpy.random से, उदाहरण के लिए:

    scipy.stats एक यादृच्छिक संख्या जनरेटर नहीं है, यादृच्छिक संख्या तीन तरीकों में से एक में प्राप्त कर रहे हैं सामान्य, टी, ... बहुत तेजी से

  • यादृच्छिक अन्य यादृच्छिक संख्या के परिवर्तन द्वारा संख्या कि numpy.random में उपलब्ध हैं, भी बहुत तेजी से, क्योंकि यह संख्या

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

+0

धन्यवाद। मैं एमसीएमसी दिनचर्या चला रहा हूं इसलिए मुझे बहुत अधिक आकर्षित करना है, इसलिए मैं numpy.random का उपयोग करूंगा। – joon

5

मैं आज इस में भाग गया और बस इस प्रश्न में कुछ समय ब्योरा जोड़ना चाहता था। मैंने देखा कि किस जून ने उल्लेख किया है, विशेष रूप से, सामान्य वितरण से यादृच्छिक संख्या के साथ scipy.stats से अधिक तेज़ी से उत्पन्न हुई थी। चूंकि उपयोगकर्ता 333700 का उल्लेख है कि rvs के साथ कुछ ओवरहेड है लेकिन यदि आप यादृच्छिक मानों की एक सरणी उत्पन्न कर रहे हैं तो यह अंतर numpy की तुलना में बंद हो जाता है।

from scipy.stats import norm 
import numpy as np 

n = norm(0, 1) 
%timeit -n 1000 n.rvs(1)[0] 
%timeit -n 1000 np.random.normal(0,1) 

%timeit -n 1000 a = n.rvs(1000) 
%timeit -n 1000 a = [np.random.normal(0,1) for i in range(0, 1000)] 
%timeit -n 1000 a = np.random.randn(1000) 

यह, मेरे चलाने पर साथ numpy संस्करण 1.11.1 और scipy 0.17.0, आउटपुट:

1000 loops, best of 3: 46.8 µs per loop 
1000 loops, best of 3: 492 ns per loop 
1000 loops, best of 3: 115 µs per loop 
1000 loops, best of 3: 343 µs per loop 
1000 loops, best of 3: 61.9 µs per loop 

तो सिर्फ एक नमूने के तौर पर पैदा rvs लगभग था से यहाँ एक jupyter समय उदाहरण है numpy का उपयोग करने से 100x धीमी है। हालांकि, यदि आप अंतराल बंद होने से मूल्यों की एक सरणी उत्पन्न कर रहे हैं (115 से 61।9 माइक्रोसॉन्ड)।

यदि आप इससे बच सकते हैं, तो शायद लूप में एक बार यादृच्छिक मूल्य प्राप्त करने के लिए rvs पर कॉल न करें।

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