संचयी सामान्य वितरण की गणना कैसे करें?


100

मैं Numpy या Scipy (या किसी भी कठोर पायथन लाइब्रेरी) में एक फ़ंक्शन की तलाश कर रहा हूं जो मुझे पायथन में संचयी सामान्य वितरण फ़ंक्शन देगा।

जवाबों:


125

यहाँ एक उदाहरण है:

>>> from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435

दूसरे शब्दों में, मानक सामान्य अंतराल का लगभग 95% दो मानक विचलन के भीतर है, शून्य के मानक अर्थ पर केंद्रित है।

यदि आपको उलटा सीडीएफ चाहिए:

>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)

9
इसके अलावा, आप पैरामीटर के रूप में माध्य (स्थान) और भिन्नता (स्केल) निर्दिष्ट कर सकते हैं। जैसे, d = मानदंड (लोक = = 10.0, स्केल = 2.0); d.cdf (12.0); यहाँ विवरण: docs.scipy.org/doc/scipy-0.14.0/reference/generated/...
Irvan

6
@ इरावन, स्केल पैरामीटर वास्तव में मानक विचलन है, न कि विचरण।

2
क्यों scipy नाम के रूप में इन locऔर scale? मैंने इसका इस्तेमाल किया help(norm.ppf)लेकिन फिर क्या बिल्ली है - locऔर scaleमदद के लिए मदद चाहिए ..
jadadba

2
@javadba - स्थान और पैमाने आँकड़ों में अधिक सामान्य शब्द हैं जिनका उपयोग वितरण की एक विस्तृत श्रृंखला को मानकीकृत करने के लिए किया जाता है। सामान्य वितरण के लिए, वे माध्य और एसडी के साथ पंक्तिबद्ध होते हैं, लेकिन अन्य वितरण के लिए ऐसा नहीं है।
माइकल ओह्लरोगे

1
@MichaelOhlrogge धन्यवाद! यहाँ NIST का एक पृष्ठ है जो आगे itl.nist.gov/div898/handbook/eda/section3/eda364.htm
javadba

40

इस प्रश्न का उत्तर देने में बहुत देर हो सकती है लेकिन चूंकि Google अभी भी यहां लोगों का नेतृत्व करता है, इसलिए मैं यहां अपना समाधान लिखने का फैसला करता हूं।

यही है, पायथन 2.7 के बाद से, mathलाइब्रेरी ने त्रुटि फ़ंक्शन को एकीकृत किया हैmath.erf(x)

erf()समारोह में इस तरह के संचयी मानक सामान्य वितरण के रूप में पारंपरिक सांख्यिकीय कार्यों की गणना करने के लिए इस्तेमाल किया जा सकता है:

from math import *
def phi(x):
    #'Cumulative distribution function for the standard normal distribution'
    return (1.0 + erf(x / sqrt(2.0))) / 2.0

संदर्भ:

https://docs.python.org/2/library/math.html

https://docs.python.org/3/library/math.html

त्रुटि फ़ंक्शन और मानक सामान्य वितरण फ़ंक्शन कैसे संबंधित हैं?


3
यह ठीक वही है जिसकी मुझे तलाश थी। यदि मेरे अलावा कोई और आश्चर्य करता है कि इसका उपयोग "डेटा के प्रतिशत की गणना करने के लिए किया जा सकता है जो मानक वितरण के भीतर है", अच्छी तरह से: 1 - (1 - phi (1)) * 2 = 0.6827 ("1 मानक के भीतर डेटा का 68%) विचलन ")
1830 में हेंस लैंडहोम

1
एक सामान्य सामान्य वितरण के लिए, यह होगा def phi(x, mu, sigma): return (1 + erf((x - mu) / sigma / sqrt(2))) / 2
बर्नहार्ड बार्कर

18

यहाँ से अनुकूलित http://mail.python.org/pipermail/python-list/2000-June/03987.html.html

from math import *
def erfcc(x):
    """Complementary error function."""
    z = abs(x)
    t = 1. / (1. + 0.5*z)
    r = t * exp(-z*z-1.26551223+t*(1.00002368+t*(.37409196+
        t*(.09678418+t*(-.18628806+t*(.27886807+
        t*(-1.13520398+t*(1.48851587+t*(-.82215223+
        t*.17087277)))))))))
    if (x >= 0.):
        return r
    else:
        return 2. - r

def ncdf(x):
    return 1. - 0.5*erfcc(x/(2**0.5))

3
चूंकि std lib लागू है math.erf (), वहाँ एक sep कार्यान्वयन की आवश्यकता नहीं है।
मार्क

