地图匹配(隐马尔科夫,维特比算法(本质是动态规划))

 

地图Map-Matching流行算法及应用

http://www.semocean.com/lbs%E5%9C%B0%E5%9B%BEmap-matching%E6%B5%81%E8%A1%8C%E7%AE%97%E6%B3%95%E5%8F%8A%E5%BA%94%E7%94%A8/

从隐式马尔科夫模型到地图匹配(上)

https://mp.weixin.qq.com/s?__biz=MzI4MDAwMDY0OQ==&mid=2455399361&idx=1&sn=ed63070e65116e8addf939a4aed2d36c&chksm=fc11ea27cb6663310e524517e9aaecc97f99b099a4ebc7b56a18e0901b23fbcafc63ce3d5f29&scene=21#wechat_redirect

从隐式马尔科夫模型到地图匹配(下)

https://mp.weixin.qq.com/s/VY24VumqJI8N7yg62HAnvQ

假设我有三种类型的骰子:

  1. 正四面体的骰子,我们将其简称为 D4,可以随机投出 1,2,3,4 中的任意一个数字。

  2. 正六面体的骰子,也就是立方体的骰子,我们将其简称为 D6,可以随机投出 1,2,3,4,5,6 中的任意一个数字。

  3. 正八面体的骰子,我们将其简称为 D8,可以随机投出 1,2,3,4,5,6,7,8 中的任意一个数字。

由于骰子是均匀的,所以我们认为每次投出来每个数字的概率都是相等的。也就是说,D4 投出 1 到 4 中的每个数字的概率都是 1/4。D6 投出 1 到 6 中的每个数字的概率都是 1/6。D8 投出 1 到 8 中的每个数字的概率都是 1/8。

现在,我们要以一定的规则来投掷出一串数字,具体的规则如下:

  • 刚开始的时候,我随机选择任意一个骰子来投掷出一个数字,也就是说,每个骰子被选中的概率都是 1/3。

  • 以后的每一次投掷,我都以 1/2 的概率选择沿用上一次选择的骰子,或者分别以 1/4 的概率选择另外两个骰子。

那么,对应于这么一个场景,我们可以提出下面这三类问题:

  1. 已知我每次选用的骰子是哪一个,比如这个序列是 “D4-D6-D6-D8”,并且已知我投掷出的数字序列,比如是 “2-6-4-6”,那么我想知道,我投掷出这个序列的概率是多少?

  2. 已知我最终记录下来的数字序列,比如是 “2-6-4-6”,我想知道,投出这个序列的最大可能的骰子序列是哪一组?

  3. 问题可以更夸张一些,我不知道骰子是不是均匀的(意思就是,我不知道骰子投出每个数字的概率是多少),也不知道我每次投掷都是以什么样的概率去选择骰子的,但是我有很多组记录下来的数字序列,我想根据这些数字序列来反推出我所有不知道的概率值是多少?

上面的三个问题代表了隐式马尔科夫模型能解决的三大问题,每一类问题都有对应的算法。

为了规范后面的描述,我们先做一下术语定义:

  • 上面提到的骰子序列,我们称之为隐藏序列;

  • 上面提到的数字序列,我们称之为观测序列;

  • 上面提到的骰子的投掷概率,我们称之为观测概率;

  • 上面提到的骰子的选择概率,我们称之为转换概率;

  • 观测概率和转换概率我们将其称之为模型参数。

那么,上面提到的三类问题,可以抽象为:

  1. 已知隐藏序列和模型参数,求观测序列的概率。

  2. 已知观测序列和模型参数,求最大可能的隐藏序列。

  3. 已知大量的观测序列,确定模型参数。

