2016-04-27 9 views
12

। हमें बाध्य के साथ यादृच्छिक w.r.t सामान्य वितरण का एक समूह प्राप्त करना चाहिए। हम np.random.normal() के साथ एक सामान्य वितरण संख्या प्राप्त कर सकते हैं लेकिन यह किसी भी बाध्य पैरामीटर की पेशकश नहीं करता है। मैं जानना चाहता हूं कि ऐसा कैसे करें?numpy में एक सीमा के भीतर एक सामान्य वितरण कैसे प्राप्त करें? मशीन सीखने के कार्य में

+4

नहीं करना चाहिए ' सामान्य रूप से यादृच्छिक नमूने नहीं परिभाषा द्वारा वितरित डेटा unbounded हो? – Tom

उत्तर

8

आप Truncated normal distribution लिए देख रहे हैं, वह SciPy एक समारोह के लिए यह truncnorm

कहा जाता है इस वितरण का मानक रूप रेंज [क, ख] करने के लिए एक मानक सामान्य छोटा कर दिया है - सूचना है कि ए और बी मानक सामान्य के डोमेन पर परिभाषित किया गया है। एक विशिष्ट मतलब और मानक विचलन, उपयोग के लिए क्लिप मूल्यों बदलने के लिए:

ए, बी = (myclip_a - my_mean)/my_std, (myclip_b - my_mean)/my_std

truncnorm आकार पैरामीटर के रूप में ए और बी लेता है ।

>>> from scipy.stats import truncnorm 
>>> truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10) 
array([-1.83136675, 0.77599978, -0.01276925, 1.87043384, 1.25024188, 
     0.59336279, -0.39343176, 1.9449987 , -1.97674358, -0.31944247]) 

ऊपर के उदाहरण -2 से घिरा है और 2 और रिटर्न 10 यादृच्छिक variates (.rvs() पद्धति का उपयोग करके)

>>> min(truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10000)) 
-1.9996074381484044 
>>> max(truncnorm(a=-2/3., b=2/3., scale=3).rvs(size=10000)) 
1.9998486576228549 

यहाँ -6 के लिए एक हिस्टोग्राम साजिश है, 6:

enter image description here

+0

आप truncnorm (ए = -2, बी = 2, स्केल = 1) – maple

+2

का उपयोग क्यों नहीं करते हैं बस यह स्पष्ट करने के लिए कि ए और बी आकार पैरामीटर हैं अन्यथा पाठक 2 से 2 के पैमाने के साथ 2, 2 कोशिश कर सकता है , और उसके बाद यादृच्छिक मान प्राप्त करें [-2, 2] – bakkal

1

@bakkal सुझाव (+1) के अलावा आपमें भी देखना चाहते हैंइसे प्राप्त करने के लिए नुस्खा, py-rtnorm मॉड्यूल के रूप में Christoph Lassner द्वारा पुनः लिखा गया।

12

truncnorm की parametrization जटिल है, इसलिए यहां एक समारोह है कि कुछ अधिक सहज ज्ञान युक्त करने के लिए parametrization तब्दील है:

from scipy.stats import truncnorm 

def get_truncated_normal(mean=0, sd=1, low=0, upp=10): 
    return truncnorm(
     (low - mean)/sd, (upp - mean)/sd, loc=mean, scale=sd) 


इसका उपयोग कैसे करें?

  1. उदाहरण मानकों के साथ जनरेटर: मतलब, मानक विचलन, और काट-छांट रेंज:

    >>> X = get_truncated_normal(mean=8, sd=2, low=1, upp=10) 
    
  2. उसके बाद, आप उपयोग कर सकते हैं एक्स एक मूल्य उत्पन्न करने के लिए:

    >>> X.rvs() 
    6.0491227353928894 
    
  3. या, एक numpy एन के साथ rray मूल्यों उत्पन्न:

    >>> X.rvs(10) 
    array([ 7.70231607, 6.7005871 , 7.15203887, 6.06768994, 7.25153472, 
         5.41384242, 7.75200702, 5.5725888 , 7.38512757, 7.47567455]) 
    

एक दृश्य उदाहरण

यहाँ

तीन अलग अलग छोटा सामान्य वितरण की साजिश है:

X1 = get_truncated_normal(mean=2, sd=1, low=1, upp=10) 
X2 = get_truncated_normal(mean=5.5, sd=1, low=1, upp=10) 
X3 = get_truncated_normal(mean=8, sd=1, low=1, upp=10) 

import matplotlib.pyplot as plt 
fig, ax = plt.subplots(3, sharex=True) 
ax[0].hist(X1.rvs(10000), normed=True) 
ax[1].hist(X2.rvs(10000), normed=True) 
ax[2].hist(X3.rvs(10000), normed=True) 
plt.show() 

enter image description here

+1

शानदार उत्तर, धन्यवाद! – Gabriel

+0

+1। हालांकि, यह ध्यान देने योग्य है कि फ़ंक्शन के अंदर 'get_truncated_normal.rvs() 'का उपयोग तुरंत बाहर करने के बजाय, फ़ंक्शन के अंदर तुरंत उपयोग किया जाता है। बेशक, यह केवल तभी मदद करता है जब आप यादृच्छिक ड्रॉ चाहते हैं –

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