Bộ lọc hạt: Làm thế nào để lấy mẫu lại?


24

Tôi hiểu nguyên tắc cơ bản của bộ lọc hạt và đã cố gắng thực hiện. Tuy nhiên, tôi đã gác máy ở phần lấy mẫu lại.

Về mặt lý thuyết, nó khá đơn giản: Từ tập hợp các hạt cũ (và có trọng số), vẽ một tập hợp hạt mới với sự thay thế. Trong khi làm như vậy, ủng hộ những hạt có trọng lượng cao. Các hạt có trọng lượng cao được rút ra thường xuyên hơn và các hạt có trọng lượng thấp ít thường xuyên hơn. Có lẽ chỉ một lần hoặc không một chút nào. Sau khi lấy mẫu lại, tất cả các trọng số được gán cùng trọng lượng.

Ý tưởng đầu tiên của tôi về cách thực hiện điều này về cơ bản là thế này:

  1. Bình thường hóa trọng lượng
  2. Nhân mỗi trọng lượng với tổng số hạt
  3. Làm tròn các trọng số tỷ lệ này thành số nguyên gần nhất (ví dụ: int()trong Python)

Bây giờ tôi nên biết tần suất vẽ từng hạt, nhưng do lỗi vòng, cuối cùng tôi có ít hạt hơn trước bước lấy mẫu lại.

Câu hỏi: Làm thế nào để tôi "lấp đầy" các hạt còn thiếu để có cùng số lượng hạt như trước bước lấy mẫu lại? Hoặc, trong trường hợp tôi hoàn toàn không theo dõi được ở đây, làm thế nào để tôi lấy mẫu lại một cách chính xác?

Câu trả lời:


18

Vấn đề bạn gặp phải thường được gọi là nghèo nàn mẫu. Chúng ta có thể thấy lý do tại sao cách tiếp cận của bạn bị nó với một ví dụ khá đơn giản. Giả sử bạn có 3 hạt và trọng lượng chuẩn hóa của chúng là 0,1, 0,1, 0,8. Sau đó nhân với mỗi trọng số với 3 mang lại 0,3, 0,3 và 2,4. Sau đó làm tròn số mang lại 0, 0, 2. Điều này có nghĩa là bạn sẽ không chọn hai hạt đầu tiên và hạt cuối cùng sẽ được chọn hai lần. Bây giờ bạn xuống đến hai hạt. Tôi nghi ngờ đây là những gì bạn đã thấy khi bạn nói "do các lỗi vòng, cuối cùng tôi có ít hạt hơn".

Một phương pháp lựa chọn thay thế sẽ như sau.

  1. Bình thường hóa trọng lượng.
  2. Tính một mảng của tổng tích lũy của các trọng số.
  3. Tạo ngẫu nhiên một số & xác định phạm vi nào trong mảng trọng số tích lũy mà số đó thuộc về.
  4. Chỉ số của phạm vi đó sẽ tương ứng với hạt cần được tạo.
  5. Lặp lại cho đến khi bạn có số lượng mẫu mong muốn.

Vì vậy, bằng cách sử dụng ví dụ trên, chúng ta sẽ bắt đầu với các trọng số chuẩn hóa. Sau đó, chúng tôi sẽ tính toán mảng [0,1, 0,2, 1]. Từ đó ta tính được 3 số ngẫu nhiên nói 0,15, 0,38 và 0,54. Điều này sẽ cho chúng ta chọn hạt thứ hai một lần và hạt thứ ba hai lần. Vấn đề là nó cho các hạt nhỏ hơn một cơ hội để nhân giống.

Một điều cần lưu ý là trong khi phương pháp này sẽ đối phó với sự nghèo nàn, nó có thể dẫn đến một giải pháp tối ưu. Chẳng hạn, có thể không có hạt nào thực sự khớp với vị trí đã cho của bạn (giả sử bạn đang sử dụng thứ này để bản địa hóa). Các trọng số chỉ cho bạn biết các hạt phù hợp nhất, không phải là chất lượng của trận đấu. Như vậy khi bạn đọc thêm và lặp lại quá trình bạn có thể thấy rằng tất cả các nhóm hạt của bạn tại một vị trí không phải là vị trí chính xác. Điều này thường là do không có các hạt tốt để bắt đầu.


1
Cảm ơn các phản ứng sâu sắc! Phương pháp lựa chọn mà bạn đề xuất có vẻ quen thuộc. Nếu tôi nhớ lại một cách chính xác, đó là một cách phổ biến để xử lý vấn đề nghèo khó mẫu. Tôi đã thấy nó trước đây nhưng chưa bao giờ thực sự hiểu lý do cho thủ tục này. Bây giờ tôi biết rõ hơn!
Daniel Eberts

2
Tôi nghĩ rằng sự giải thích của bạn về nghèo nàn lấy mẫu có thể là một chút sai lệch. Việc áp phích mất các hạt là do một phương pháp không phù hợp để lấy mẫu lại. Sự bần cùng hóa hạt là khi phân phối sau của bạn không được đại diện đầy đủ bởi các hạt nữa.
Jakob

