입자 필터 : 리샘플링을 수행하는 방법?


24

입자 필터의 기본 원리를 이해하고 구현하려고했습니다. 그러나 나는 리샘플링 부분에 매달렸다.

이론적으로 말하면, 그것은 매우 간단합니다. 오래된 (가중) 입자 세트에서 교체와 함께 새로운 입자 세트를 그립니다. 그렇게하는 동안, 무게가 큰 입자를 선호하십시오. 가중치가 높은 입자는 더 자주 그려지고 가중치가 낮은 입자는 덜 자주 나타납니다. 아마도 한 번만 또는 전혀 없습니다. 리샘플링 후 모든 가중치에 동일한 가중치가 할당됩니다.

이것을 구현하는 방법에 대한 첫 번째 아이디어는 본질적으로 다음과 같습니다.

  1. 가중치 정규화
  2. 각 중량에 총 입자 수를 곱하십시오.
  3. 스케일 된 가중치를 가장 가까운 정수로 반올림합니다 (예 : int()Python에서)

이제 각 파티클을 그리는 빈도를 알아야 하지만 반올림 오류로 인해 리샘플링 단계 이전 보다 파티클적습니다 .

질문 : 리샘플링 단계 이전과 같은 수의 입자에 도달하기 위해 누락 된 입자를 "채우는"방법은 무엇입니까? 또는 여기에서 완전히 벗어난 경우 올바르게 다시 샘플링하는 방법은 무엇입니까?

답변:


18

겪고있는 문제를 종종 샘플 빈곤이라고합니다. 우리는 왜 당신의 접근 방식이 상당히 간단한 예를 통해 그 어려움을 겪고 있는지 알 수 있습니다. 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]을 계산합니다. 거기에서 우리는 0.15, 0.38, 0.54의 3 개의 난수를 계산합니다. 이를 통해 두 번째 입자를 한 번, 세 번째 입자를 두 번 선택해야합니다. 요점은 작은 입자가 전파 될 수있는 기회를 제공한다는 것입니다.

한 가지 주목할 점은이 방법은 빈곤을 해결하지만 차선책으로 이어질 수 있다는 것입니다. 예를 들어, 현지화에이 입자를 사용한다고 가정하면 입자 중 어느 것도 주어진 위치와 정확히 일치하지 않을 수 있습니다. 가중치는 일치 품질이 아닌 어떤 입자가 가장 일치하는지 알려줍니다. 따라서 추가 판독을 수행하고 프로세스를 반복하면 모든 입자가 올바른 위치가 아닌 단일 위치에서 그룹화되는 것을 알 수 있습니다. 이것은 시작하기에 좋은 입자가 없었기 때문입니다.


1
통찰력있는 답변 감사합니다! 제안한 선택 방법은 익숙한 것 같습니다. 내가 정확하게 기억한다면, 그것은 샘플 빈곤 문제를 처리하는 일반적인 방법이었습니다. 나는 전에 그것을 보았지만이 절차의 이유를 실제로 이해하지 못했습니다. 이제 더 잘 알아요!
Daniel Eberts

2
샘플링 빈곤에 대한 당신의 해석은 약간 오해의 소지가 있다고 생각합니다. 포스터가 파티클을 느슨하게하는 것은 리샘플링에 부적합한 방법 때문입니다. 파티클 빈곤은 더 이상 사후 분포가 더 이상 파티클에 의해 적절하게 표현되지 않을 때입니다.
Jakob

9

당신이 스스로 알아 낸 것처럼, 제안하는 리샘플링 방법은 입자의 수를 변경하지 않아야하기 때문에 약간 결함이 있습니다 (원하는 경우 제외). 원리는 가중치가 다른 입자에 대한 상대 확률을 나타냅니다. 리샘플링 단계에서는 입자 세트에서 각 입자에 대해 정규화 된 가중치와 입자 수의 곱을 곱하여 입자가 평균적으로 그려지는 횟수를 나타냅니다. 당신의 생각은 정확합니다. 샘플링 대신 반올림 만 사용하면 항상 예상 값이 절반 미만인 입자가 제거됩니다.

