2014-12-22 5 views
66

मै मैटलैब कोड को numpy में बदलने की कोशिश करता हूं और यह पता लगाया जाता है कि numpy के पास std फ़ंक्शन के साथ एक अलग परिणाम है।numpy std() matlab std() के लिए एक अलग परिणाम क्यों देता है?

matlab

std([1,3,4,6]) 
ans = 2.0817 

में

numpy

np.std([1,3,4,6]) 
1.8027756377319946 

में यह सामान्य है? और मुझे इसे कैसे संभालना चाहिए?

उत्तर

114

NumPy फ़ंक्शन np.std वैकल्पिक पैरामीटर ddof लेता है: "स्वतंत्रता की डेल्टा डिग्री"। डिफ़ॉल्ट रूप से, यह 0 है। यह 1 करने के लिए सेट MATLAB परिणाम प्राप्त करने के:

>>> np.std([1,3,4,6], ddof=1) 
2.0816659994661326 

थोड़ा और संदर्भ को जोड़ने के लिए विचरण (जो के मानक विचलन वर्गमूल है) की गणना में, हम आम तौर पर मान की संख्या से विभाजित हम की है।

लेकिन यदि हम बड़े वितरण से N तत्वों का एक यादृच्छिक नमूना चुनते हैं और भिन्नता की गणना करते हैं, तो N द्वारा विभाजन वास्तविक भिन्नता को कम करके आ सकता है। इसे ठीक करने के लिए, हम N (आमतौर पर N-1) से कम संख्या में विभाजित संख्या (the degrees of freedom) को विभाजित कर सकते हैं। ddof पैरामीटर हम निर्दिष्ट राशि से विभाजक को बदल सकते हैं।

जब तक अन्यथा कहा, NumPy विचरण के लिए पक्षपाती आकलनकर्ता की गणना करेगा (ddof=0, N से विभाजित)। यह वही है जो आप चाहते हैं यदि आप पूरे वितरण के साथ काम कर रहे हैं (और मूल्यों का सबसेट नहीं है जिसे बड़े वितरण से यादृच्छिक रूप से चुना गया है)। यदि ddof पैरामीटर दिया गया है, तो NumPy N - ddof द्वारा विभाजित करता है।

MATLAB के std का डिफ़ॉल्ट व्यवहार N-1 द्वारा विभाजित करके नमूना भिन्नता के पूर्वाग्रह को सही करना है। यह मानक विचलन में पूर्वाग्रह के कुछ (लेकिन संभवतः सभी नहीं) से छुटकारा पाता है। यदि आप बड़े वितरण के यादृच्छिक नमूने पर फ़ंक्शन का उपयोग कर रहे हैं तो यह वही हो सकता है जो आप चाहते हैं।

@hbaderts द्वारा अच्छा जवाब आगे गणितीय विवरण देता है।

+3

मैं इसे मैटलैब में जोड़ूंगा, 'std ([1 3 4 6], 1)' न्यूमपी के डिफ़ॉल्ट 'np.std ([1,3,4,6]) के बराबर है। यह सब Matlab और NumPy के लिए प्रलेखन में स्पष्ट रूप से समझाया गया है, इसलिए मैं दृढ़ता से अनुशंसा करता हूं कि ओपी भविष्य में उनको पढ़ना सुनिश्चित करे। – horchler

51

मानक विचलन भिन्नता का वर्ग रूट है। एक यादृच्छिक चर X के विचरण के रूप में परिभाषित

definition of variance

विचरण के लिए एक आकलनकर्ता इसलिए

biased estimator

जहां sample mean को दर्शाता है नमूना मतलब होगा है।बेतरतीब ढंग से xi चयनित के लिए, यह दिखाया जा सकता है कि इस आकलनकर्ता असली विचरण करने के लिए अभिसरण नहीं है, लेकिन

unbiased estimator

यदि आप बेतरतीब ढंग से चयन के नमूने और नमूने का अनुमान मतलब और विचरण करने के लिए, आप एक का उपयोग करना होगा सुधारा (निष्पक्ष) आकलनकर्ता

unbiased estimator

जो sigma squared की ओर अभिसरित होगा। सुधार शब्द n-1 को बेसेल के सुधार भी कहा जाता है।

अब डिफ़ॉल्ट रूप से, MATLABs std संशोधन पद n-1 साथ निष्पक्ष आकलनकर्ता गणना करता है। हालांकि NumPy (जैसा कि @ajcr समझाया गया है) पक्षपातपूर्ण अनुमानक की गणना डिफ़ॉल्ट रूप से कोई सुधार अवधि के साथ करता है। पैरामीटर ddof कोई सुधार अवधि n-ddof सेट करने की अनुमति देता है। इसे 1 तक सेट करके आप MATLAB में समान परिणाम प्राप्त करते हैं।

इसी तरह, MATLAB एक दूसरा पैरामीटर w जोड़ने की अनुमति देता है, जो "वजन योजना" निर्दिष्ट करता है। डिफ़ॉल्ट, w=0, परिणाम n-1 (निष्पक्ष अनुमानक) में परिणाम, जबकि w=1 के लिए, केवल n को सुधार अवधि (पक्षपातपूर्ण अनुमानक) के रूप में उपयोग किया जाता है।

+2

सही अनुमानक के सूत्र में, कारक * एन * (योग के भीतर) मौजूद नहीं होना चाहिए। – Frunobulax

+2

भिन्नता में एन -1 शब्द के पीछे अंतर्ज्ञान: आपने पहले से ही अपने नमूने का उपयोग उस अनुमान का अनुमान लगाने के लिए किया है जिसका उपयोग आप भिन्नता के अनुमान के लिए करेंगे। यह एक सहसंबंध प्रस्तुत करता है और इस प्रकार डीडीओफ़ होना चाहिए 1. – Matthias

+0

@ फ्रुनोबुलैक्स मैंने पोस्टरिटी के लिए टाइपो तय कर दिया है। मूल समीकरण में क्या हुआ था राशि की ऊपरी सीमा ठीक से प्रस्तुत नहीं की जा रही थी। संक्षेप में नोटेशन के शीर्ष पर जाने के बजाय 'n', यह राशि के अंदर चला गया। – rayryeng

1

लोग हैं, जो आँकड़ों के साथ महान नहीं कर रहे हैं के लिए, एक साधारण गाइड है:

  • ddof=1 शामिल करें यदि एक नमूना अपना पूरा डाटासेट से लिया के लिए np.std() की गणना कर रहे हैं।

  • सुनिश्चित ddof=0 आप पूरी आबादी

DDOF आदेश पूर्वाग्रह है कि संख्या में हो सकता है को संतुलित करने में नमूने के लिए शामिल है के लिए np.std() की गणना कर रहे हैं।

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

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