टिप्पणियों के भंडारण के बिना चतुर्थक का ऑनलाइन अनुमान


13

मुझे टिप्पणियों के भंडारण के बिना डेटा के एक बड़े सेट पर वास्तविक समय में क्वार्टर्टाइल (Q1, मध्य और Q3) की गणना करने की आवश्यकता है। मैंने पहली बार P वर्ग एल्गोरिथ्म (जैन / क्लैमटैक) की कोशिश की, लेकिन मैं इससे संतुष्ट नहीं था (थोड़ा बहुत सीपीयू उपयोग और कम से कम अपने डाटासेट पर आश्वस्त नहीं)।

मैं अब फेम एल्गोरिथ्म ( फेल्डमैन / शैविट ) का उपयोग मक्खी पर मंझले का अनुमान लगाने के लिए करता हूं और एल्गोरिथ्म को भी Q1 और Q3 की गणना करने के लिए व्युत्पन्न करने का प्रयास करता हूं :

M = Q1 = Q3 = first data value 
step =step_Q1 = step_Q3 = a small value
for each new data :
        # update median M 
        if M > data:
            M = M - step
        elif M < data:
            M = M + step
        if abs(data-M) < step:
            step = step /2

        # estimate Q1 using M
        if data < M:
            if Q1 > data:
                Q1 = Q1 - step_Q1
            elif Q1 < data:
                Q1 = Q1 + step_Q1
            if abs(data - Q1) < step_Q1:
                step_Q1 = step_Q1/2
        # estimate Q3 using M
        elif data > M:
            if Q3 > data:
                Q3 = Q3 - step_Q3
            elif Q3 < data:
                Q3 = Q3 + step_Q3
            if abs(data-Q3) < step_Q3:
                step_Q3 = step_Q3 /2

फिर से शुरू करने के लिए, यह केवल दो में सेट डेटा को विभाजित करने के लिए मक्खी पर प्राप्त माध्य एम का उपयोग करता है और फिर Q1 और Q3 दोनों के लिए समान एल्गोरिथ्म का पुन: उपयोग करता है।

यह किसी भी तरह काम करता है, लेकिन मैं प्रदर्शित नहीं कर पा रहा हूं (मैं गणितज्ञ नहीं हूं)। क्या यह त्रुटिपूर्ण है? मैं किसी भी सुझाव या समस्या को फिट करने वाली अन्य तकनीक की सराहना करूंगा।

मदद के लिए आपका बहुत बहुत धन्यवाद !

==== EDIT =====

उन लोगों के लिए जो इस तरह के सवालों में रुचि रखते हैं, कुछ हफ्तों के बाद, मैं अंत में केवल 100 मूल्यों की एक revervoir के साथ जलाशय नमूनाकरण का उपयोग करके समाप्त हो गया और इसने मुझे बहुत ही परिणाम दिया।


क्या आप इस बात के प्रमाण की तलाश कर रहे हैं कि Q1 और Q2 वास्तविक मात्राओं में परिवर्तित होते हैं क्योंकि आपके द्वारा लिंक की गई स्लाइड्स में मार्कोव श्रृंखला विश्लेषण के समान उदाहरणों की संख्या बढ़ जाती है? कार्यान्वयन के संदर्भ में, उपरोक्त एल्गोरिथ्म त्रुटिपूर्ण नहीं लगता है (मैंने आर में मानक सामान्य के लिए अनुमानित मात्रा का परीक्षण किया और एल्गोरिथ्म ठीक काम करता है)।
अजा

1
@ आपको धन्यवाद, मैं एक प्रमाण (बहुत काम) की तलाश नहीं कर रहा हूं, लेकिन केवल सलाह और टिप्पणियां, मुझे जो मुख्य समस्या दिखाई दे रही है वह औसत दर्जे का अनुमान लगाने पर गणना करने के लिए है, जैसा कि व्हीबर ने बताया है।
लुई ह्यूजेस

जवाबों:


3

मध्य बिंदु वह बिंदु है जिस पर 1/2 अवलोकन नीचे और 1/2 ऊपर आते हैं। इसी तरह, 25 वीं पर्केंटाइल, मिंट और माध्यिका के बीच डेटा के लिए माध्यिका है, और 75 वीं परसेंटाइल, माध्यिका और अधिकतम के बीच का माध्यिका है, इसलिए हां, मुझे लगता है कि आप जो भी माध्यिक एल्गोरिथ्म आप पर पहले लागू कर रहे हैं वह ठोस आधार पर है। संपूर्ण डेटा इसे विभाजन के लिए सेट करता है, और फिर दो परिणामी टुकड़ों पर।

अपडेट :

स्टैकओवरफ़्लो पर यह प्रश्न इस पत्र की ओर जाता है: राज जैन, इमरिक क्लैमटैक: क्वांटम की गतिशील गणना के बिना Piles एल्गोरिथ्म और स्टोरिंग अवलोकन के बिना हिस्टोग्राम। Commun। ACM 28 (10): 1076-1085 (1985) जिसका सार यह बताता है कि यह शायद आपके लिए बहुत फायदेमंद है :

