Я понял основной принцип фильтра частиц и попытался реализовать его. Тем не менее, я зациклился на части пересэмплирования.
Теоретически, это довольно просто: из старого (и взвешенного) набора частиц нарисуйте новый набор частиц с заменой. При этом отдавайте предпочтение тем частицам, которые имеют большой вес. Частицы с большим весом вытягиваются чаще, а частицы с низким весом - реже. Возможно только один раз или не совсем. После повторной выборки всем весам присваивается одинаковый вес.
Моя первая идея о том, как реализовать это, была, по сути, такой:
- Нормализовать вес
- Умножьте каждый вес на общее количество частиц
- Округлите эти весы до ближайшего целого (например, с помощью
int()
в Python)
Теперь я должен знать, как часто нужно рисовать каждую частицу, но из-за ошибок округления у меня получается меньше частиц, чем до этапа повторной выборки.
Вопрос: Как «заполнить» отсутствующие частицы, чтобы получить то же количество частиц, что и до шага повторной выборки? Или, если я совершенно не в курсе, как мне правильно сделать повторную выборку?
источник
Как я полагаю, вы сами выяснили, что метод повторной выборки, который вы предлагаете, немного ошибочен, так как он не должен изменять количество частиц (если вы этого не хотите). Принцип заключается в том, что вес представляет относительную вероятность по отношению к другим частицам. На этапе повторной выборки вы выбираете из набора частиц так, чтобы для каждой частицы нормализованный вес, умноженный на количество частиц, представлял количество раз, которое частица была нарисована в среднем. В этом ваша идея верна. Только используя округление вместо выборки, вы всегда будете удалять частицы, для которых ожидаемое значение меньше половины.
Существует несколько способов правильно выполнить повторную выборку. Есть хорошая статья под названием « Алгоритмы передискретизации для фильтров частиц» , в которой сравниваются различные методы. Просто чтобы дать краткий обзор:
Полиномиальная повторная выборка: представьте полоску бумаги, где каждая частица имеет сечение, длина которого пропорциональна ее весу. Случайно выберите место на полосе N раз и выберите частицу, связанную с разрезом.
Остаточная повторная выборка: этот подход пытается уменьшить дисперсию выборки, сначала выделяя каждой частице их целое минимальное значение ожидаемого значения, а оставшуюся часть оставляют для многочленной повторной выборки. Например, частица с ожидаемым значением 2,5 будет иметь 2 копии в наборе с измененной выборкой и еще одну с ожидаемым значением 0,5.
Систематическая повторная выборка: возьмите линейку с правильными разнесенными отметками, так чтобы отметки N имели ту же длину, что и ваша полоска бумаги. Случайно поместите линейку рядом с вашей полосой. Возьмите частицы на отметках.
Стратифицированная повторная выборка: такая же, как и систематическая повторная выборка, за исключением того, что метки на линейке размещаются неравномерно, а добавляются как N случайных выборочных процессов из интервала 0..1 / N
Итак, чтобы ответить на ваш вопрос: то, что вы реализовали, может быть расширено до формы остаточной выборки. Вы заполняете недостающие слоты путем выборки, основываясь на многовековом распределении напоминаний.
источник
Для примера кода Python, который правильно реализует повторную выборку, вы можете найти этот проект github полезным: https://github.com/mjl/particle_filter_demo
Кроме того, он имеет собственное визуальное представление процесса пересэмплирования, которое должно помочь вам в отладке собственной реализации.
В этой визуализации зеленая черепаха показывает фактическое положение, большая серая точка показывает предполагаемое положение и становится зеленой, когда она сходится. Вес изменяется от вероятного (красный) до маловероятного (синий).
источник
Один простой способ сделать это - numpy.random.choice (N, N, p = w, replace = True), где N - нет. частиц и W = нормализованные веса.
источник
p
в твою функцию? Чем более подробный вы можете дать свой ответ, тем более он будет полезен для будущих посетителей, имеющих такую же проблему.Я использую подход @ narayan для реализации моего фильтра частиц:
a - вектор ваших частиц для выборки, размер - количество частиц, а p - вектор их нормализованных весов. replace = True обрабатывает выборку начальной загрузки с заменой. Возвращаемым значением является вектор новых объектов частиц.
источник