2012-06-28 10 views
5

शायद मैं कुछ गलत कर रहा हूं जबकि z-normalizing मेरी सरणी। क्या कोई इसे देख सकता है और सुझाव दे रहा है कि क्या हो रहा है?आर और पायथन के बीच आउटपुट मूल्य भिन्न हैं?

आर में:

> data <- c(2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34) 
> data.mean <- mean(data) 
> data.sd <- sqrt(var(data)) 
> data.norm <- (data - data.mean)/data.sd 
> print(data.norm) 
[1] -0.9796808 -0.8622706 -0.6123005 0.8496459 1.7396910 1.5881940 1.0958286 0.5277147 0.4709033 -0.2865819 
[11] 0.0921607 -0.2865819 -0.9039323 -1.1955641 -1.2372258 

अजगर में numpy का उपयोग कर:

>>> import string 
>>> import numpy as np 
>>> from scipy.stats import norm 
>>> data = np.array([np.array([2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34])]) 
>>> data -= np.split(np.mean(data, axis=1), data.shape[0]) 
>>> data *= np.split(1.0/data.std(axis=1), data.shape[0]) 
>>> print data 

[[-1.01406602 -0.89253491 -0.63379126 0.87946705 1.80075126 1.64393692 
    1.13429034 0.54623659 0.48743122 -0.29664045 0.09539539 -0.29664045 
    -0.93565885 -1.23752644 -1.28065039]] 

मैं numpy गलत तरीके से उपयोग कर रहा हूँ?

+0

आप किसी अन्य np.array के अंदर np.array के रूप में 'डेटा' क्यों सेट कर रहे हैं? –

+0

@ ह्यूग बॉथवेल: ओह ... मैंने उसे नोटिस नहीं किया। यह कोड के एक बड़े टुकड़े से सरलीकृत किया गया था जहां डेटा सरणी की सरणी थी। – Legend

+1

बस रिकॉर्ड के लिए, आर में आप 'data.norm <- पैमाने (डेटा, केंद्र = TRUE, स्केल = TRUE)' – Marius

उत्तर

9

मुझे विश्वास है कि आपका NumPy परिणाम सही है। मैं, हालांकि एक सरल तरीका था सामान्यीकरण करना होगा:

>>> data = np.array([2.02, 2.33, 2.99, 6.85, 9.20, 8.80, 7.50, 6.00, 5.85, 3.85, 4.85, 3.85, 2.22, 1.45, 1.34]) 
>>> data -= data.mean() 
>>> data /= data.std() 
>>> data 
array([-1.01406602, -0.89253491, -0.63379126, 0.87946705, 1.80075126, 
     1.64393692, 1.13429034, 0.54623659, 0.48743122, -0.29664045, 
     0.09539539, -0.29664045, -0.93565885, -1.23752644, -1.28065039]) 

अपने दो परिणाम के बीच अंतर सामान्य में निहित है:

>>> r/data 
array([ 0.96609173, 0.96609173, 0.96609173, 0.96609179, 0.96609179, 0.96609181, 0.9660918 , 0.96609181, 
     0.96609179, 0.96609179,  0.9660918 , 0.96609179, 0.96609175, 0.96609176, 0.96609177]) 

इस प्रकार, अपने दो परिणाम हैं: आर परिणाम के रूप में r साथ ज्यादातर एक दूसरे के लिए आनुपातिक। इसलिए आप आर और पायथन के साथ प्राप्त मानक विचलन की तुलना करना चाहते हैं।

पुनश्च: अब जब कि मैं इसके बारे में सोच रहा हूँ, यह हो सकता है कि NumPy में और अनुसंधान में विचरण उसी तरह से परिभाषित नहीं है: N तत्वों के लिए, कुछ उपकरण N, के बजाय N-1 साथ सामान्य जब की गणना भिन्नता आप इसे देखना चाह सकते हैं।

पी पी एस: यहाँ विसंगति के लिए कारण है: कारकों में अंतर दो अलग अलग सामान्य सम्मेलनों से आता है: .९६,६०,९१७ ... (मनाया कारक बस sqrt है (14/15) = डेटा 15 तत्व है क्योंकि)। इस प्रकार, पाइथन में उसी परिणाम में आर प्राप्त करने के लिए, आपको इस कारक द्वारा आर परिणाम को विभाजित करने की आवश्यकता है।

+0

+1 पुष्टि करने के लिए धन्यवाद। क्या इस दृष्टिकोण के मामले में डेटा के लिए कई सरणी हैं (जैसे मेरे प्रश्न में लेकिन एकाधिक सरणी तत्व)? साथ ही, कोई विचार क्यों 'आर' से परिणाम अलग है? – Legend

+1

@Legend मैं पुष्टि कर सकता हूं कि आर एन -1 को एक denominator के रूप में उपयोग करता है, और बस सोच रहा था कि अंतर हो सकता है। एक आंकड़े लड़के के रूप में, मैं वास्तव में थोड़ा सा चौंक गया हूं कि numpy डिफ़ॉल्ट रूप से n का उपयोग करेगा, लेकिन मुझे यकीन है कि किसी के कहने से अभी आर के विपरीत है। – joran

+0

@Legend: आपके द्वारा उत्तर में उपयोग किए जाने वाले 'अक्ष = 1' पैरामीटर का तरीका है, यदि आपके पास सरणी के अंदर सरणी है। – EOL

14

आपको अलग-अलग परिणामों के कारण होने का कारण मानक विचलन/भिन्नता की गणना कैसे की जाती है। आर denominator N-1 का उपयोग करके गणना करता है, जबकि numpy denominator N का उपयोग करके गणना करता है। आप data.std(ddof=1) का उपयोग करके आर परिणाम के बराबर एक नुकीला परिणाम प्राप्त कर सकते हैं, जो भिन्नता की गणना करते समय N-1 का उपयोग करने के लिए numpy बताता है।

+1

+1, जो हाथ से सही कारक डालने से आसान है। – EOL

+0

+1 दृष्टिकोण के लिए धन्यवाद! – Legend

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