जेसन आर के जवाब में एक दोष है, जो नूथ के "कंप्यूटर प्रोग्रामिंग के कला" खंड में चर्चा की गई है। 2. समस्या तब आती है जब आपके पास एक मानक विचलन होता है जो कि माध्य का एक छोटा सा अंश होता है: E (x ^ 2) की गणना - (E (x) ^ 2) फ्लोटिंग पॉइंट राउंडिंग त्रुटियों के लिए गंभीर संवेदनशीलता से ग्रस्त है।
आप खुद भी इसे पायथन लिपि में आज़मा सकते हैं:
ofs = 1e9
A = [ofs+x for x in [1,-1,2,3,0,4.02,5]]
A2 = [x*x for x in A]
(sum(A2)/len(A))-(sum(A)/len(A))**2
मुझे -128.0 एक उत्तर के रूप में मिलता है, जो स्पष्ट रूप से कम्प्यूटेशनल रूप से मान्य नहीं है, क्योंकि गणित भविष्यवाणी करता है कि परिणाम अप्रमाणिक होना चाहिए।
ननथ रनिंग माध्य और मानक विचलन की गणना के लिए एक दृष्टिकोण का आविष्कार करता है (मुझे आविष्कारक का नाम याद नहीं है) जो कुछ इस प्रकार है:
initialize:
m = 0;
S = 0;
n = 0;
for each incoming sample x:
prev_mean = m;
n = n + 1;
m = m + (x-m)/n;
S = S + (x-m)*(x-prev_mean);
और फिर प्रत्येक चरण के बाद, का मान m
माध्य है, और मानक विचलन की गणना इस आधार पर sqrt(S/n)
या की जा सकती है कि मानक विचलन sqrt(S/n-1)
की आपकी पसंदीदा परिभाषा क्या है।
जो समीकरण मैं ऊपर लिख रहा हूं वह नूथ में एक की तुलना में थोड़ा अलग है, लेकिन यह कम्प्यूटेशनल रूप से समकक्ष है।
जब मेरे पास कुछ और मिनट होंगे, तो मैं उपरोक्त सूत्र को पायथन में कोड कर दूंगा और दिखाऊंगा कि आपको एक नॉनवेजिव उत्तर मिलेगा (यह उम्मीद सही मूल्य के करीब है)।
अद्यतन: यहाँ यह है
test1.py:
import math
def stats(x):
n = 0
S = 0.0
m = 0.0
for x_i in x:
n = n + 1
m_prev = m
m = m + (x_i - m) / n
S = S + (x_i - m) * (x_i - m_prev)
return {'mean': m, 'variance': S/n}
def naive_stats(x):
S1 = sum(x)
n = len(x)
S2 = sum([x_i**2 for x_i in x])
return {'mean': S1/n, 'variance': (S2/n - (S1/n)**2) }
x1 = [1,-1,2,3,0,4.02,5]
x2 = [x+1e9 for x in x1]
print "naive_stats:"
print naive_stats(x1)
print naive_stats(x2)
print "stats:"
print stats(x1)
print stats(x2)
परिणाम:
naive_stats:
{'variance': 4.0114775510204073, 'mean': 2.0028571428571427}
{'variance': -128.0, 'mean': 1000000002.0028572}
stats:
{'variance': 4.0114775510204073, 'mean': 2.0028571428571431}
{'variance': 4.0114775868357446, 'mean': 1000000002.0028571}
आप ध्यान देंगे कि अभी भी कुछ राउंडिंग त्रुटि है, लेकिन यह खराब नहीं है, जबकि naive_stats
सिर्फ पुक।
संपादित करें: सिर्फ विकिपीडिया का हवाला देते हुए बेलिसरियस की टिप्पणी पर ध्यान दिया गया जिसमें नथ एल्गोरिथ्म का उल्लेख है।