ตัวกรองอนุภาค: จะทำการ resampling ได้อย่างไร?


24

ฉันเข้าใจหลักการพื้นฐานของตัวกรองอนุภาคและพยายามนำไปใช้ อย่างไรก็ตามฉันได้วางสายในส่วนที่สุ่มใหม่

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

แนวคิดแรกของฉันเกี่ยวกับวิธีการใช้สิ่งนี้คือ:

  1. ทำให้น้ำหนักปกติ
  2. คูณแต่ละน้ำหนักด้วยจำนวนอนุภาคทั้งหมด
  3. ปัดเศษน้ำหนักที่ปรับแล้วไปเป็นจำนวนเต็มที่ใกล้เคียงที่สุด (เช่นint()ใน Python)

ตอนนี้ฉันควรรู้ความถี่ในการดึงแต่ละอนุภาคแต่เนื่องจากข้อผิดพลาดของการปัดเศษฉันจึงมีอนุภาคน้อยกว่าก่อนที่จะเริ่มขั้นตอนการสุ่มใหม่

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

คำตอบ:


19

ปัญหาที่คุณพบนั้นมักถูกอ้างถึงว่าเป็นกลุ่มตัวอย่างที่ยากจน เราสามารถดูว่าทำไมวิธีการของคุณได้รับความทุกข์ทรมานด้วยวิธีง่ายๆ สมมติว่าคุณมี 3 อนุภาคและน้ำหนักปกติของพวกเขาคือ 0.1, 0.1, 0.8 จากนั้นคูณแต่ละน้ำหนักด้วย 3 ให้ผลเป็น 0.3, 0.3 และ 2.4 จากนั้นการปัดเศษจะให้ค่า 0, 0, 2 ซึ่งหมายความว่าคุณจะไม่เลือกอนุภาคสองอันแรกและอันสุดท้ายจะถูกเลือกสองครั้ง ตอนนี้คุณลงไปที่สองอนุภาค ฉันสงสัยว่านี่คือสิ่งที่คุณเห็นเมื่อคุณพูดว่า "เนื่องจากข้อผิดพลาดของ roundoff ฉันจึงมีอนุภาคน้อยลง"

วิธีการเลือกทางเลือกจะเป็นดังนี้

  1. ทำให้น้ำหนักปกติ
  2. คำนวณอาร์เรย์ของผลรวมสะสมของน้ำหนัก
  3. สร้างตัวเลขแบบสุ่มและกำหนดช่วงใดในอาเรย์น้ำหนักแบบสะสมที่เป็นของจำนวนนั้น
  4. ดัชนีของช่วงนั้นจะตรงกับอนุภาคที่ควรสร้างขึ้น
  5. ทำซ้ำจนกว่าคุณจะมีจำนวนตัวอย่างที่ต้องการ

ดังนั้นโดยใช้ตัวอย่างข้างต้นเราจะเริ่มต้นด้วยน้ำหนักปกติ จากนั้นเราจะคำนวณอาร์เรย์ [0.1, 0.2, 1] จากนั้นเราคำนวณตัวเลขสุ่ม 3 ตัวบอกว่า 0.15, 0.38 และ 0.54 นี่จะทำให้เราเลือกอนุภาคที่สองหนึ่งครั้งและอนุภาคที่สองสองครั้ง ประเด็นคือมันให้โอกาสอนุภาคเล็ก ๆ ในการเผยแพร่

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


1
ขอบคุณสำหรับการตอบสนองที่ชาญฉลาด! วิธีการเลือกที่คุณแนะนำดูเหมือนจะคุ้นเคย หากฉันจำได้อย่างถูกต้องนั่นเป็นวิธีการทั่วไปในการรักษาปัญหาการขาดแคลนตัวอย่าง ฉันเคยเห็นมาก่อน แต่ไม่เคยเข้าใจเหตุผลของขั้นตอนนี้จริงๆ ตอนนี้ฉันรู้ดีกว่า!
Daniel Eberts

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

9

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

