การประมาณควอไทล์แบบออนไลน์โดยไม่ต้องเก็บการสังเกต


13

ฉันจำเป็นต้องคำนวณควอไทล์ (Q1, มัธยฐานและ Q3) แบบเรียลไทม์กับชุดข้อมูลขนาดใหญ่โดยไม่ต้องจัดเก็บข้อสังเกต ฉันลองใช้อัลกอริธึม P square (Jain / Chlamtac) ครั้งแรก แต่ฉันไม่พอใจกับมัน (ใช้ซีพียูมากเกินไปและไม่เชื่อในความแม่นยำของชุดข้อมูลของฉันอย่างน้อย)

ตอนนี้ฉันใช้อัลกอริธึม FAME ( Feldman / Shavitt ) สำหรับการประมาณค่ามัธยฐานในขณะเดินทางและพยายามหาขั้นตอนวิธีในการคำนวณ 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

ในการดำเนินการต่อเพียงแค่ใช้ค่ามัธยฐาน M ที่ได้รับทันทีเพื่อแบ่งชุดข้อมูลในสองชุดจากนั้นนำอัลกอริทึมเดิมมาใช้ซ้ำสำหรับทั้งไตรมาสที่ 1 และไตรมาสที่ 3

สิ่งนี้ดูเหมือนจะใช้ได้ แต่ฉันไม่สามารถสาธิตได้ (ฉันไม่ใช่นักคณิตศาสตร์) มันมีข้อบกพร่องหรือไม่ ฉันขอขอบคุณข้อเสนอแนะหรือเทคนิคอื่น ๆ ในที่สุดเหมาะสมปัญหา

ขอบคุณมากสำหรับความช่วยเหลือของคุณ !

==== แก้ไข =====

สำหรับผู้ที่มีความสนใจในคำถามดังกล่าวหลังจากนั้นไม่กี่สัปดาห์ฉันก็สิ้นสุดลงเพียงแค่ใช้การสุ่มตัวอย่างอ่างเก็บน้ำที่มีค่า 100 revervoir และให้ผลลัพธ์ที่น่าพอใจมาก (สำหรับฉัน)


คุณกำลังมองหาข้อพิสูจน์ว่า Q1 และ Q2 มาบรรจบกับปริมาณจริงเมื่อจำนวนตัวอย่างเพิ่มขึ้นในลักษณะที่คล้ายคลึงกับการวิเคราะห์ลูกโซ่มาร์คอฟในสไลด์ที่คุณเชื่อมโยงหรือไม่? ในแง่ของการใช้งานอัลกอริธึมด้านบนดูเหมือนจะไม่มีข้อบกพร่อง (ฉันทดสอบการประมาณปริมาณสำหรับมาตรฐานปกติใน R และอัลกอริทึมทำงานได้ดี)
Theja

1
@Theja ขอบคุณฉันไม่ได้มองหาหลักฐาน (งานมากเกินไป) แต่เพียงคำแนะนำและความคิดเห็นปัญหาหลักที่ฉันเห็นคือการคำนวณฐานในการคำนวณค่ามัธยฐานตามที่ whuber ได้ชี้ไป
Louis Hugues

คำตอบ:


3

ค่ามัธยฐานคือจุดที่ 1/2 การสังเกตตกลงด้านล่างและ 1/2 ข้างบน ในทำนองเดียวกันเปอร์เซ็นทีไทล์ที่ 25 คือค่ามัธยฐานสำหรับข้อมูลระหว่างนาทีและมัธยฐานและเปอร์เซ็นไทล์ที่ 75 คือค่ามัธยฐานระหว่างค่ามัธยฐานกับค่าสูงสุดดังนั้นใช่ฉันคิดว่าคุณอยู่บนพื้นแข็งโดยใช้อัลกอริธึมมัธยฐานใด ๆ ข้อมูลทั้งหมดถูกตั้งค่าให้แบ่งพาร์ติชั่นจากนั้นเป็นผลลัพธ์สองส่วน

อัปเดต :

คำถามเกี่ยวกับ stackoverflow นำไปสู่บทความนี้: Raj Jain, Imrich Chlamtac: อัลกอริธึมP²สำหรับการคำนวณเชิงปริมาณของ Quantiiles และฮิสโตแกรมโดยไม่ต้องทำการสังเกต commun ACM 28 (10): 1076-1085 (1985)ซึ่งบทคัดย่อบ่งชี้ว่าอาจเป็นที่สนใจของคุณ:

