कण फिल्टर: कैसे resampling करने के लिए?


24

मैं एक कण फिल्टर के मूल सिद्धांत को समझता हूं और एक को लागू करने की कोशिश करता हूं। हालांकि, मैं फिर से शुरू होने वाले हिस्से में लटका हुआ हूं।

सैद्धांतिक रूप से, यह काफी सरल है: कणों के पुराने (और भारित) सेट से, प्रतिस्थापन के साथ कणों का एक नया सेट तैयार करें। ऐसा करते समय, उन कणों का पक्ष लें जिनमें उच्च भार है। उच्च भार वाले कण अधिक बार खींचे जाते हैं और कम भार वाले कण अक्सर कम होते हैं। शायद केवल एक बार या बिल्कुल नहीं। रेज़मैपलिंग के बाद, सभी वज़न को समान भार सौंपा जाता है।

अनिवार्य रूप से इसे लागू करने के बारे में मेरा पहला विचार:

  1. वज़न सामान्य करें
  2. प्रत्येक वजन को कणों की कुल संख्या से गुणा करें
  3. उन पूर्णांक को निकटतम पूर्णांक तक गोल करें (जैसे int()कि पायथन में)

अब मुझे पता होना चाहिए कि प्रत्येक कण को ​​कितनी बार खींचना है, लेकिन राउंडऑफ़ त्रुटियों के कारण, मैं रेज़म्पलिंग चरण से पहले कम कणों को समाप्त करता हूं ।

प्रश्न: मैं लापता कणों को "भरने" के लिए कैसे कर सकता हूं ताकि पुन: नमूनाकरण चरण से पहले समान कणों को मिल सके? या, यदि मैं यहां पूरी तरह से बंद हूं, तो मैं सही तरीके से कैसे फिर से तैयार करूं?

जवाबों:


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

जैसा कि मुझे लगता है कि आपको खुद पता चल गया है, जिस रिसैम्पलिंग विधि का आप प्रस्ताव कर रहे हैं वह थोड़ी त्रुटिपूर्ण है, क्योंकि इसमें कणों की संख्या में परिवर्तन नहीं करना चाहिए (जब तक कि आप नहीं चाहते हैं)। सिद्धांत यह है कि वजन अन्य कणों के संबंध में सापेक्ष संभावना का प्रतिनिधित्व करता है। रेज़मैप्लिंग चरण में, आप कणों के सेट से आकर्षित होते हैं जैसे कि प्रत्येक कण के लिए, सामान्यीकृत भार समय कणों की संख्या का प्रतिनिधित्व करता है कि कण औसतन कितने बार खींचा जाता है। उसमें आपका विचार सही है। केवल नमूने के बजाय गोलाई का उपयोग करके, आप हमेशा उन कणों को समाप्त कर देंगे जिनके लिए अपेक्षित मूल्य आधे से कम है।

Resampling को ठीक से करने के लिए कई तरीके हैं। अलग-अलग तरीकों की तुलना करते हुए, कण फिल्टर के लिए रेज़ामापलिंग एल्गोरिदम नामक एक अच्छा पेपर है । बस एक त्वरित अवलोकन देने के लिए:

  • बहुराष्ट्रीय पुनरुत्पादन: कागज की एक पट्टी की कल्पना करें जहां प्रत्येक कण में एक खंड होता है, जहां लंबाई उसके वजन के अनुपात में होती है। बेतरतीब ढंग से पट्टी N पर एक स्थान चुनें, और अनुभाग से जुड़े कण को ​​चुनें।

  • अवशिष्ट पुनरुत्पादन: यह दृष्टिकोण नमूना के विचरण को कम करने की कोशिश करता है, पहले प्रत्येक कण को ​​अपेक्षित मान के पूर्णांक मंजिल को आवंटित करता है, और बाकी को बहुराष्ट्रीय पुनरुत्थान के लिए छोड़ देता है। उदाहरण के लिए 2.5 के अपेक्षित मान वाले एक कण में 2 प्रतियाँ होती हैं, जो कि रेज़मूलेट सेट में होती हैं और दूसरा 0.5 के अपेक्षित मान के साथ।

  • व्यवस्थित पुनरुत्पादन: एक शासक को नियमित रूप से चिह्नित अंकों के साथ लें, जैसे कि एन अंक आपके पेपर की पट्टी के समान लंबाई के होते हैं। बेतरतीब ढंग से शासक को अपनी पट्टी के बगल में रखें। कणों को निशानों पर ले जाएं।

  • स्तरीकृत पुनरुत्पादन: व्यवस्थित पुनरुत्पादन के समान, सिवाय इसके कि शासक पर निशान समान रूप से नहीं रखे जाते हैं, लेकिन अंतराल के रूप में नमूने 0..1 / एन से यादृच्छिक प्रक्रियाओं के रूप में जोड़े जाते हैं।

