มีอัลกอริทึมในการประมาณค่ามัธยฐานโหมดความเบ้และ / หรือ kurtosis ของชุดค่า แต่ไม่จำเป็นต้องจัดเก็บค่าทั้งหมดในหน่วยความจำในครั้งเดียว?
ฉันต้องการคำนวณสถิติพื้นฐาน:
- ค่าเฉลี่ย: ค่าเฉลี่ยเลขคณิต
- ความแปรปรวน: ค่าเฉลี่ยของการเบี่ยงเบนกำลังสองจากค่าเฉลี่ย
- ค่าเบี่ยงเบนมาตรฐาน: รากที่สองของความแปรปรวน
- มัธยฐาน: ค่าที่แยกตัวเลขครึ่งหนึ่งที่ใหญ่กว่าออกจากครึ่งที่เล็กกว่า
- โหมด: ค่าที่พบบ่อยที่สุดในชุด
- ความเบ้: tl; ดร
- เคอร์โทซิส: tl; ดร
สูตรพื้นฐานสำหรับการคำนวณสิ่งเหล่านี้คือเลขคณิตระดับประถมศึกษาและฉันก็รู้ดี มีไลบรารีสถิติมากมายที่ใช้งานได้เช่นกัน
ปัญหาของฉันคือค่าจำนวนมาก (หลายพันล้าน) ในชุดที่ฉันจัดการ: การทำงานใน Python ฉันไม่สามารถสร้างรายการหรือแฮชด้วยองค์ประกอบหลายพันล้านรายการได้ แม้ว่าฉันจะเขียนสิ่งนี้ใน C แต่อาร์เรย์พันล้านองค์ประกอบก็ไม่สามารถใช้งานได้จริง
ข้อมูลไม่ถูกจัดเรียง มันผลิตขึ้นแบบสุ่มทันทีโดยกระบวนการอื่น ๆ ขนาดของแต่ละชุดมีความผันแปรสูงและจะไม่ทราบขนาดล่วงหน้า
ฉันได้หาวิธีจัดการค่าเฉลี่ยและความแปรปรวนได้ค่อนข้างดีแล้วโดยจะวนซ้ำตามแต่ละค่าในเซตตามลำดับใด ๆ (จริงๆแล้วในกรณีของฉันฉันจะเรียงลำดับตามลำดับที่สร้างขึ้น) นี่คืออัลกอริทึมที่ฉันใช้http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm :
- เริ่มต้นตัวแปรสามตัว: count, sum และ sum_of_squares
- สำหรับแต่ละค่า:
- จำนวนที่เพิ่มขึ้น
- เพิ่มมูลค่าลงในผลรวม
- เพิ่มกำลังสองของค่าใน sum_of_squares
- หารผลรวมตามจำนวนจัดเก็บเป็นค่าเฉลี่ยตัวแปร
- หาร sum_of_squares ด้วย count จัดเก็บเป็นตัวแปร mean_of_squares
- ค่าเฉลี่ยกำลังสองจัดเก็บเป็น square_of_mean
- ลบ square_of_mean จาก mean_of_squares โดยจัดเก็บเป็นค่าความแปรปรวน
- ค่าเฉลี่ยผลลัพธ์และความแปรปรวน
อัลกอริทึม "ออนไลน์" นี้มีจุดอ่อน (เช่นปัญหาความแม่นยำเนื่องจาก sum_of_squares เติบโตอย่างรวดเร็วมากกว่าช่วงจำนวนเต็มหรือความแม่นยำแบบลอยตัว) แต่โดยพื้นฐานแล้วมันให้สิ่งที่ฉันต้องการโดยไม่ต้องเก็บทุกค่าในแต่ละชุด
แต่ฉันไม่รู้ว่ามีเทคนิคที่คล้ายกันในการประมาณค่าสถิติเพิ่มเติมหรือไม่ (ค่ามัธยฐานโหมดความเบ้ความเคอร์โทซิส) ฉันสามารถใช้ตัวประมาณค่าแบบเอนเอียงหรือแม้แต่วิธีการที่ลดทอนความแม่นยำในระดับหนึ่งตราบใดที่หน่วยความจำที่จำเป็นในการประมวลผลค่า N นั้นน้อยกว่า O (N) อย่างมาก
การชี้ฉันไปที่ไลบรารีสถิติที่มีอยู่จะช่วยได้เช่นกันหากไลบรารีมีฟังก์ชันในการคำนวณการดำเนินการเหล่านี้อย่างน้อยหนึ่งรายการ "ออนไลน์"