क्यों खट्टा std () matlab std () के लिए एक अलग परिणाम देता है?


87

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

matlab में

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

सुन्न में

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

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

जवाबों:


145

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

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

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

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

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

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

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


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

कुछ बिंदु पर यह मानक बदल गया है: np.std () = np.std (ddof = 1), भले ही दस्तावेज़ीकरण कहता है कि np.std () को ddof = 0 पर डिफ़ॉल्ट होना चाहिए ...
ColinMac

61

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

विचरण की परिभाषा

इसलिए विचरण के लिए एक अनुमानक होगा

पक्षपाती आकलनकर्ता

जहां नमूना माध्यनमूना का अर्थ है। बेतरतीब ढंग से चयनित के लिए xi, यह दिखाया जा सकता है कि यह अनुमानक वास्तविक विचरण के लिए नहीं, बल्कि में परिवर्तित होता है

निष्पक्ष आकलनकर्ता

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

निष्पक्ष आकलनकर्ता

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

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

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


2
सही आकलनकर्ता के लिए सूत्र में, कारक n (योग के भीतर) मौजूद नहीं होना चाहिए।
फ्रुनोबुलैक्स

3
विचरण में n-1 शब्द के पीछे का अंतर्ज्ञान: आपने पहले से ही अपने नमूने का उपयोग उस अर्थ का अनुमान लगाने के लिए किया है जिसका उपयोग आप प्रसरण को अंजाम देने के लिए करेंगे। यह एक सहसंबंध का परिचय देता है और इस प्रकार ddof 1 होना चाहिए
मथियास

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

4

जो लोग आंकड़ों से महान नहीं हैं, उनके लिए एक सरल मार्गदर्शिका है:

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

  • सुनिश्चित करें ddof=0कि आप np.std()पूरी आबादी के लिए गणना कर रहे हैं

डीडीओएफ को नमूने के लिए शामिल किया जाता है ताकि संख्या में उत्पन्न होने वाले पूर्वाग्रह का प्रतिकार हो सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.