มีหลายวิธีในการทำการสุ่มใหม่อย่างเหมาะสม มีกระดาษที่ดีที่เรียกว่าบนวิธีการสุ่มตัวอย่างใหม่สำหรับตัวกรองอนุภาคเปรียบเทียบวิธีการที่แตกต่างกัน เพียงเพื่อให้ภาพรวมอย่างรวดเร็ว:

  • Multinomial resampling: ลองจินตนาการถึงแถบกระดาษที่แต่ละอนุภาคมีส่วนซึ่งความยาวนั้นแปรผันตามน้ำหนักของมัน สุ่มเลือกสถานที่บนแถบ N ครั้งและเลือกอนุภาคที่เกี่ยวข้องกับส่วน

  • Resampling ที่เหลืออีกครั้ง: วิธีนี้จะพยายามลดความแปรปรวนของการสุ่มตัวอย่างโดยการจัดสรรแต่ละอนุภาคของชั้นจำนวนเต็มของค่าที่คาดไว้และปล่อยให้ส่วนที่เหลือเป็น resampling multinomial เช่นอนุภาคที่มีค่าคาดหวัง 2.5 จะมี 2 สำเนาในชุด resampled และอีกอันหนึ่งที่มีค่าคาดหวัง 0.5

  • การ Resampling อย่างเป็นระบบ: ใช้ไม้บรรทัดที่มีเครื่องหมายเว้นระยะปกติเช่นนั้นเครื่องหมาย N จะมีความยาวเท่ากับแถบกระดาษของคุณ วางไม้บรรทัดถัดจากแถบของคุณ นำอนุภาคที่มีเครื่องหมาย

  • แบ่งระดับการ resampling: เหมือนกับ resampling อย่างเป็นระบบยกเว้นว่าเครื่องหมายบนไม้บรรทัดไม่ได้ถูกวางอย่างเท่าเทียมกัน แต่ถูกเพิ่มเป็นการสุ่มตัวอย่างกระบวนการ N แบบสุ่มจากช่วงเวลา 0..1 / N

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


+1 เมื่อตอบคำถามติดตามของฉันแล้ว :)
Daniel Eberts

5

สำหรับตัวอย่างของรหัสไพ ธ อนที่ดำเนินการ resampling อย่างเหมาะสมคุณอาจพบว่าโครงการ github นี้มีประโยชน์: https://github.com/mjl/particle_filter_demo

นอกจากนี้ยังมาพร้อมกับการแสดงภาพซ้ำของมันเองซึ่งจะช่วยให้คุณดีบักการใช้งานของคุณเอง การทำงานของตัวกรองอนุภาค

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


ขอบคุณสำหรับลิงค์ เป็นเรื่องที่ลึกซึ้งเสมอที่จะเห็นว่าคนอื่นใช้อัลกอริทึม
Daniel Eberts

นี่คือการมองเห็นของการรวมตัวกรองอนุภาค ไม่แน่ใจว่าข้อมูลเชิงลึกนั้นเกี่ยวกับคำถามนั้นหรือไม่
จาคอบ

ฉันรวมการสร้างภาพข้อมูลเนื่องจากเป็นสิ่งที่สร้างขึ้นโดยรหัสที่ฉันโพสต์ - ตัวอย่างของวิธีการปรับใช้การสุ่มใหม่อย่างเหมาะสม
เอียน

1

วิธีง่ายๆในการทำเช่นนี้คือ numpy.random.choice (N, N, p = w, แทนที่ = True) โดยที่ N คือหมายเลข ของอนุภาคและ w = น้ำหนักปกติ


ยินดีต้อนรับสู่Robotics , Narayan คุณช่วยขยายคำตอบนี้หน่อยได้ไหม? ตัวอย่างเช่นเหตุใดจึงใช้ตัวเลือกแบบสุ่ม คืออะไรpในการทำงานของคุณหรือไม่ ยิ่งคุณได้รับคำตอบมากเท่าไหร่ก็ยิ่งมีประโยชน์มากขึ้นสำหรับผู้เยี่ยมชมที่มีปัญหาเดียวกันเท่านั้น
Chuck

1

ฉันใช้วิธีการของ @ narayan เพื่อใช้ตัวกรองอนุภาคของฉัน:

new_sample = numpy.random.choice(a=particles, size=number_of_particles, replace=True, p=importance_weights)

a คือเวกเตอร์ของอนุภาคของคุณเพื่อสุ่มตัวอย่างขนาดคือจำนวนอนุภาคและ p คือเวกเตอร์ของน้ำหนักปกติของพวกเขา replace = True จัดการการสุ่มตัวอย่าง bootstrap พร้อมการแทนที่ ค่าส่งคืนเป็นเวกเตอร์ของวัตถุอนุภาคใหม่

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