2014-06-05 13 views
17

यह एक साधारण परीक्षणपायथन: Numpy मानक विचलन त्रुटि

import numpy as np 
data = np.array([-1,0,1]) 
print data.std() 

>> 0.816496580928 

मुझे समझ नहीं आता कि यह कैसे परिणाम उत्पन्न किया है? जाहिर है:

((1^0.5 + 1^0.5 + 0^0.5)/(3-1))^0.5 = 1 

और matlab में यह मेरे std([-1,0,1]) = 1 देता है। क्या आप समझने में मेरी सहायता कर सकते हैं कि numpy.std() कैसे काम करता है?

+7

एन -1 द्वारा विभाजित नमूना भिन्नता देता है, लेकिन न्यूपीपी जनसंख्या भिन्नता की गणना करता है। –

+6

यह एक उपरोक्त दे रहा है क्योंकि आबादी और नमूना मानक विचलन के बीच का अंतर शायद ही कभी ध्यान दिया जाता है जब तक कि परिणाम मेल नहीं हो जाते हैं - एक चुनना, और यह जानकर कि आप इसका उपयोग क्यों कर रहे हैं, दोनों इस समस्या को रोकने में मदद करेंगे और आपको उपयोगी रूप से सोचने के लिए भी मजबूर करेंगे आपकी समस्या के बारे में थोड़ा और। (सभी अप्रिय अनुभव से कहा।)। – schodge

उत्तर

17

इस समस्या का क्रूक्स यह है कि आपको N (3), N-1 (2) से विभाजित करने की आवश्यकता है। जैसा कि इर्समैन ने इंगित किया है, नम्र जनसंख्या भिन्नता का उपयोग करेंगे, नमूना भिन्नता नहीं।

तो असली जवाब sqrt(2/3) है जो वास्तव में है कि: 0.8164965...

आप जानबूझकर एक अलग मूल्य स्वतंत्रता की डिग्री के लिए (0 के डिफ़ॉल्ट से) का उपयोग करने, कीवर्ड तर्क का उपयोग की कोशिश कर कर रहे हैं तो ddof

np.std(data, ddof=1) 

... लेकिन यहाँ तो कर अपने मूल समस्या reintroduce के रूप में numpy N - ddof से विभाजित होगा होगा: एक सकारात्मक मान 0 के अलावा अन्य के साथ।

+0

क्षमा करें, 2 बस टाइपो है। मुझे लगता है कि np.std() सिर्फ सार्वभौमिक std है। यदि यह एक नमूना std है, तो यह एन -1 होना चाहिए। नमूना std के लिए कोई समारोह है? – MacSanhe

+0

@MacSanhe आह, तो इससे अधिक समझ में आता है कि आप यह गलती कैसे कर सकते हैं! – BlackVegetable

+0

@MacSanhe आपकी चिंता का समाधान करने के लिए विवरण के साथ संपादित किया गया। – BlackVegetable

3

यह गलत होने का सुझाव देने से पहले फ़ंक्शन/विधि के लिए सहायता पृष्ठ पढ़ने योग्य है। यह तरीका ठीक है कि डॉक्टर-स्ट्रिंग कहता है कि यह करना चाहिए, 3 से विभाजित होना चाहिए, क्योंकि डिफ़ॉल्ट रूप से ddof शून्य है।:

In [3]: numpy.std? 

String form: <function std at 0x104222398> 
File:  /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/fromnumeric.py 
Definition: numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False) 
Docstring: 
Compute the standard deviation along the specified axis. 

... 

ddof : int, optional 
    Means Delta Degrees of Freedom. The divisor used in calculations 
    is ``N - ddof``, where ``N`` represents the number of elements. 
    By default `ddof` is zero. 
1

जब मैटलैब से NumPy में हो रही, तो आप शायद काम के लिए दोनों डॉक्स रखने के लिए चाहता हूँ। वे समान हैं लेकिन अक्सर छोटे लेकिन महत्वपूर्ण विवरणों में भिन्न होते हैं। असल में, वे अलग-अलग मानक विचलन की गणना करते हैं। डिफ़ॉल्ट रूप से (माफ करना!) मानकीकृत नहीं होने के बाद, मैं मानक विचलन की गणना करने वाले किसी भी चीज़ के लिए प्रलेखन की जांच करने की दृढ़ता से अनुशंसा करता हूं, चाहे कोई पॉकेट कैलकुलेटर या प्रोग्रामिंग भाषा हो।

Numpy एसटीडी: http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html

मैटलैब एसटीडी: http://www.mathworks.com/help/matlab/ref/std.html

std के लिए Numpy डॉक्स थोड़ा अपारदर्शी, IMHO कर रहे हैं, विशेष रूप से यह देखते हुए कि NumPy डॉक्स आम तौर पर काफी स्पष्ट हैं। यदि आप काफी दूर पढ़ते हैं: The average squared deviation is normally calculated as x.sum()/N, where N = len(x). If, however, ddof is specified, the divisor N - ddof is used instead. In standard statistical practice, ddof=1 provides an unbiased estimator of the variance of the infinite population. (अंग्रेजी में, डिफ़ॉल्ट पॉप std dev है, नमूना std dev के लिए ddof=1 सेट करें)।

OTOH, मैटलैब डॉक्स अंतर स्पष्ट करना है कि आप ऊपर ट्रिपिंग है:

There are two common textbook definitions for the standard deviation s of a data vector X. [equations omitted] n is the number of elements in the sample. The two forms of the equation differ only in n – 1 versus n in the divisor.

तो, डिफ़ॉल्ट रूप से, मैटलैब नमूना मानक विचलन की गणना करता है (एन -1 भाजक में है, तो बड़ा क्षतिपूर्ति करने के लिए तथ्य के लिए यह एक नमूना है) और Numpy आबादी मानक विचलन (divisor में एन) की गणना करता है। नमूना मानक, या आपके इच्छित किसी अन्य denominator (जो मेरे आंकड़े ज्ञान से परे चला जाता है) पर स्विच करने के लिए आप ddof पैरामीटर का उपयोग करते हैं।

आखिरकार, यह इस समस्या पर मदद नहीं करता है, लेकिन आपको शायद इस बिंदु पर यह उपयोगी लगेगा।http://wiki.scipy.org/NumPy_for_Matlab_Users

+0

जिज्ञासा से, मुझे कभी भी 'ddof'' के मान का उपयोग करने की आवश्यकता होगी जैसे कि 'ddof ∉ {0, 1} '? – PythonNut

+0

मुझे नहीं पता, मैंने कभी उन दोनों का उपयोग किया है। शायद http://stats.stackexchange.com/ के लिए एक सवाल – schodge

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