Filtros de partículas: como fazer reamostragem?

24

Entendo o princípio básico de um filtro de partículas e tentei implementá-lo. No entanto, fiquei pendurado na parte de reamostragem.

Teoricamente falando, é bastante simples: a partir do conjunto de partículas antigo (e ponderado), desenhe um novo conjunto de partículas com substituição. Enquanto isso, favorece as partículas que têm pesos altos. Partículas com pesos altos são atraídas com mais frequência e partículas com pesos baixos com menos frequência. Talvez apenas uma vez ou não. Após a reamostragem, todos os pesos recebem o mesmo peso.

Minha primeira idéia de como implementar isso foi essencialmente esta:

  1. Normalizar os pesos
  2. Multiplique cada peso pelo número total de partículas
  3. Arredonde esses pesos dimensionados para o número inteiro mais próximo (por exemplo, com int()em Python)

Agora eu deveria saber com que frequência desenhar cada partícula, mas devido aos erros de arredondamento, acabo tendo menos partículas do que antes da etapa de reamostragem.

A pergunta: como "preenche" as partículas ausentes para obter o mesmo número de partículas que antes da etapa de reamostragem? Ou, caso eu esteja completamente fora de controle aqui, como reamostrar corretamente?

Daniel Eberts
fonte

Respostas:

19

O problema que você está enfrentando é geralmente chamado de empobrecimento da amostra. Podemos ver por que sua abordagem sofre com um exemplo bastante simples. Digamos que você tenha 3 partículas e seus pesos normalizados sejam 0,1, 0,1, 0,8. A multiplicação de cada peso pelos 3 produz 0,3, 0,3 e 2,4. Em seguida, o arredondamento produz 0, 0, 2. Isso significa que você não selecionaria as duas primeiras partículas e a última seria escolhida duas vezes. Agora você está reduzido a duas partículas. Eu suspeito que isso é o que você tem visto quando diz "devido aos erros de arredondamento, acabo tendo menos partículas".

Um método de seleção alternativo seria o seguinte.

  1. Normalize pesos.
  2. Calcule uma matriz da soma acumulada dos pesos.
  3. Gere um número aleatoriamente e determine qual intervalo nessa matriz de pesos acumulados ao qual o número pertence.
  4. O índice desse intervalo corresponderia à partícula que deveria ser criada.
  5. Repita até obter o número desejado de amostras.

Portanto, usando o exemplo acima, começaríamos com os pesos normalizados. Nós então calcularíamos a matriz [0.1, 0.2, 1]. A partir daí, calculamos 3 números aleatórios, digamos 0,15, 0,38 e 0,54. Isso nos faria escolher a segunda partícula uma vez e a terceira partícula duas vezes. O ponto é que ele dá às partículas menores a chance de se propagar.

Uma coisa a notar é que, embora esse método lide com o empobrecimento, ele pode levar a soluções abaixo do ideal. Por exemplo, pode ser que nenhuma das partículas realmente corresponda bem ao local especificado (supondo que você esteja usando isso para localização). Os pesos informam apenas quais partículas correspondem melhor, não a qualidade da correspondência. Assim, quando você faz leituras adicionais e repete o processo, pode descobrir que todas as suas partículas se agrupam em um único local que não é o local correto. Isso geralmente ocorre porque não havia boas partículas para começar.

DaemonMaker
fonte
11
Obrigado pela resposta perspicaz! O método de seleção que você sugeriu parece familiar. Se bem me lembro, essa era uma maneira comum de tratar o problema de empobrecimento da amostra. Eu já vi isso antes, mas nunca realmente entendi o motivo desse procedimento. Agora eu sei melhor!
precisa saber é o seguinte
2
Eu acho que sua interpretação do empobrecimento da amostra pode ser um pouco enganadora. O fato de o pôster perder partículas é devido a um método inadequado de reamostragem. O empobrecimento de partículas ocorre quando sua distribuição posterior não é mais adequadamente representada pelas partículas.
21412 Jakob
9

