2012-05-03 43 views
13

的實現我感興趣的簡單算法,這裏給出的顆粒過濾器:http://www.aiqus.com/upfiles/PFAlgo.png這似乎很簡單,但我對如何在實踐中做到這一點不知道。 關於如何實現它的任何想法(只是爲了更好地理解它是如何工作的)?序貫蒙特卡羅方法(顆粒過濾器)

編輯: 這是解釋它是如何工作的一個偉大的簡單的例子:http://www.aiqus.com/questions/39942/very-simple-particle-filters-algorithm-sequential-monte-carlo-method-implementation?page=1#39950

我一直試圖實現它在C++:http://pastebin.com/M1q1HcN4但我注意到肯定,如果我這樣做的正確方法。你能檢查一下我是否瞭解它,或者根據我的代碼有誤解嗎?

#include <iostream> 
#include <vector> 
#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/uniform_01.hpp> 
#include <boost/random/uniform_int_distribution.hpp> 

using namespace std; 
using namespace boost; 

double uniform_generator(void); 

#define N 4 // number of particles 

#define evolutionProba_A_A 1.0/3.0 // P(X_t = A | X_t-1 = A) 
#define evolutionProba_A_B 1.0/3.0 // P(X_t = A | X_t-1 = B) 
#define evolutionProba_B_B 2.0/3.0 // P(X_t = B | X_t-1 = B) 
#define evolutionProba_B_A 2.0/3.0 // P(X_t = B | X_t-1 = A) 

#define observationProba_A_A 4.0/5.0 // P(Y_t = A | X_t = A) 
#define observationProba_A_B 1.0/5.0 // P(Y_t = A | X_t = B) 
#define observationProba_B_B 4.0/5.0 // P(Y_t = B | X_t = B) 
#define observationProba_B_A 1.0/5.0 // P(Y_t = A | X_t = A) 

/// =========================================================================== 

typedef struct distrib { float PA; float PB; } Distribution; 

typedef struct particle 
{ 
    Distribution distribution; // e.g. <0.5, 0.5> 
    char state; // e.g. 'A' or 'B' 
    float weight; // e.g. 0.8 
} 
Particle; 

/// =========================================================================== 

int main() 
{ 
    vector<char> Y; // data observations 
    Y.push_back('A'); Y.push_back('B'); Y.push_back('A'); Y.push_back('A'); Y.push_back('A'); Y.push_back('B'); 
    Y.push_back('A'); Y.push_back('A'); Y.push_back('B'); Y.push_back('A'); Y.push_back('B'); Y.push_back('A'); 
    Y.push_back('A'); Y.push_back('B'); Y.push_back('B'); Y.push_back('A'); Y.push_back('A'); Y.push_back('B'); 

    vector< vector<Particle> > Xall; // vector of all particles from time 0 to t 

    /// Step (1) Initialisation 
    vector<Particle> X; // a vector of N particles 
    for(int i = 0; i < N; ++i) 
    { 
     Particle x; 

     // sample particle Xi from initial distribution 
     x.distribution.PA = 0.5; x.distribution.PB = 0.5; 
     float r = uniform_generator(); 
     if(r <= x.distribution.PA) x.state = 'A'; // r <= 0.5 
     if(x.distribution.PA < r && r <= x.distribution.PA + x.distribution.PB) x.state = 'B'; // 0.5 < r <= 1 

     X.push_back(x); 
    } 

    Xall.push_back(X); 
    X.clear(); 

    /// Observing data 
    for(int t = 1; t <= 18; ++t) 
    { 
     char y = Y[t-1]; // current observation 

     /// Step (2) Importance sampling 
     float sumWeights = 0; 
     vector<Particle> X; // a vector of N particles 
     for(int i = 0; i < N; ++i) 
     { 
      Particle x; 

      // P(X^i_t = A) = P(X^i_t = A | X^i_t-1 = A) * P(X^i_t-1 = A) + P(X^i_t = A | X^i_t-1 = B) * P(X^i_t-1 = B) 
      x.distribution.PA = evolutionProba_A_A * Xall[t-1][i].distribution.PA + evolutionProba_A_B * Xall[t-1][i].distribution.PB; 

      // P(X^i_t = B) = P(X^i_t = B | X^i_t-1 = A) * P(X^i_t-1 = A) + P(X^i_t = B | X^i_t-1 = B) * P(X^i_t-1 = B) 
      x.distribution.PB = evolutionProba_B_A * Xall[t-1][i].distribution.PA + evolutionProba_B_B * Xall[t-1][i].distribution.PB; 

      // sample the a particle from this distribution 
      float r = uniform_generator(); 
      if(r <= x.distribution.PA) x.state = 'A'; 
      if(x.distribution.PA < r && r <= x.distribution.PA + x.distribution.PB) x.state = 'B'; 

      // compute weight of this particle according to the observation y 
      if(y == 'A') 
      { 
       if(x.state == 'A') x.weight = observationProba_A_A; // P(y = A | X^i_t = A) 
       else if(x.state == 'B') x.weight = observationProba_A_B; // P(y = A | X^i_t = B) 
      } 
      else if(y == 'B') 
      { 
       if(x.state == 'A') x.weight = observationProba_B_A; // P(y = B | X^i_t = A) 
       else if(x.state == 'B') x.weight = observationProba_B_B; // P(y = B | X^i_t = B) 
      } 

      sumWeights += x.weight; 

      X.push_back(x); 
     } 

     // normalise weights 
     for(int i = 0; i < N; ++i) 
      X[i].weight /= sumWeights; 

     /// Step (3) resampling N particles according to weights 
     float PA = 0, PB = 0; 
     for(int i = 0; i < N; ++i) 
     { 
      if(X[i].state == 'A') PA += X[i].weight; 
      else if(X[i].state == 'B') PB += X[i].weight; 
     } 

     vector<Particle> reX; // new vector of particles 
     for(int i = 0; i < N; ++i) 
     { 
      Particle x; 

      x.distribution.PA = PA; 
      x.distribution.PB = PB; 

      float r = uniform_generator(); 
      if(r <= x.distribution.PA) x.state = 'A'; 
      if(x.distribution.PA < r && r <= x.distribution.PA + x.distribution.PB) x.state = 'B'; 

      reX.push_back(x); 
     } 

     Xall.push_back(reX); 
    } 

    return 0; 
} 

