一說到定位你們都會想到gps,然而gps定位有首次定位緩慢(具體能夠參考以前的博文《LBS定位技術》)、室內不能使用、耗電等缺陷,這些缺陷大大限制了gps的使用。在大多數移動互聯網應用例如google地圖、百度地圖等,每每基於wifi、基站來進行定位。html
通常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的定位將是難題。app
經過閱讀文獻,本文設計了一種基於樸素貝葉斯的定位模型。優化
咱們從機率的角度看待定位問題。google
咱們目標是計算在已知信號向量m(<WF1, RSSI1> <WF2, RSSI2> ... <WFN, RSSIN>)的狀況下,找到一處位置p使得這種狀況的可能性最大,目標公式以下:編碼
直接求解該公式很是困難,但咱們能夠對該公式進行貝葉斯的轉換:spa
分母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個網格,而後進行插值。
1)離散網格大小如何肯定?
若是網格太小,存儲量巨大,而且不少網格沒有任何信號直方圖;若是過大,精度得不到保證。一種方法網格大小爲固定值,根據實驗結果來肯定網格大小;更好的方法是自適應網格大小,對於信號較密急的地方(市區)網格設小,對於信號稀疏的地方(郊區)網格設大。
2)當用戶請求的信號向量裏存在一些新的mac地址對應的信號怎麼辦?
若是直接應用下述公式進行計算,那麼獲得的機率將會是0,由於咱們是機率連乘,只要一項機率爲0,總體結果就爲0。爲了去掉零機率,一個簡單的方法是採用加一平滑(add-one smoothing)或稱拉普拉斯平滑(Laplace smoothing)。
3)如何提升計算效率?
理論上用戶來一個請求,咱們須要遍歷計算數據庫每一個網格對應的機率,並將最大機率網格對應的中心點返回。假設咱們格子是10*10米大小,那麼將北京所有網格化就有1.6億個格子,遍歷計算開銷十分巨大。
一種提升計算效率的方法是首先根據用戶的信號向量求解出大體空間範圍,而後計算該空間範圍的每個格子的機率。
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算法在室內定位中的應用研究