Фільтри для частинок: як зробити перекомпонування?


24

Я розумію основний принцип фільтра для частинок і намагався його реалізувати. Однак я повісився на частину перестановки.

Теоретично кажучи, це досить просто: зі старого (і зваженого) набору частинок намалюйте новий набір частинок із заміною. Роблячи це, віддайте перевагу тим частинкам, які мають велику вагу. Частинки з великою вагою частіше малюються, а частинки з низькою вагою - рідше. Можливо, лише один раз чи зовсім не. Після перекомпонування всі ваги отримують однакову вагу.

Моя перша ідея, як це здійснити, по суті була така:

  1. Нормалізуйте ваги
  2. Помножте кожну вагу на загальну кількість частинок
  3. Округніть ці масштабовані ваги до найближчого цілого числа (наприклад, int()в Python)

Тепер я повинен знати, як часто малювати кожну частинку, але через помилки округлення у мене є менше частинок, ніж до етапу перекомпонування.

Питання: Як я "заповнити" відсутні частинки, щоб дістатись до тієї ж кількості частинок, що і до етапу перекомпонування? Або, якщо я тут повністю відсутній, як зробити повторну вибірку правильно?

Відповіді:


19

Проблема, з якою ви стикаєтеся, часто називається збідненням зразків. Ми можемо зрозуміти, чому ваш підхід страждає від цього на досить простому прикладі. Скажімо, у вас є 3 частинки, а їх нормалізована вага становить 0,1, 0,1, 0,8. Потім, помноживши кожну вагу на 3, виходять 0,3, 0,3 та 2,4. Потім округлення дає 0, 0, 2. Це означає, що ви б не вибрали перші дві частинки, а останню вибрали б двічі. Тепер ви зведені до двох частинок. Я підозрюю, що це те, що ви бачили, коли ви говорили "через помилки округлення, у мене менше частинок".

Альтернативним методом відбору був би наступний.

  1. Нормалізуйте ваги.
  2. Обчисліть масив сукупної суми ваг.
  3. Випадково генеруйте число та визначте, до якого діапазону в масиві сукупної ваги, до якого належить число.
  4. Індекс цього діапазону відповідав би частинці, яку слід створити.
  5. Повторюйте, поки у вас не з’явиться потрібна кількість зразків.

Отже, використовуючи приклад вище, ми б почали з нормованої ваги. Потім ми обчислимо масив [0,1, 0,2, 1]. Звідси обчислюємо 3 випадкових числа, скажімо, 0,15, 0,38 і 0,54. Це дозволило б нам вибрати другу частинку один раз, а третю частину двічі. Справа в тому, що це дає шанс розмножуватися дрібнішим частинкам.

Варто зазначити, що, хоча цей метод матиме справу з зубожінням, він може призвести до неоптимальних рішень. Наприклад, може статися, що жодна з частинок дійсно не відповідає вашому заданому розташуванню (якщо припустити, що ви використовуєте це для локалізації). Ваги говорять лише про те, які частинки найкраще відповідають, а не якість сірника. Таким чином, коли ви берете додаткові показання та повторюєте процес, ви можете виявити, що всі ваші частинки групуються в одному місці, яке не є правильним. Зазвичай це відбувається тому, що для початку не було хороших частинок.


1
Дякуємо за проникливу відповідь! Запропонований вами спосіб вибору здається звичним. Якщо я правильно пам'ятаю, це був звичайний спосіб вирішення проблеми збіднення вибірки. Я бачив це раніше, але ніколи не розумів причини цієї процедури. Тепер я знаю краще!
Даніель Ебертс

2
Я думаю, що ваше тлумачення збіднення вибірки може бути трохи оманливим. Те, що плакат втрачає частинки, пояснюється непридатним методом переутворення. Збіднення частинок - це коли ваш задній розподіл вже недостатньо представлений частинками.
Якоб

9

