การประมาณขนาดของการตัดกันของหลาย ๆ ชุดโดยใช้ตัวอย่างหนึ่งชุด


10

ฉันกำลังทำงานกับอัลกอริทึมที่ต้องการคำนวณขนาดของชุดที่สร้างโดยจุดตัดของชุดอย่างน้อย 2 ชุด โดยเฉพาะอย่างยิ่ง:

z=|A0An|

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

z=|(A0A1)(A0An)|

แม้แต่กลยุทธ์นี้ก็ทำให้ฉันมีข้อความค้นหาที่น่าสนใจจำนวนมากที่จะเรียกใช้ตั้งแต่บางครั้งอาจมีขนาดใหญ่ ความคิดของฉันสำหรับการรับมือกับที่มีการสุ่มตัวอย่างของและตัดกับส่วนที่เหลือของชุดก่อนที่จะกลับไปคะเนการประมาณการที่เหมาะสมของZคำถามของฉันคือ: วิธีที่ดีที่สุดในการสุ่มตัวอย่างแล้วคาดการณ์ว่าจะกลับไปสู่ค่าของนั่นคือถ้าไม่ถูกต้องทั้งหมดมีช่วงข้อผิดพลาดที่คาดเดาได้?|A0|A0zz


นี่คือสิ่งที่ฉันได้ลองมาแล้ว (ใน pseudocode เรียงลำดับ):

sample_threshold := 10000
factor := 1
if (len(A0) > sample_treshold) {
    factor = sample_threshold / len(A0)
}

// Take a random sample of size 10000 from A0

// Intersect all the other sets with the A0 sample, then with each other
working_set := A0
for i, a := range A {
    a = intersect(A0, a)
    working_set = intersect(working_set, a)
}

z := len(working_set) * (1 / factor)

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

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


ต่อความคิดเห็นของ Billฉันใช้การทดลองอย่างรวดเร็วเพื่อแสดงขนาดตัวอย่างและข้อผิดพลาด ที่เก็บตัวอย่างแต่ละขนาดทำงาน 20 ครั้งและอย่างที่คุณเห็นมีแนวโน้มที่ชัดเจน:

พล็อต


ฉันคิดว่าการสุ่มตัวอย่างแบบง่ายโดยไม่มีการเปลี่ยนควรจะทำได้ ฉันงุนงงว่าคุณได้รับการประเมินค่าสูงเกินไป ดูเหมือนว่าจะจับคู่การประมาณค่าเฉลี่ยประชากรโดยใช้ค่าเฉลี่ยตัวอย่างจากตัวอย่างแบบสุ่ม คุณกำลังพยายามที่จะประเมินความน่าจะเป็นประชากรที่องค์ประกอบของอยู่ในจุดตัดของอื่น ๆs ฉันทำตัวเป็นแบบอย่างง่ายๆและทำงานได้ดี คุณแน่ใจหรือไม่ว่าคุณประเมินค่าสูงไปอย่างสม่ำเสมอ มันเกิดขึ้นเช่น 15 ครั้งจาก 20 หรือ 150 ครั้งจาก 200? ตัวอย่างสุ่มอย่างนั้นจริงหรือ A0A
Bill

1
@Bill ฉันได้เพิ่มพล็อตของขนาดตัวอย่างกับข้อผิดพลาดที่แสดงสิ่งที่ฉันเห็น มันเหมือน 20 ครั้งจาก 20 สำหรับตัวอย่างแบบสุ่มมันสุ่มเหมือนORDER BY RAND()ซึ่งไม่สมบูรณ์ แต่ควรเหมาะสำหรับงานนี้
Jimmy Sawczuk

@JimmySawczuk จะดีกว่าไหมถ้าตัดชุด "working set" กับ "a" โดยตรงแทนที่จะเป็น "intersect (A0, a)" เนื่องจาก "A0" น่าจะมากกว่า "ชุดการทำงาน" ปัจจุบันในอัลกอริทึมหลังจากการเรียกใช้ครั้งแรก ... ฉันเข้าใจสิ่งนี้ถูกต้องหรือไม่

คุณยืนยันได้หรือไม่ว่าคุณหมายถึงชุดและไม่ใช่ชุดหลายชุด (เช่นไม่มีชุดซ้ำกันในชุด) เพราะถ้ามีมันเป็นเรื่องง่ายที่จะประเมินขนาดของ "การตัดกัน" ตามวิธีการของคุณ (ลองพิจารณากรณีที่เป็นองค์ประกอบเดียวกันเพียง 100 ชุดและคุณเก็บตัวอย่างครึ่งหนึ่งไปแล้ว)A0
Innuo

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

คำตอบ:


3

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


0

ในฐานะที่เป็นจุด Innuo ออกปัญหาของฉันเป็นเพราะที่ซ้ำกันในชุดตัวอย่างของฉันซึ่งก่อให้เกิดใน pseudocode ของฉันจะไปต่ำซึ่งจะทำให้เกิดการคาดการณ์สุดท้ายของการที่จะสูงเกินไปเพราะมันถูกสร้างขึ้นผ่านทางผกผันของ การลบรายการที่ซ้ำกันแก้ไขปัญหานี้และตอนนี้อัลกอรึทึมสร้างพล็อตเดลต้ากับขนาดพล็อตตัวอย่างตามแนวของสิ่งที่ฉันคาดหวัง (เส้นแสดงระยะขอบของข้อผิดพลาดที่ระดับความเชื่อมั่น 95% สำหรับขนาดตัวอย่าง ):A0factorzfactor

พล็อต

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