อัลกอริทึม "ออนไลน์" (ตัววนซ้ำ) สำหรับการประมาณค่ามัธยฐานทางสถิติโหมดความเบ้ความเคอร์โทซิส?


86

มีอัลกอริทึมในการประมาณค่ามัธยฐานโหมดความเบ้และ / หรือ 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) อย่างมาก

การชี้ฉันไปที่ไลบรารีสถิติที่มีอยู่จะช่วยได้เช่นกันหากไลบรารีมีฟังก์ชันในการคำนวณการดำเนินการเหล่านี้อย่างน้อยหนึ่งรายการ "ออนไลน์"


ข้อมูลจะถูกส่งแบบเรียงลำดับและคุณจะทราบล่วงหน้าจำนวนอินพุตหรือไม่?
chillysapien

ลิงก์ที่มีประโยชน์บน StackOverflow: stackoverflow.com/questions/895929/…
dmckee --- อดีตผู้ดูแลลูกแมว

เป็นข้อมูลจำนวนเต็มหรือข้อมูลลอย? คุณมีค่าสูงสุดหรือต่ำสุด?
stephan

dmckee: จริงๆแล้วฉันใช้วิธีของเวลฟอร์ดสำหรับค่าเบี่ยงเบนมาตรฐาน แต่ฉันไม่เห็นอะไรเลยในลิงค์นั้นเกี่ยวกับโหมดค่ามัธยฐานเคอร์โทซิสหรือความเบ้ ... ฉันขาดอะไรไปหรือเปล่า?
Ryan B. Lynch

stephan: ชุดข้อมูลบางชุดเป็นจำนวนเต็มส่วนข้อมูลอื่น ๆ เป็นจำนวนเต็ม การกระจายตัวของประชากรค่อนข้างใกล้เคียงกับค่าปกติ (Gaussian) ดังนั้นเราจึงสามารถกำหนดช่วงความเชื่อมั่นได้ แต่ไม่มีขอบเขตระยะแข็ง (ยกเว้น x> 0 ในบางกรณี)
Ryan B.Lynch

คำตอบ:


53

ความเบ้และ Kurtosis

สำหรับอัลกอริทึมออนไลน์สำหรับ Skewness และ Kurtosis (ตามแนวของความแปรปรวน) โปรดดูในหน้าวิกิเดียวกันที่นี่อัลกอริทึมคู่ขนานสำหรับสถิติช่วงเวลาที่สูงขึ้น

ค่ามัธยฐาน

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

ค่ามัธยฐานและโหมดพร้อมการนับความถี่

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

โดยปกติจะกระจายตัวแปรสุ่ม

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

ความคิดเห็นเพิ่มเติม

อัลกอริทึมทั้งหมดข้างต้นสามารถทำงานควบคู่กันได้ (รวมถึงอัลกอริธึมการเรียงลำดับและการเลือกจำนวนมากเช่น QuickSort และ QuickSelect) หากช่วยได้

ฉันมักจะสันนิษฐาน (ยกเว้นส่วนของการแจกแจงปกติ) ว่าเราพูดถึงช่วงเวลาตัวอย่างค่ามัธยฐานและโหมดไม่ใช่ตัวประมาณสำหรับช่วงเวลาทางทฤษฎีที่ให้การแจกแจงที่ทราบ

โดยทั่วไปการสุ่มตัวอย่างข้อมูล (เช่นดูเฉพาะชุดย่อย) ควรจะประสบความสำเร็จพอสมควรตามจำนวนข้อมูลตราบใดที่การสังเกตทั้งหมดเป็นจริงจากตัวแปรสุ่มเดียวกัน (มีการแจกแจงเหมือนกัน) และช่วงเวลาโหมดและ ค่ามัธยฐานมีอยู่จริงสำหรับการแจกแจงนี้ ข้อแม้สุดท้ายคือไม่อันตราย ตัวอย่างเช่นค่าเฉลี่ย (และช่วงเวลาที่สูงกว่าทั้งหมด) สำหรับการกระจาย Cauchyไม่มีอยู่ ในกรณีนี้ค่าเฉลี่ยตัวอย่างของชุดย่อย "เล็ก" อาจคลาดเคลื่อนอย่างมากจากค่าเฉลี่ยตัวอย่างของทั้งตัวอย่าง