तो अपने प्रश्न का उत्तर देने के लिए: आपने जो लागू किया है उसे अवशिष्ट नमूने के रूप में बढ़ाया जा सकता है। आप रिमाइंडर्स के बहु-बहुराष्ट्रीय वितरण के आधार पर नमूने द्वारा लापता स्लॉट्स को भरते हैं।


+1 करने के लिए पहले से ही मेरे अनुवर्ती प्रश्न का उत्तर दिया गया :)
डैनियल एर्बट्स

5

अजगर कोड के एक उदाहरण के लिए जो ठीक से लागू होता है, आपको यह गिटब प्रोजेक्ट उपयोगी लग सकता है: https://github.com/mjl/particle_filter_demo

इसके अलावा, यह resampling प्रक्रिया के अपने स्वयं के दृश्य प्रतिनिधित्व के साथ आता है, जिससे आपको अपने स्वयं के कार्यान्वयन को डीबग करने में मदद करनी चाहिए। कण फिल्टर ऑपरेशन

इस विज़ुअलाइज़ेशन में, हरे कछुए वास्तविक स्थिति को दिखाते हैं, बड़े ग्रे डॉट अनुमानित स्थिति को दिखाते हैं और जब यह परिवर्तित होता है तो हरा हो जाता है। वजन संभावना (लाल) से असंभावित (नीला) हो जाता है।


लिंक के लिए धन्यवाद। यह देखना हमेशा सुखद होता है कि अन्य लोगों ने एक एल्गोरिथम कैसे लागू किया।
डैनियल एबर्ट्स

यह एक कण फिल्टर अभिसरण का दृश्य है। सुनिश्चित नहीं है कि प्रश्न के संबंध में यह क्या अंतर्दृष्टि प्रदान करता है।
जैकब

मैंने विज़ुअलाइज़ेशन को शामिल किया क्योंकि यह वही है जो मैंने पोस्ट किए गए कोड द्वारा निर्मित किया है - एक उदाहरण है कि कैसे ठीक से रेज़म्पलिंग को लागू किया जाए।
इयान

1

ऐसा करने का एक सरल तरीका है numpy.random.choice (N, N, p = w, प्रतिस्थापित = True) जहां N नहीं है। कणों और w = सामान्यीकृत भार।


रोबोटिक्स , नारायण में आपका स्वागत है । क्या आप कृपया इस उत्तर का विस्तार कर सकते हैं? उदाहरण के लिए, एक यादृच्छिक विकल्प का उपयोग क्यों करें? pआपके फंक्शन में क्या है ? जितना विस्तृत आप अपना उत्तर दे सकते हैं, भविष्य के आगंतुकों के लिए उतना ही उपयोगी होगा, जिनके पास एक ही समस्या है।
चक

1

मैं अपने कण फिल्टर को लागू करने के लिए @ नारायण के दृष्टिकोण का उपयोग करता हूं:

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

a आपके कणों के सैंपल का नमूना है, आकार कणों की गिनती है और p उनके सामान्यीकृत भार का वेक्टर है। रिप्लेस = ट्रू रिप्लेसमेंट के साथ ट्रू बूटस्ट्रैप सैंपलिंग। वापसी मूल्य नई कण वस्तुओं का एक वेक्टर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.