อัลกอริทึมแบบฮิวริสติกถูกนำเสนอสำหรับการคำนวณแบบไดนามิก qf ค่ามัธยฐานและค่าอื่น ๆ การประมาณการถูกสร้างขึ้นแบบไดนามิกเมื่อมีการสังเกต ข้อสังเกตจะไม่ถูกเก็บไว้; ดังนั้นอัลกอริธึมจึงมีความต้องการพื้นที่เก็บข้อมูลที่น้อยมากและคงที่โดยไม่คำนึงถึงจำนวนการสังเกต สิ่งนี้ทำให้มันเหมาะสำหรับการนำไปใช้ในชิปควอไทล์ที่สามารถใช้ในตัวควบคุมอุตสาหกรรมและเครื่องบันทึก อัลกอริทึมถูกขยายเพิ่มเติมเพื่อพล็อตฮิสโตแกรม วิเคราะห์ความแม่นยำของอัลกอริทึม


4
การตอบกลับนี้สามารถมองเห็นจุดที่บอบบางสองจุดหนึ่งที่ไม่สำคัญ แต่อีกจุดหนึ่งอาจมีความสำคัญมาก สิ่งที่ไม่สำคัญคือเทคนิคการแยกสองครั้งจะคำนวณบานพับด้านบนและล่างซึ่งอาจแตกต่างจากค่ามัธยฐานเล็กน้อยขึ้นอยู่กับขนาดของกลุ่มตัวอย่าง สิ่งสำคัญอย่างหนึ่งคือการแยกแบบสองครั้งนั้นดูเหมือนว่าจะขึ้นอยู่กับการประเมินค่าเฉลี่ยของค่ามัธยฐาน การเปลี่ยนแปลงใด ๆ ระหว่างการประมาณนี้กับค่ามัธยฐานที่แท้จริงจะทำให้บานพับแตกต่างกันเช่นกัน โดยสัญชาตญาณสิ่งนี้ไม่ควรเป็นปัญหาเนื่องจากปริมาณข้อมูลเติบโตขึ้น แต่ก็เป็นปัญหาที่ต้องมีการวิเคราะห์
whuber

จะไม่ประมาณควอไทล์โดยตรงจะเป็นปัญหาที่คล้ายกัน? การประมาณโดยตรงจะแบ่งจุดข้อมูลให้เป็นอัตราส่วนพาร์ทิชันนี้องค์ประกอบเข้าไปและจากนั้นจะใช้เวลาหนึ่งในบรรดา "2" และแยกมัน 1 ฉันไม่ใช่นักทฤษฎีจริง แต่โดยทั่วไปแล้วความแตกต่างระหว่างทั้งสองจะไม่แตกต่างกันมากที่สุดโดยจุดเดียวไปทางซ้ายหรือขวาและจะรวมกันเป็นเพิ่มขึ้น? ใช่การกระจายทางพยาธิวิทยาสามารถสร้างขึ้นได้ แต่ก็อาจได้รับผลกระทบจากการประมาณค่ามัธยฐานโดยตรงเช่นกัน เห็นได้ชัดว่าการจัดเก็บค่าทั้งหมดนั้นดีกว่าแน่นอน 1 : 3 2 : 2 1 : 1 nn1:32:21:1n
Avraham

2
@Avraham ขอบคุณสำหรับการชี้กระดาษตามที่ฉันกล่าวถึงฉันลอง P-square algorithm จาก Chain และ Chlamtac แล้ว ในชุดข้อมูลของฉันอัลโกที่ฉัน decribed ให้ผลลัพธ์ที่ดีกว่า (MSE) และเร็วขึ้น ดังนั้นฉันจึงถูกถามว่ามันอาจมีปัญหาบ้างไหม ในขณะที่ whuber ตั้งข้อสังเกตความจริงที่ว่ามันใช้การประเมินการทำงานเป็นปัญหาที่อาจเกิดขึ้น; แต่ฉันไม่รู้ว่ามันสำคัญจริง ๆ หรือไม่
Louis Hugues

อ๊ะเห็นแล้วและลืมมัน ขอโทษด้วย.
Avraham

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 STD

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.