57

ฉันใช้ค่าเฉลี่ยที่เพิ่มขึ้น / เรียกซ้ำและตัวประมาณค่ามัธยฐานซึ่งทั้งสองใช้การจัดเก็บคงที่:

mean += eta * (sample - mean)
median += eta * sgn(sample - median)

โดยที่etaเป็นพารามิเตอร์อัตราการเรียนรู้ขนาดเล็ก (เช่น 0.001) และsgn () คือฟังก์ชัน signum ที่ส่งกลับค่าหนึ่งใน {-1, 0, 1} (ใช้etaคงที่หากข้อมูลไม่อยู่นิ่งและคุณต้องการติดตามการเปลี่ยนแปลงเมื่อเวลาผ่านไปมิฉะนั้นสำหรับแหล่งข้อมูลที่อยู่นิ่งคุณสามารถใช้บางอย่างเช่นeta = 1 / n สำหรับตัวประมาณค่าเฉลี่ยโดยที่ n คือจำนวนตัวอย่างที่เห็น ไกล ... น่าเสียดายที่สิ่งนี้ไม่ได้ผลสำหรับตัวประมาณค่ามัธยฐาน)

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

ฉันชอบที่จะเห็นตัวประมาณค่าโหมดเพิ่มขึ้นของรูปแบบที่คล้ายกัน ...

อัปเดต

