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
假设我有三种类型的骰子:
正四面体的骰子,我们将其简称为 D4,可以随机投出 1,2,3,4 中的任意一个数字。
正六面体的骰子,也就是立方体的骰子,我们将其简称为 D6,可以随机投出 1,2,3,4,5,6 中的任意一个数字。
正八面体的骰子,我们将其简称为 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 的概率选择另外两个骰子。
那么,对应于这么一个场景,我们可以提出下面这三类问题:
已知我每次选用的骰子是哪一个,比如这个序列是 “D4-D6-D6-D8”,并且已知我投掷出的数字序列,比如是 “2-6-4-6”,那么我想知道,我投掷出这个序列的概率是多少?
已知我最终记录下来的数字序列,比如是 “2-6-4-6”,我想知道,投出这个序列的最大可能的骰子序列是哪一组?
问题可以更夸张一些,我不知道骰子是不是均匀的(意思就是,我不知道骰子投出每个数字的概率是多少),也不知道我每次投掷都是以什么样的概率去选择骰子的,但是我有很多组记录下来的数字序列,我想根据这些数字序列来反推出我所有不知道的概率值是多少?
上面的三个问题代表了隐式马尔科夫模型能解决的三大问题,每一类问题都有对应的算法。
为了规范后面的描述,我们先做一下术语定义:
上面提到的骰子序列,我们称之为隐藏序列;
上面提到的数字序列,我们称之为观测序列;
上面提到的骰子的投掷概率,我们称之为观测概率;
上面提到的骰子的选择概率,我们称之为转换概率;
观测概率和转换概率我们将其称之为模型参数。
那么,上面提到的三类问题,可以抽象为:
已知隐藏序列和模型参数,求观测序列的概率。
已知观测序列和模型参数,求最大可能的隐藏序列。
已知大量的观测序列,确定模型参数。
现在,我们来确定下我们的地图匹配属于哪一类问题。很容易就能想到,我们的 GPS 轨迹就是我们实际的观测结果,而实际走过的路段,则类似于骰子一样,我选择了这条路段,然后我在这个路段上的 GPS 定位又有一定概率的观测误差。所以,轨迹就对应于我们说的观测序列,而要求解的实际走过的路段序列则对应于我们说的隐藏序列,我们要通过观测序列来求解隐藏序列,这就对应于我们上面说的第二类问题。而这一类问题的最常用求解方法就是维特比算法(Viterbi Algorithm)。
初始化第一个观测点的所有可能状态(对应于骰子问题,状态就指选用哪个骰子)概率。
从前往后遍历每一个状态,对于每一个状态,用以下方法计算当前观测点的所有可能状态的概率:
遍历当前观测可能对应的所有状态;
对每个状态,遍历所有上一状态,通过公式 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种可能性:
我稍微对比一下这三条路径的总长度就能知道哪条是最短路径了
在效率方面相对于粗暴地遍历所有路径,维特比算法到达每一列的时候都会删除不符合最短路径要求的路径,大大降低时间复杂度。
一时兴起画的图,略显粗糙,将就看吧。
如果看的懂就去点赞吧!