9

Như tôi đoán bạn đã tự mình tìm ra, phương pháp lấy mẫu lại mà bạn đang đề xuất hơi thiếu sót, vì nó không làm thay đổi số lượng hạt (trừ khi bạn muốn). Nguyên tắc là trọng lượng đại diện cho xác suất tương đối đối với các hạt khác. Trong bước lấy mẫu lại, bạn rút ra từ tập hợp các hạt sao cho mỗi hạt, trọng lượng chuẩn hóa nhân với số lượng hạt thể hiện số lần trung bình mà hạt được rút ra. Trong đó ý tưởng của bạn là chính xác. Chỉ bằng cách sử dụng làm tròn thay vì lấy mẫu, bạn sẽ luôn loại bỏ các hạt có giá trị mong đợi nhỏ hơn một nửa.

Có một số cách để thực hiện việc lấy mẫu lại đúng cách. Có một bài báo hay được gọi là thuật toán lấy mẫu lại cho các bộ lọc hạt , so sánh các phương pháp khác nhau. Chỉ để cung cấp một cái nhìn tổng quan nhanh chóng:

  • Lấy mẫu đa cực: tưởng tượng một dải giấy trong đó mỗi hạt có một phần, trong đó chiều dài tỷ lệ với trọng lượng của nó. Chọn ngẫu nhiên một vị trí trên dải N lần và chọn hạt liên kết với phần đó.

  • Lấy mẫu dư: phương pháp này cố gắng giảm phương sai của lấy mẫu, bằng cách trước tiên phân bổ cho mỗi hạt số nguyên sàn của giá trị dự kiến ​​và để phần còn lại cho phép lấy mẫu đa phương. Ví dụ, một hạt có giá trị dự kiến ​​là 2,5 sẽ có 2 bản sao trong tập hợp được ghép lại và một bản khác có giá trị dự kiến ​​là 0,5.

  • Lấy mẫu lại có hệ thống: lấy một thước kẻ có các dấu cách đều nhau, sao cho các dấu N có cùng độ dài với dải giấy của bạn. Đặt ngẫu nhiên thước bên cạnh dải của bạn. Lấy các hạt tại các điểm.

  • Lấy mẫu phân tầng: giống như lấy mẫu có hệ thống, ngoại trừ các dấu trên thước không được đặt đồng đều, nhưng được thêm vào dưới dạng N quá trình lấy mẫu ngẫu nhiên từ khoảng 0..1 / N.

Vì vậy, để trả lời câu hỏi của bạn: những gì bạn đã thực hiện có thể được mở rộng thành một hình thức lấy mẫu còn lại. Bạn điền vào các vị trí còn thiếu bằng cách lấy mẫu dựa trên phân phối đa hướng của các lời nhắc.


+1 vì đã trả lời câu hỏi tiếp theo của tôi :)
Daniel Eberts

5

Đối với một ví dụ về mã python thực hiện đúng cách lấy mẫu, bạn có thể thấy dự án github này hữu ích: https://github.com/mjl/particle_filter_demo

Thêm vào đó, nó đi kèm với biểu diễn trực quan của chính nó về quá trình lấy mẫu lại, điều đó sẽ giúp bạn gỡ lỗi việc thực hiện của chính bạn. Hoạt động của bộ lọc hạt

Trong hình dung này, rùa xanh hiển thị vị trí thực tế, chấm xám lớn hiển thị vị trí ước tính và chuyển sang màu xanh khi nó hội tụ. Trọng lượng chuyển từ có khả năng (màu đỏ) sang không có khả năng (màu xanh).


Cảm ơn các liên kết. Luôn luôn sâu sắc để xem cách người khác thực hiện một thuật toán.
Daniel Eberts

Đây là một hình ảnh của một bộ lọc hạt hội tụ. Không chắc chắn những gì sâu sắc nó cung cấp đối với câu hỏi.
Jakob

Tôi đã bao gồm trực quan hóa vì đó là những gì được tạo ra bởi mã tôi đã đăng - một ví dụ về cách thực hiện lấy mẫu đúng cách.
Ian

1

một cách đơn giản để làm điều này là numpy.random.choice (N, N, p = w, thay = True) trong đó N là số không. của các hạt và w = trọng lượng chuẩn hóa.


Chào mừng đến với Robotics , naraya. Bạn có thể vui lòng mở rộng câu trả lời này một số? Ví dụ, tại sao sử dụng một sự lựa chọn ngẫu nhiên? Là gì ptrong chức năng của bạn? Càng chi tiết bạn có thể đưa ra câu trả lời của mình, nó sẽ càng hữu ích hơn cho những khách truy cập trong tương lai có cùng vấn đề.
Chuck

1

Tôi sử dụng phương pháp của @ naraya để thực hiện bộ lọc hạt của mình:

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

a là vectơ của các hạt của bạn để lấy mẫu, kích thước là số hạt và p là vectơ của trọng lượng chuẩn hóa của chúng. thay thế = True xử lý lấy mẫu bootstrap với thay thế. Giá trị trả về là một vectơ của các đối tượng hạt mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.