मुझे उत्तर नहीं मिल पा रहा था, वे नंबर कहां से आए?
त्म्श्मथ

17

शुरू Python 3.8, मानक पुस्तकालय मॉड्यूल के NormalDistहिस्से के रूप में वस्तु प्रदान करता है statistics

इसका उपयोग संचयी वितरण फ़ंक्शन को प्राप्त करने के लिए किया जा सकता है ( cdf- संभावना है कि किसी दिए गए माध्य ( mu) और मानक विचलन ( sigma) के लिए एक यादृच्छिक नमूना X x से कम या उसके बराबर होगा ):

from statistics import NormalDist

NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796

मानक सामान्य वितरण ( mu = 0और sigma = 1) के लिए सरलीकृत किया जा सकता है :

NormalDist().cdf(1.96)
# 0.9750021048517796

NormalDist().cdf(-1.96)
# 0.024997895148220428

15

अज्ञात के उदाहरण पर निर्माण करने के लिए, बहुत सारे पुस्तकालयों में लागू फ़ंक्शन मानदंड () के बराबर पायथन होगा:

def normcdf(x, mu, sigma):
    t = x-mu;
    y = 0.5*erfcc(-t/(sigma*sqrt(2.0)));
    if y>1.0:
        y = 1.0;
    return y

def normpdf(x, mu, sigma):
    u = (x-mu)/abs(sigma)
    y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2)
    return y

def normdist(x, mu, sigma, f):
    if f:
        y = normcdf(x,mu,sigma)
    else:
        y = normpdf(x,mu,sigma)
    return y

9

एलेक्स का जवाब आपको मानक सामान्य वितरण (मतलब = 0, मानक विचलन = 1) के लिए एक समाधान दिखाता है। यदि आपके पास सामान्य वितरण है meanऔर std(जो है sqr(var)) और आप गणना करना चाहते हैं:

from scipy.stats import norm

# cdf(x < val)
print norm.cdf(val, m, s)

# cdf(x > val)
print 1 - norm.cdf(val, m, s)

# cdf(v1 < x < v2)
print norm.cdf(v2, m, s) - norm.cdf(v1, m, s)

यहां cdf के बारे में अधिक पढ़ें और यहां कई फॉर्मूलों के साथ सामान्य वितरण को लागू करना है


2

ऊपर से लिया गया:

from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435

दो-पूंछ वाले परीक्षण के लिए:

Import numpy as np
z = 1.96
p_value = 2 * norm.cdf(-np.abs(z))
0.04999579029644087


-9

जैसा कि Google खोज netlogo pdf के लिए यह उत्तर देता है , यहाँ उपरोक्त पायथन कोड का netlogo संस्करण है

    ;; सामान्य वितरण संचयी घनत्व फ़ंक्शन
    to-report normcdf [x mu sigma]
        चलो tx - म्यू
        चलो y 0.5 * erfcc [- t / (सिग्मा * sqrt 2.0)]
        अगर (y> 1.0) [सेट y 1.0]
        रिपोर्ट y
    समाप्त

    ;; सामान्य वितरण संभावना घनत्व समारोह
    रिपोर्ट-रिपोर्ट मानदंड [x mu sigma]
        लेट यू = (एक्स - म्यू) / एब्स सिग्मा
        let y = 1 / (sqrt [2 * pi] * abs सिग्मा) * exp (- u * u / 2.0)
        रिपोर्ट y
    समाप्त

    ;; पूरक त्रुटि फ़ंक्शन
    ए-रिपोर्ट erfcc [x]
        Z एब्स एक्स करें
        चलो टी 1.0 / (1.0 + 0.5 * z)
        Let rt * exp (- z * z -1.26551223 + t * (1.00002368 + t * (0.37409196 +)
            t * (0.09678418 + t * (-0.18628806 + t * (.27886807 +)
            t * (-1.13520398 + t * (1.48851587 + t * (-0.82215223 +)
            t * .17087277)))))))))
        ifelse (x> = 0) [रिपोर्ट r] [रिपोर्ट 2.0 - r]
    समाप्त


6
सवाल पायथन के बारे में है, नेटलोगो के बारे में नहीं। यह उत्तर यहां नहीं होना चाहिए। और कृपया इसका अर्थ बदलने के लिए प्रश्न को संपादित न करें।
13

मुझे पता है कि यह पसंदीदा तरीका नहीं है, लेकिन मुझे लगता है कि यह इस तरह से सबसे अधिक उपयोगी है क्योंकि लोगों को इस पृष्ठ पर Google द्वारा निर्देशित किया जाता है (वर्तमान में ...)
platipodium
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.