리샘플링을 올바르게 수행하는 방법에는 여러 가지가 있습니다. 서로 다른 방법을 비교하는 입자 필터에 대한 리샘플링 알고리즘 (On resampling algorithms) 이라는 멋진 논문이 있습니다 . 빠른 개요를 제공하려면 다음을 수행하십시오.

  • 다항식 리샘플링 : 각 입자에 단면이 있고 길이가 무게에 비례하는 종이 조각을 상상해보십시오. N 번 스트립에서 임의의 위치를 ​​무작위로 선택하고 섹션과 관련된 입자를 선택하십시오.

  • 잔차 리샘플링 :이 방법은 먼저 각 입자에 기대 값의 정수 층을 할당하고 나머지는 다항식 리샘플링으로 두어 샘플링의 분산을 줄입니다. 예를 들어, 기대 값이 2.5 인 입자는 리샘플링 된 세트에 2 개의 사본이 있고 기대 값이 0.5 인 다른 사본이 있습니다.

  • 체계적인 리샘플링 : 규칙적인 간격의 마크가있는 눈금자를 사용하여 N 마크의 길이가 용지와 동일합니다. 스트립 옆에자를 무작위로 놓습니다. 자국을 입자로 가져갑니다.

  • 계층화 된 리샘플링 : 눈금자의 마크가 균등하게 배치되지 않고 간격 0..1 / N에서 N 개의 랜덤 프로세스 샘플링으로 추가된다는 점을 제외하고는 체계적인 리샘플링과 동일합니다.

따라서 귀하의 질문에 대답하기 위해 : 구현 한 것이 잔류 샘플링의 형태로 확장 될 수 있습니다. 미리 알림의 다중 비정규 분포를 기반으로 샘플링하여 누락 된 슬롯을 채 웁니다.


이미 가지고 +1 내 후속 질문 : 대답
다니엘 Eberts을

5

리샘플링을 올바르게 구현하는 파이썬 코드의 예를 보려면 다음 github 프로젝트가 유용 할 수 있습니다. https://github.com/mjl/particle_filter_demo

또한 리샘플링 프로세스를 시각적으로 표현하여 구현을 디버깅하는 데 도움이됩니다. 입자 필터 작동

이 시각화에서 녹색 거북은 실제 위치를 나타내고 큰 회색 점은 예상 위치를 나타내며 수렴하면 녹색으로 바뀝니다. 무게는 가능 (적색)에서 거의 (파란색)으로 바뀝니다.


링크 주셔서 감사합니다. 다른 사람들이 알고리즘을 구현 한 방법을 보는 것은 항상 통찰력이 있습니다.
Daniel Eberts

이것은 입자 필터 수렴의 시각화입니다. 질문과 관련하여 어떤 통찰력을 제공하는지 확실하지 않습니다.
Jakob

리샘플링을 올바르게 구현하는 방법의 예인 게시 한 코드에서 생성 된 것이므로 시각화를 포함 시켰습니다.
Ian

1

이를 수행하는 간단한 방법 중 하나는 numpy.random.choice (N, N, p = w, replace = True)입니다. 여기서 N은 아니오입니다. 입자 수 및 w = 정규화 된 중량.


로봇 공학에 오신 것을 환영합니다 . 이 답변을 좀 확장 해 주시겠습니까? 예를 들어, 왜 무작위 선택을 사용합니까? p당신의 기능 은 무엇입니까 ? 답변을 자세히 작성할수록 동일한 문제가있는 향후 방문자에게 더 유용 할 것입니다.

1

@narayan의 접근 방식을 사용하여 입자 필터를 구현합니다.

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

a는 샘플링 할 입자의 벡터이고, 크기는 입자의 개수이며, p는 정규화 된 가중치의 벡터입니다. replace = True는 부트 스트랩 샘플링을 교체와 함께 처리합니다. 반환 값은 새로운 파티클 객체로 구성된 벡터입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.