/// =========================================================================== 

double uniform_generator(void) 
{ 
    mt19937 gen(55); 
    static uniform_01< mt19937, double > uniform_gen(gen); 
    return uniform_gen(); 
} 
+0

什麼時候你可以在真實世界中使用這個過濾器?您可以針對解決方案的問題進行測試嗎?如果你已經正確實施它,你會得到相同的號碼。錯誤的執行得到正確的結果是不太可能的! –

+0

@AlessandroTeruzzi這只是一個簡單的例子[here]給出的實現(http://www.aiqus.com/questions/39942/very-simple-particle-filters-algorithm-sequential-monte-carlo-method-implementation/39950)。爲了更好地理解由此算法給出的[粒子濾波器概念](http://www.aiqus.com/upfiles/PFAlgo.png),我已經實現了它,但是我不確定是否正確實現了它,因爲我沒有很好地理解算法。我不知道如何測試它是否有效,因爲算法及其輸出對我來說仍然不是很清楚(即使算法看起來很簡單)。 – shn

+0

我對泛型算法的第一個建議是:不要試圖實現你不完全理解的東西。首先承諾,然後執行。否則,你將無法知道發生了什麼問題。 –

回答

20

This online course非常簡單明瞭,對我來說它很好地解釋了粒子濾波器。

這就是所謂的「編程的一個機器人汽車」,和它談約三localiczation的方法:蒙特卡洛定位,卡爾曼濾波器和顆粒過濾器。

該課程是完全免費的(它現在完成了,所以你不能積極參與,但你仍然可以觀看講座),由斯坦福大學教授授課。這些「課程」對我而言非常容易,他們還伴隨着一些練習 - 其中一些只是合乎邏輯的,但其中很多都是編程。此外,你可以玩的作業分配。

它實際上是讓你用Python語言編寫自己的代碼對所有的過濾器,他們還測試你。到課程結束時,你應該在Python中實現所有3個過濾器。

熱烈推薦檢查一下。

+0

好吧,我會檢查出來。但是因爲我只是對粒子濾波器感興趣(也許還有其他兩個濾波器),我應該從一開始就檢查所有單元的所有課程嗎? – shn

+0

如果你對所有的過濾器感興趣,你應該檢查整個過程。但是,即使你不是,我建議通過其他課程 - 它會給你一個非常好的本地化方法的總體概述,你會更容易理解每​​個過濾器最合適的地方。我認爲1個講座通常可以在大約4個小時內完成 - 如果您想要簡單,可以在1或2天內完成) – penelope

+0

順便說一句,我不會使用機器人粒子濾波器(本地化等),我我們將用它來解決與在線聚類連續數據有關的另一個問題。 – shn

3
+0

他們在某種程度上不是我所期望的。無論如何要實現www.cs.ubc第9頁中介紹的簡單方法。ca /〜arnaud/doucet_defreitas_gordon_smcbookintro.ps? – shn

+0

當然,有辦法:)鏈接與你的期望有什麼不同?你哪裏掛了?我相信p。上的算法。 11.相當簡單。 – Throwback1986

+0

那麼,我想實現微粒過濾器,只是爲了理解它而已。我已經編輯了我的第一篇文章,以添加一個簡單的C++實現,在這裏解釋一個簡單的例子:http://www.aiqus.com/questions/39942/very-simple-particle-filters-algorithm-sequential-monte-carlo- method-implementation?page = 1#39950 你能檢查一下我理解得好嗎,還是有一些誤解? – shn