माध्यिका और अन्य मात्राओं के गतिशील गणना के लिए एक अनुमानी एल्गोरिथ्म प्रस्तावित है। अनुमान गतिशील रूप से उत्पन्न होते हैं क्योंकि अवलोकन उत्पन्न होते हैं। टिप्पणियों को संग्रहीत नहीं किया जाता है; इसलिए, एल्गोरिथ्म में टिप्पणियों की संख्या की परवाह किए बिना बहुत कम और निश्चित भंडारण की आवश्यकता होती है। यह एक मात्रात्मक चिप को लागू करने के लिए आदर्श बनाता है जिसका उपयोग औद्योगिक नियंत्रकों और रिकॉर्डर में किया जा सकता है। एल्गोरिथ्म को हिस्टोग्राम प्लॉटिंग के लिए आगे बढ़ाया गया है। एल्गोरिथ्म की सटीकता का विश्लेषण किया जाता है।


4
यह उत्तर दो सूक्ष्म बिंदुओं को अनदेखा करता है, एक महत्वहीन लेकिन दूसरा संभवतः बहुत महत्वपूर्ण। महत्वहीन यह है कि डबल-स्प्लिटिंग तकनीक ऊपरी और निचले टिका की गणना करती है जो नमूना आकार के आधार पर, माध्य से थोड़ा अलग हो सकता है। महत्वपूर्ण यह है कि मध्य -विभाजन का एक अनुमानित अनुमान के आधार पर डबल-विभाजन दिखाई देता है । इस अनुमान और वास्तविक माध्यिका के बीच कोई भी भिन्नता टिका होने का कारण बनेगी। सहज रूप से, यह एक समस्या नहीं होनी चाहिए क्योंकि डेटा की मात्रा बड़ी हो जाती है, लेकिन यह एक मुद्दा है जिसे कुछ विश्लेषण की आवश्यकता है।
whuber

सीधे तौर पर अनुमान नहीं लगाया जाएगा कि चौकड़ी समान मुद्दों के अधीन होगी? प्रत्यक्ष अनुमान डेटा बिंदुओं को अनुपात में विभाजित करेगा । यह तत्वों को में विभाजित करता है और फिर उन "2" में से एक लेता है और इसे विभाजित करता है । मैं कोई सैद्धांतिक नहीं हूँ, सच है, लेकिन, सामान्य रूप से, दोनों के बीच का अंतर अलग-अलग एक स्थान पर बाईं या दाईं ओर अलग नहीं होगा और रूप में बढ़ेगा? हां, एक पैथोलॉजिकल डिस्ट्रीब्यूशन बनाया जा सकता है, लेकिन यह सीधे-सीधे औसतन अनुमान से भी प्रभावित होगा। जाहिर है, सभी मूल्यों को संग्रहीत करना बेहतर है, निश्चित रूप से। n1:32:21:1n
अहरम

2
@ एवराम, पेपर को इंगित करने के लिए धन्यवाद, जैसा कि मैंने उल्लेख किया है कि मैंने पहले ही चेन और क्लैमटैक से पी-स्क्वायर एल्गोरिदम की कोशिश की थी। मेरे डेटा पर जो एल्गो मैंने तय किया है, वह बेहतर परिणाम (MSE) देता है और तेज होता है। तो मैं सवाल कर रहा था कि क्या यह फिर भी कुछ समस्या हो सकती है। जैसा कि व्हीबर ने इस तथ्य पर टिप्पणी की कि यह एक चल रहे अनुमान का उपयोग करता है एक संभावित समस्या है; लेकिन मुझे नहीं पता कि यह वास्तव में महत्वपूर्ण है या नहीं।
लुई हग्स

वूप्स, यह देखा और इसे भूल गया। मैं क्षमाप्रार्थी हूं।
अहरम

0

आपके द्वारा पोस्ट की गई विधि में बहुत मामूली परिवर्तन और आप सभी मात्राओं की गणना किए बिना, किसी भी मनमानी प्रतिशत को गणना कर सकते हैं। यहाँ पायथन कोड है:

class RunningPercentile:
    def __init__(self, percentile=0.5, step=0.1):
        self.step = step
        self.step_up = 1.0 - percentile
        self.step_down = percentile
        self.x = None

    def push(self, observation):
        if self.x is None:
            self.x = observation
            return

        if self.x > observation:
            self.x -= self.step * self.step_up
        elif self.x < observation:
            self.x += self.step * self.step_down
        if abs(observation - self.x) < self.step:
            self.step /= 2.0

और एक उदाहरण:

import numpy as np
import matplotlib.pyplot as plt

distribution = np.random.normal
running_percentile = RunningPercentile(0.841)
observations = []
for _ in range(1000000):
    observation = distribution()
    running_percentile.push(observation)
    observations.append(observation)

plt.figure(figsize=(10, 3))
plt.hist(observations, bins=100)
plt.axvline(running_percentile.x, c='k')
plt.show()

1 एसटीडी प्रतिशत के साथ सामान्य वितरण

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