Як я здогадуюсь, ви самі дізналися, запропонований вами метод перекомпонування є дефектом, оскільки він не повинен змінювати кількість частинок (якщо ви цього не хочете). Принцип полягає в тому, що вага представляє відносну ймовірність щодо інших частинок. На етапі перекомпонування витягуєте з набору частинок таким чином, що для кожної частинки нормалізована маса, менша за кількість частинок, являє собою кількість разів, в яку середня частинка витягується. В цьому ваша ідея правильна. Тільки використовуючи округлення замість вибірки, ви завжди усунете частинки, для яких очікуване значення менше половини.

Існує ряд способів правильно виконати переустановку. Є приємний документ під назвою « Алгоритми перекомпонування» для фільтрів частинок , який порівнює різні методи. Просто для швидкого огляду:

  • Мультиноміальне перекомпонування: уявіть смужку паперу, де кожна частинка має переріз, де довжина пропорційна її вазі. Випадково виберіть розташування на смужці N разів і виберіть частинку, пов’язану з секцією.

  • Залишкове перекомпонування: цей підхід намагається зменшити дисперсію вибірки, спочатку розподіливши кожну частинку їх цілим дном очікуваного значення, а решту залишивши для багаточленного перекомпонування. Наприклад, частинка з очікуваним значенням 2,5 матиме 2 екземпляри у наборі повторної вибірки та ще одну із очікуваним значенням 0,5.

  • Систематичне перекомпонування: візьміть лінійку з регулярними розміщеними позначками, щоб N позначок були такої ж довжини, як і ваша смужка паперу. Випадково розмістіть лінійку поруч із смужкою. Візьміть частинки на позначки.

  • Стратифіковане перекомпонування: те саме, що систематичне перекомпонування, за винятком того, що позначки на лінійці розміщуються не рівномірно, а додаються як N випадкових процесів вибірки з інтервалу 0..1 / N.

Отже, щоб відповісти на ваше запитання: те, що ви реалізували, може бути поширене на форму залишкової вибірки. Ви заповнюєте пропущені слоти шляхом вибірки на основі багатомісячного розподілу нагадувань.


+1 за те, що я вже відповів на моє наступне питання :)
Даніель Ебертс

5

Для прикладу коду python, який належним чином реалізує перекомпонування, вам може бути корисний цей проект github: https://github.com/mjl/particle_filter_demo

Плюс до цього, він має власне візуальне зображення процесу перекомпонування, що допоможе вам налагодити власну реалізацію. Робота фільтра для частинок

У цій візуалізації зелена черепаха показує фактичне положення, велика сіра крапка показує оцінене положення і стає зеленою, коли вона сходяться. Вага переходить від вірогідного (червоний) до малоймовірного (синій).


Дякуємо за посилання Завжди проникливо бачити, як інші люди реалізували алгоритм.
Даніель Ебертс

Це візуалізація фільтра для частинок, що сходяться. Не впевнений, яке розуміння він надає стосовно питання.
Якоб

Я включив візуалізацію, оскільки це те, що створюється кодом, який я розмістив - приклад того, як правильно реалізувати переустановку.
Ян

1

Один з простих способів зробити це - numpy.random.choice (N, N, p = w, замінити = True), де N - немає. частинок і w = нормалізовані ваги.


Ласкаво просимо в робототехніку , нараян. Чи можете ви трохи розширити цю відповідь? Наприклад, навіщо використовувати випадковий вибір? Що pу вашій функції? Чим детальніше ви зможете зробити свою відповідь, тим кориснішою буде вона для майбутніх відвідувачів, які мають таку ж проблему.
Чак

1

Я використовую підхід @ narayan, щоб реалізувати мій фільтр для частинок:

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

a - вектор ваших частинок для вибірки, розмір - це кількість частинок і p - вектор їх нормалізованої ваги. substitute = Справжній обробляє вибірку завантажувальної програми з заміною. Повернене значення - вектор нових об'єктів частинок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.