基於樸素貝葉斯的定位演算法

zhanlijun發表於2014-10-12

http://www.cnblogs.com/LBSer/p/4020370.html 

1 定位背景介紹

      一說到定位大家都會想到gps,然而gps定位有首次定位緩慢(具體可以參考之前的博文《LBS定位技術》)、室內不能使用、耗電等缺陷,這些缺陷大大限制了gps的使用。在大多數移動網際網路應用例如google地圖、百度地圖等,往往基於wifi、基站來進行定位。

       一般APP在請求定位的時候會上報探測到的wifi訊號、基站訊號。以wifi為例,手機會探測到周圍各個wifi(mac地址)對應的訊號強度(RSSI),即收集到訊號向量(<WF1, RSSI1> <WF2, RSSI2> ... <WFN, RSSIN>)。服務端收到客戶端請求後會將訊號向量傳給定位引擎定位引擎會結合這些資訊返回給服務端定位結果(x, y)、定位精度等資訊,服務端將此結果返回給APP

      定位引擎工作基於兩部分:1)大規模的資料收集;2)精細的演算法模型。

      如圖所示,使用者在請求app尤其是地圖類app的時候,時常會手動開啟GPS定位模式,而這時app會將收集到的基站wifi訊號以及gps定位到的座標傳送給服務端,服務端將gps定位座標(x, y)與訊號向量(<WF1, RSSI1> <WF2, RSSI2> ... <WFN, RSSIN>)關聯起來入庫。

       只要使用者足夠多就能快速積累大量“位置-訊號”資料如何將這些資料利用起來以實現基於基站wifi的定位將是難題。

       通過閱讀文獻,本文設計一種基於樸素貝葉斯的定位模型

2 基於樸素貝葉斯的定位模型

      我們從概率的角度看待定位問題。

      我們目標是計算在已知訊號向量m(<WF1, RSSI1> <WF2, RSSI2> ... <WFN, RSSIN>)的情況下,找到一處位置p使得這種情況的可能性最大,目標公式如下:

      直接求解該公式非常困難,但我們可以對該公式進行貝葉斯的轉換:

       分母P(m)表示訊號向量m出現的概率,對於使用者這一次請求來說是常量,因此可以忽略,因此目標公式轉換為:

        其中P(p)表示位置p出現的概率,P(m|p)表示在位置p出現訊號向量m的概率。簡化起見我們這裡假設位置p出現的概率均等(應該是不均等,比如位置在湖泊中和在市中心大街兩者出現的概率顯然不一樣,以後可以考慮使用此項)。這樣目標公式轉換為:       

         max(P(m|p))指的是在地理空間上找到一個點p,使得訊號向量m出現的概率最大。我們可以窮舉,計算空間上每一個點出現訊號向量m的概率,並找出概率最大的點。由於地理空間是二維平面,存在無窮個點,這種計算不可接受,我們可以通過對地理空間進行網格離散化來簡化計算(如下圖所示)。我們將地理空間劃分為M*N大小的網格(可以通過geohash對網格進行編碼,參考之前的博文《geohash》),因此max(P(m|p))就轉換為在地理空間找到一個網格,使得訊號向量m出現的概率最大。



         如何計算某網格p出現訊號向量m的概率呢?

         通過對“位置-訊號”資料庫的清洗,可以統計每一個網格出現的訊號向量的個數,即得到直方圖。

          得到了網格p的訊號向量直方圖後,我們就可以求P(m|p)的概率(p點所在的格子出現訊號向量m的概率)。

         然而實際上,對訊號向量進行count幾乎不可能,儘管有很多請求百度定位的結果落在網格p內,但這些請求攜帶的訊號向量幾乎不一樣,想得到有統計意義的直方圖幾乎不可能。

         因此,我們繼續對公式進行簡化,我們假設各個wifi訊號之間相互獨立,這個假設也是合理的。於是公式轉換為:

         現在問題關鍵是求解P(wfi=RSSIi | p),即在網格p內,mac地址為wfi且訊號強度為RSSIi出現的概率。我們可以事先統計一個網格p內每一個wifi訊號的直方圖,這樣形成統計意義的直方圖較容易。

         上述模型要求我們對地理空間進行網格化,並預先計算出每個網格內各個wifi對應的訊號直方圖,並進行儲存。然而在實際應用我們網格數目將會非常多,儲存直方圖的開銷較大,因此要儘可能節省網格里攜帶的資訊。因此一種思路是用高斯分佈曲線模擬直方圖,這樣對於一個網格,只需要儲存各個wifi對應的高斯分佈的幾個引數即可。

         當然,每個網格的直方圖曲線並不一定都能用高斯分佈曲線來近似,一些文獻指出可能存在各種形態的曲線例如雙峰曲線等,因此也可以採用核密度估計的方法。

         通過上述方法我們可以求出訊號向量m出現最大可能性的網格,並取網格的中心點座標返回即可。當然有些時候很難判別,比如我們求得A和B兩個格子的概率幾乎相等,這個時候僅僅返回A或者B就不太合適,加權插值是更為合理的選擇。一種比較魯棒的方法是我們找出topk個網格,然後進行插值。

3 問題及解決方法

1)離散網格大小如何確定?

         如果網格過小,儲存量巨大,並且很多網格沒有任何訊號直方圖;如果過大,精度得不到保證。一種方法網格大小為固定值,根據實驗結果來確定網格大小;更好的方法是自適應網格大小,對於訊號較密急的地方(市區)網格設小,對於訊號稀疏的地方(郊區)網格設大。

2)當使用者請求的訊號向量裡存在一些新的mac地址對應的訊號怎麼辦?

         如果直接應用下述公式進行計算,那麼得到的概率將會是0,因為我們是概率連乘,只要一項概率為0,整體結果就為0。為了去掉零概率,一個簡單的方法是採用加一平滑(add-one smoothing)或稱拉普拉斯平滑(Laplace smoothing)。

 

3)如何提高計算效率?

         理論上使用者來一個請求,我們需要遍歷計算資料庫每個網格對應的概率,並將最大概率網格對應的中心點返回。假設我們格子是10*10米大小,那麼將北京全部網格化就有1.6億個格子,遍歷計算開銷十分巨大。

       一種提高計算效率的方法是首先根據使用者的訊號向量求解出大致空間範圍,然後計算該空間範圍的每一個格子的概率。

4 參考文獻

  Practical Metropolitan-Scale Positioning for GSM Phones

  CellSense: A Probabilistic RSSI-based GSM Positioning System

  An Improved Algorithm to Generate a Wi-Fi Fingerprint Database for Indoor Positioning 

  Topical Issues: Location Fingerprinting

  基於區間數聚類的無線感測器網路定位方法 

  基於一種優化的KNN演算法在室內定位中的應用研究  

 

相關文章