使用HMM与osmnx进行地图匹配

主要思路:
1.使用osmnx获取路网
2.利用osmnx包获得距离gps点较近的几条边(或者几个点)
3.将hmm利用到map-matching中获得最佳边
4.将gps点投影到路网上


gps数据预处理思路:
使用HMM与osmnx进行地图匹配_第1张图片
已知观察变量,
即给定模型和观测序列,求给定观测序列条件下,最可能出现的对应的隐藏状态序列。
使用维特比算法

对于每个输入的GPS位置,计算在GPS位置周围一定半径范围内的若干地图匹配候选。然后使用hmm-lib提供的Viterbi算法来计算最可能的地图匹配候选序列。因此,考虑GPS位置与地图匹配候选点之间的距离以及连续地图匹配候选点之间的路由距离
使用HMM与osmnx进行地图匹配_第2张图片
hmm在路网匹配中的理解:
使用HMM与osmnx进行地图匹配_第3张图片
观察概率的计算:
使用HMM与osmnx进行地图匹配_第4张图片
状态转移概率的计算:
使用HMM与osmnx进行地图匹配_第5张图片
隐马尔科夫模型的5个要素:
使用HMM与osmnx进行地图匹配_第6张图片

状态转移矩阵:https://blog.csdn.net/gdp12315_gu/article/details/49949669

有了观察概率和转移概率后,使用维特比算法进行求解

Dijsktra算法属于贪心算法,Viterbi算法属于动态规划算法。从另一个角度来看,Dijsktra算法是深度优先图算法,Viterbi算法则是广度优先图算法。

Viterbi算法在HMM中的优势是速度快,劣势是存在重复计算
具体参考:维特比算法(viterbi)原理以及简单实现


python中可以下载hmmlearn包来使用hmm模型

对于MultinomialHMM(离散型)的模型,使用比较简单,

"startprob_"参数对应我们的隐藏状态初始分布∏(pi)。
"transmat_"对应我们的状态转移矩阵A。
"emissionprob_"对应我们的观测状态概率矩阵B。


GaussianHMM类(连续型)假设观测状态符合高斯分布

在GaussianHMM类中,"startprob_"参数对应我们的隐藏状态初始分布 ∏(pi)。
"transmat_"对应我们的状态转移矩阵A。
比较特殊的是观测状态概率的表示方法,此时由于观测状态是连续值,我们无法像MultinomialHMM一样直接给出矩阵B。而是采用给出各个隐藏状态对应的观测状态高斯分布的概率密度函数的参数。

如果观测序列是一维的,则观测状态的概率密度函数是一维的普通高斯分布。如果观测序列是N维的,则隐藏状态对应的观测状态的概率密度函数是N维高斯分布。

在GaussianHMM类中,“means”用来表示各个隐藏状态对应的高斯分布期望向量μ形成的矩阵,而“covars”用来表示各个隐藏状态对应的高斯分布协方差矩阵Σ形成的三维张量。


优化:HMM引入更多路网数据情况,强化学习
HMM衍生算法
使用HMM与osmnx进行地图匹配_第7张图片

参考文章:
隐马尔可夫模型HMM
地图匹配小结
HMM超详细讲解+代码
漫话 | 地图数据处理之道路匹配篇

你可能感兴趣的:(python,机器学习,算法)