Como eu acho que você se descobriu, o método de reamostragem que você está propondo é levemente defeituoso, pois não deve alterar o número de partículas (a menos que você queira). O princípio é que o peso representa a probabilidade relativa em relação às outras partículas. Na etapa de reamostragem, você extrai do conjunto de partículas de modo que, para cada partícula, o peso normalizado vezes o número de partículas represente o número de vezes que a partícula é desenhada em média. Nesse sentido, sua ideia está correta. Somente usando o arredondamento em vez da amostragem, você sempre eliminará partículas para as quais o valor esperado é menor que a metade.

Existem várias maneiras de executar a reamostragem corretamente. Existe um bom artigo chamado Algoritmos de reamostragem para filtros de partículas , comparando os diferentes métodos. Apenas para dar uma rápida visão geral:

  • Reamostragem multinomial: imagine uma tira de papel em que cada partícula tenha uma seção, em que o comprimento seja proporcional ao seu peso. Escolha aleatoriamente um local na faixa N vezes e escolha a partícula associada à seção.

  • Reamostragem residual: essa abordagem tenta reduzir a variação da amostragem, alocando primeiro cada partícula seu piso inteiro do valor esperado e deixando o restante para reamostragem multinomial. Por exemplo, uma partícula com um valor esperado de 2,5 terá 2 cópias no conjunto reamostrado e outra com um valor esperado de 0,5.

  • Reamostragem sistemática: faça uma régua com marcas espaçadas regulares, de modo que as marcas N tenham o mesmo comprimento da sua tira de papel. Coloque aleatoriamente a régua ao lado da sua faixa. Pegue as partículas nas marcas.

  • Reamostragem estratificada: igual à reamostragem sistemática, exceto que as marcas na régua não são colocadas uniformemente, mas adicionadas como N processos aleatórios de amostragem a partir do intervalo 0..1 / N.

Então, para responder à sua pergunta: o que você implementou pode ser estendido a uma forma de amostragem residual. Você preenche os slots ausentes por amostragem com base em uma distribuição multinonial dos lembretes.

Jakob
fonte
+1 por já ter respondido à minha follow-up pergunta :)
Daniel Eberts
5

Para um exemplo de código python que implementa adequadamente a reamostragem, você pode achar útil esse projeto no github: https://github.com/mjl/particle_filter_demo

Além disso, ele vem com sua própria representação visual do processo de reamostragem, que deve ajudá-lo a depurar sua própria implementação. Operação do filtro de partículas

Nesta visualização, a tartaruga verde mostra a posição real, o grande ponto cinza mostra a posição estimada e fica verde quando converge. O peso passa de provável (vermelho) para improvável (azul).

Ian
fonte
Obrigado pelo link. É sempre interessante ver como outras pessoas implementaram um algoritmo.
precisa saber é o seguinte
Esta é uma visualização de um filtro de partículas convergindo. Não tenho certeza de qual insight ele fornece em relação à pergunta.
21412 Jakob
Incluí a visualização, pois é o que é produzido pelo código que publiquei - um exemplo de como implementar corretamente a reamostragem.
31412 Ian
1

Uma maneira simples de fazer isso é numpy.random.choice (N, N, p = w, replace = True) em que N é o não. de partículas ew = pesos normalizados.

narayan
fonte
Bem-vindo à robótica , narayan. Você poderia, por favor, expandir esta resposta? Por exemplo, por que usar uma escolha aleatória? O que está pem sua função? Quanto mais detalhada você puder responder, mais útil será para futuros visitantes que tiverem o mesmo problema.
Chuck
1

Eu uso a abordagem do @ narayan para implementar meu filtro de partículas:

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

a é o vetor de suas partículas a serem amostradas, tamanho é a contagem de partículas ep é o vetor de seus pesos normalizados. replace = True lida com a amostragem de autoinicialização com substituição. O valor de retorno é um vetor de novos objetos de partículas.

Rajá
fonte