现在,我们来确定下我们的地图匹配属于哪一类问题。很容易就能想到,我们的 GPS 轨迹就是我们实际的观测结果,而实际走过的路段,则类似于骰子一样,我选择了这条路段,然后我在这个路段上的 GPS 定位又有一定概率的观测误差。所以,轨迹就对应于我们说的观测序列,而要求解的实际走过的路段序列则对应于我们说的隐藏序列,我们要通过观测序列来求解隐藏序列,这就对应于我们上面说的第二类问题。而这一类问题的最常用求解方法就是维特比算法(Viterbi Algorithm)。

  • 初始化第一个观测点的所有可能状态(对应于骰子问题,状态就指选用哪个骰子)概率。

  • 从前往后遍历每一个状态,对于每一个状态,用以下方法计算当前观测点的所有可能状态的概率:

  1. 遍历当前观测可能对应的所有状态;

  2. 对每个状态,遍历所有上一状态,通过公式 P(当前状态) = P(上一状态) * P(上一状态转移到当前状态) * P(当前状态观测) 来计算当前状态的概率。

  • 当所有观测点都遍历完之后,查找概率值最大的那个状态,然后查找这个概率值对应的上一状态,就这样一路往回找,所找到的序列(倒序的)就是最大概率的隐藏序列。

实际中假设观测概率是均值为0的高斯分布,转移概率是负指数分布

作者:路生
链接:https://www.zhihu.com/question/20136144/answer/763021768
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

如下图,假如你从S和E之间找一条最短的路径,除了遍历完所有路径,还有什么更好的方法?

维特比算法解决的是栅栏图的最短路径问题,图的节点按列组织,每一列的节点只能和相邻的列的节点相连,不能跨列相连,节点之间有着不同的距离,距离的值就不在图上全部标注出来了,大家自行脑补。

答案:维特比算法。

过程非常简单:

为了找出S到E之间的最短路径,我们先从S开始从左到右一列一列地来看。

首先从S到A列的路径,有三种可能:S-A1、S-A2、S-A3,如下图:

我们不能武断的说S-A1、S-A2、S-A3中的哪一段肯定是最短路径中的一部分。

我们接下来在看B列,B列的B1、B2、B3一个个地来分析。

先看B1:

如上图,经过B1的路径有3条:

S-A1-B1

S-A2-B1

S-A3-B1

这三条路径中我们肯定可以知道其中哪一条是最短的,假如S-A3-B1是最短的,那么我们就得出了,经过B1的所有路径当中S-A3-B1是最短的,其它两条路径路径S-A1-B1和S-A2-B1可以删掉了。

接下来,我们继续看B2:

如上图,经过B2的路径有3条:

S-A1-B2

S-A2-B2

S-A3-B2

这三条路径中我们肯定可以知道其中哪一条是最短的,假如S-A1-B2是最短的,那么我们就得出了,经过B2的所有路径当中S-A1-B2是最短的,其它两条路径路径S-A2-B2和S-A3-B1可以删掉了。

接下来我们继续看B3:

如上图,经过B3的路径有3条:

S-A1-B3

S-A2-B3

S-A3-B3

这三条路径中我们肯定可以知道其中哪一条是最短的,假如S-A2-B3是最短的,那么我们就得出了,经过B3的所有路径当中S-A2-B3是最短的,其它两条路径路径S-A1-B3和S-A3-B3可以删掉了。

现在对于B列的所有节点我们都过了一遍,看看我们找到多少条最短路径:

上图是我们我们删掉了其它不可能是最短路径的情况,留下了三个可能的最短路径:S-A3-B1、S-A1-B2、S-A2-B3,现在我们汇总到下图:

S-A3-B1、S-A1-B2、S-A2-B3都有可能是全局的最短路径,我们不能武断地说哪一条一定是全局最短路径的一部分。

如果我们你认为没毛病就继续往下看C列,如果不理解,回头再看一遍。

讲到C列了,类似B列,我们从C1、C2、C3一个个节点分析。

经过C1节点的路径有:

S-A3-B1-C1、

S-A1-B2-C1、

S-A2-B3-C1

我们肯定能从这三条路径中找到最短的那条,例如:S-A3-B1-C1,其它两天就删掉好了。

同理,我们可以找到经过C2和C3节点的最短路径,汇总一下:

在C列也只剩3条备选的最短路径,我们仍然不能武断地断定哪条最短。

我们继续看E了。

到E也只有3种可能性:

我稍微对比一下这三条路径的总长度就能知道哪条是最短路径了

在效率方面相对于粗暴地遍历所有路径,维特比算法到达每一列的时候都会删除不符合最短路径要求的路径,大大降低时间复杂度。

一时兴起画的图,略显粗糙,将就看吧。

如果看的懂就去点赞吧!

发布了59 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u013385018/article/details/95239160