ฉันเพิ่งแก้ไขตัวประมาณค่ามัธยฐานที่เพิ่มขึ้นเพื่อประมาณควอนไทล์โดยพลการ โดยทั่วไปฟังก์ชันควอนไทล์ ( http://en.wikipedia.org/wiki/Quantile_function ) จะบอกคุณถึงค่าที่แบ่งข้อมูลออกเป็นสองเศษส่วน: p และ 1-p ข้อมูลต่อไปนี้จะประมาณค่านี้ทีละน้อย:

quantile += eta * (sgn(sample - quantile) + 2.0 * p - 1.0)

ค่า p ควรอยู่ภายใน [0,1] โดยพื้นฐานแล้วจะเลื่อนเอาต์พุตสมมาตรของฟังก์ชันsgn () {-1,0,1} ให้เอนเอียงไปทางด้านใดด้านหนึ่งโดยแบ่งตัวอย่างข้อมูลเป็นสองถังขยะที่มีขนาดไม่เท่ากัน (เศษส่วน p และ 1-p ของข้อมูลน้อยกว่า / มากกว่า การประมาณเชิงปริมาณตามลำดับ) โปรดทราบว่าสำหรับ p = 0.5 ค่านี้จะลดลงเป็นตัวประมาณค่ามัธยฐาน


3
ตัวประมาณค่ามัธยฐานนี้ดีมาก คุณรู้หรือไม่ว่ามีตัวประมาณที่คล้ายกันสำหรับควอนไทล์ 0.25 / 0.75?
Gacek

1
@Gacek ให้แน่ใจว่า: แบ่งสตรีมอินพุตเป็น Lohalf <median และ Hihalf> median และใช้ค่ามัธยฐานที่ทำงานในแต่ละครึ่ง
เดนิส

2
@Gacek: ฉันเพิ่งอัปเดตคำตอบของฉันด้วยวิธีการเพิ่มขึ้นเพื่อประมาณควอนไทล์ใด ๆ ซึ่งคุณสามารถตั้งค่า p เป็น 0.25, 0.75 หรือค่าใดก็ได้ภายใน [0,1]
Tyler Streeter

10
วิธีนี้ใช้งานได้ดีสำหรับค่าเฉลี่ย แต่ฉันไม่เห็นว่ามันสร้างอะไรที่ใกล้ค่ามัธยฐานจากระยะไกลได้อย่างไร ใช้ลำดับของการประทับเวลามิลลิวินาทีเช่น[1328083200000, 981014400000, -628444800000, 318240000000, 949392000000]ซึ่งมีค่ามัธยฐานเป็น318240000000. สมการนี้กะเฉลี่ยก่อน +/- ซึ่งค่าที่แนะนำถูกeta 0.001นั่นจะไม่ทำอะไรกับตัวเลขจำนวนมากเช่นนี้และมันอาจจะใหญ่เกินไปสำหรับตัวเลขที่น้อยจริงๆ คุณจะเลือกetaคำตอบที่ถูกต้องได้อย่างไรโดยไม่ทราบคำตอบเบื้องต้น?
mckamey

9
ลองนึกภาพว่าตัวเลขมีหน่วยเช่นมิลลิเมตร จากนั้นก็ชัดเจนว่า eta (สำหรับค่าประมาณของค่ามัธยฐาน) จะต้องมีหน่วยเดียวกันกับการวัดดังนั้นค่าทั่วไปเช่น 0.001 ก็ไม่สมเหตุสมผล วิธีการที่ดูเหมือนจะดีกว่าคือการตั้งค่าการทางพิเศษแห่งประเทศไทยจากการประเมินการทำงานของส่วนเบี่ยงเบนแน่นอนเพราะแต่ละค่าใหม่ปรับปรุงsample cumadev += abs(sample-median)จากนั้นตั้งค่าeta = 1.5*cumadev/(k*k)ซึ่งkเป็นจำนวนตัวอย่างที่เห็นเพื่อให้ห่างไกล
tholy

12

ผมดำเนินการP-จัตุรัสอัลกอริทึมสำหรับการคำนวณแบบไดนามิกและควอนไท Histograms โดยไม่ต้องจัดเก็บข้อสังเกตในโมดูลหลามเรียบร้อยผมเขียนเรียกว่าLiveStats ควรแก้ปัญหาของคุณได้อย่างมีประสิทธิภาพ ไลบรารีรองรับทุกสถิติที่คุณกล่าวถึงยกเว้นโหมด ฉันยังไม่พบวิธีที่น่าพอใจสำหรับการประมาณค่าโหมด


FYI: ขั้นตอนวิธี P-ตารางอยู่ใน c ++ <boost/accumulators/statistics/weighted_p_square_cumul_dist.hpp>เพิ่ม:
Neil G

7

ไรอันฉันเกรงว่าคุณจะไม่ทำค่าเฉลี่ยและความแปรปรวนทางขวา ... นี้ขึ้นมาไม่กี่สัปดาห์ที่ผ่านมาที่นี่ และเป็นหนึ่งในจุดแข็งของรุ่นออนไลน์ (ซึ่งอันที่จริงเป็นไปตามชื่อของวิธี Welford ฯ ) คือความจริงที่ว่ามันเป็นพิเศษที่ถูกต้องและมีเสถียรภาพดูการอภิปรายที่นี่ จุดแข็งอย่างหนึ่งคือคุณไม่จำเป็นต้องเก็บผลรวมหรือผลรวมของกำลังสอง ...

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


re: skewness and kurtosisใช่ ดูบทความนี้: johndcook.com/blog/skewness_kurtosis
Jesse Chisholm

3

บทความ Wikipedia ที่อ้างถึงในคำถามมีสูตรคำนวณความเบ้และเคอร์โทซิสออนไลน์

สำหรับโหมด - ฉันเชื่อว่า - ไม่มีทางทำแบบออนไลน์ได้ ทำไม? สมมติว่าค่าทั้งหมดของอินพุตของคุณแตกต่างกันนอกเหนือจากค่าสุดท้ายที่ซ้ำกับค่าก่อนหน้า ในกรณีนี้คุณต้องจำค่าทั้งหมดที่เห็นในอินพุตเพื่อตรวจสอบว่าค่าสุดท้ายซ้ำกับค่าที่เห็นก่อนหน้านี้และทำให้เป็นค่าที่พบบ่อยที่สุด

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

(โปรดทราบว่าฉันกำลังอ้างถึงการคำนวณที่แน่นอนเท่านั้น)


2

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

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

ตัวอย่างการประมาณเชิงปริมาณ: http://www.computer.org/portal/web/csdl/doi/10.1109/WSC.2006.323014

ตัวอย่างการประมาณค่าโหมด: Bickel DR. ตัวประมาณค่าที่แข็งแกร่งของโหมดและความเบ้ของข้อมูลต่อเนื่อง สถิติการคำนวณและการวิเคราะห์ข้อมูล 2545; 39: 153–163 ดอย: 10.1016 / S0167-9473 (01) 00057-3.

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

คำถามสุดท้ายคือคุณต้องการความเบ้และเคอร์โทซิสด้วยตัวเองจริง ๆ หรือไม่หรือมีแนวโน้มว่าพารามิเตอร์อื่น ๆ ซึ่งอาจมีความน่าเชื่อถือมากกว่าในการระบุลักษณะการแจกแจงความน่าจะเป็น (สมมติว่าคุณมีการแจกแจงความน่าจะเป็น!) คุณคาดหวังว่าจะเป็น Gaussian หรือไม่?

คุณมีวิธีทำความสะอาด / ประมวลผลข้อมูลล่วงหน้าเพื่อให้ส่วนใหญ่เป็น Gaussianish หรือไม่? (ตัวอย่างเช่นจำนวนธุรกรรมทางการเงินมักจะค่อนข้างเสียนหลังจากใช้ลอการิทึม) คุณคาดหวังค่าเบี่ยงเบนมาตรฐานที่แน่นอนหรือไม่? คุณคาดหวังว่าหางจะอ้วนหรือไม่? ปริมาณที่คุณสนใจเป็นส่วนท้ายหรือจำนวนมาก?


2

ทุกคนบอกว่าคุณไม่สามารถใช้โหมดนี้ในลักษณะออนไลน์ได้ แต่นั่นไม่เป็นความจริง นี่คือบทความที่อธิบายถึงอัลกอริทึมในการทำโจทย์ปัญหานี้ซึ่งคิดค้นขึ้นในปี 1982 โดย Michael E. Fischer และ Steven L. Salzberg จาก Yale University จากบทความ:

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

นอกจากนี้ยังสามารถขยายเพื่อค้นหา N บนสุดที่มีหน่วยความจำมากขึ้น แต่ควรแก้ปัญหาสำหรับโหมดนี้


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

ลิงก์เสียแล้วฉันดีใจที่มีคำอธิบายนี้ แต่ตามที่อธิบายไว้ตัวนับจะเพิ่มขึ้นก็ต่อเมื่อตัวเลือกที่ 2 ส่วนใหญ่อยู่ติดกับเหตุการณ์ที่ 1 IMPLIES ใดที่เรียงลำดับข้อมูล ซึ่งไม่รับประกันในกรณีข้อมูลออนไลน์ (สตรีมมิ่ง) ด้วยข้อมูลที่เรียงลำดับแบบสุ่มจึงไม่น่าจะพบโหมดใด ๆ
Jesse Chisholm

1

ในที่สุดถ้าคุณไม่มีความรู้พื้นฐานเกี่ยวกับการกระจายฉันคิดว่าคุณต้องเก็บค่าทั้งหมดไว้

ที่กล่าวว่าหากคุณไม่ได้รับมือกับสถานการณ์ทางพยาธิวิทยาบางอย่างผู้รักษา (Rousseuw และ Bassett 1990) อาจดีพอสำหรับวัตถุประสงค์ของคุณ

มันเกี่ยวข้องกับการคำนวณค่ามัธยฐานของกลุ่มค่ามัธยฐาน


0

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

หากข้อมูลมีการกระจายตามปกติในระยะยาวคุณก็สามารถใช้ค่าเฉลี่ยเพื่อประมาณค่ามัธยฐานได้

คุณยังสามารถประมาณค่ามัธยฐานโดยใช้เทคนิคต่อไปนี้: สร้างการประมาณค่ามัธยฐาน M [i] สำหรับทุกๆ 1,000,000 รายการในสตรีมข้อมูลเพื่อให้ M [0] เป็นค่ามัธยฐานของรายการหนึ่งล้านรายการแรก M [1] ค่ามัธยฐานของหนึ่งล้านรายการที่สองเป็นต้นจากนั้นใช้ค่ามัธยฐานของ M [0] ... M [k] เป็นตัวประมาณค่ามัธยฐาน แน่นอนว่าวิธีนี้ช่วยประหยัดพื้นที่และคุณสามารถควบคุมปริมาณที่คุณต้องการใช้พื้นที่ได้โดย "ปรับแต่ง" พารามิเตอร์ 1,000,000 สิ่งนี้สามารถเรียกซ้ำได้ทั่วไป


0

ตกลงเพื่อนลองสิ่งเหล่านี้:

สำหรับ c ++:

double skew(double* v, unsigned long n){
    double sigma = pow(svar(v, n), 0.5);
    double mu = avg(v, n);

    double* t;
    t = new double[n];

    for(unsigned long i = 0; i < n; ++i){
        t[i] = pow((v[i] - mu)/sigma, 3);
    }

    double ret = avg(t, n);

    delete [] t;
    return ret;
}

double kurt(double* v, double n){
    double sigma = pow(svar(v, n), 0.5);
    double mu = avg(v, n);

    double* t;
    t = new double[n];

    for(unsigned long i = 0; i < n; ++i){
        t[i] = pow( ((v[i] - mu[i]) / sigma) , 4) - 3;
    }

    double ret = avg(t, n);

    delete [] t;
    return ret;
}

โดยที่คุณบอกว่าคุณสามารถคำนวณค่าความแปรปรวนตัวอย่าง (svar) และค่าเฉลี่ย (เฉลี่ย) ได้แล้วคุณจะชี้ไปที่ฟังก์ชันของคุณเพื่อทำสิ่งนั้น

นอกจากนี้ลองดูสิ่งที่ประมาณของ Pearson ในชุดข้อมูลขนาดใหญ่มันจะค่อนข้างคล้ายกัน 3 (ค่าเฉลี่ย - ค่ามัธยฐาน) / ส่วนเบี่ยงเบนมาตรฐานคุณมีค่ามัธยฐานเป็นสูงสุด - นาที / 2

สำหรับโหมดลอยไม่มีความหมาย โดยทั่วไปจะติดไว้ในถังขยะขนาดเล็ก (เช่น 1/100 * (สูงสุด - นาที))



-1

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

ปัญหาหนึ่งอาจเป็นการสูญเสียความละเอียดในทศนิยมหลังจากการดำเนินการหลายพันล้านครั้งกล่าวคือการเพิ่มหนึ่งไม่ทำให้มูลค่าเปลี่ยนแปลงอีกต่อไป! หากต้องการหลีกเลี่ยงสิ่งนี้หากขนาดที่เก็บข้อมูลสูงสุดเกินขีด จำกัด คุณสามารถนำจำนวนมากออกจากการนับทั้งหมดได้


-1
for j in range (1,M):
    y=np.zeros(M) # build the vector y
    y[0]=y0

    #generate the white noise
    eps=npr.randn(M-1)*np.sqrt(var)

    #increment the y vector
    for k in range(1,T):
        y[k]=corr*y[k-1]+eps[k-1]

    yy[j]=y

list.append(y)

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