HMM+viterbi学习
HMM
截图里的例子是有红蓝黑3个桶(即状态),桶里有黑白2类球(即输出)。图里画了3行,表示3个不同时刻下从桶里取球的操作,蓝色线表示上个时刻选了某个桶时,当前时刻选取某个桶的概率(即状态转移的概率),例如时刻1选了红桶,时刻2选取蓝桶的概率是0.2。方框里的2个数字表示选择黑白球的概率,例如时刻1蓝桶里选择黑球概率是0.4,选择白球概率是0.6。将上图中的状态转移概率用矩阵表示出来如下。j
状态转移矩阵中行和列表示状态之间切换的概率,例如第一行表示红桶切换到红桶、蓝桶、黑桶的概率分别是0.5、0.2、0.3。
输出概率矩阵中行表示状态(不同颜色桶),列表示输出的结果(黑白球),例如第2行表示蓝桶输出黑白球的概率分别是0.4和0.6。
输出向量表示每个时刻输出黑白球的情况,例如0表示黑球1表示白球。
状态向量表示每个时刻处于的状态(即选择的哪个颜色的桶),例如2表示黑桶,1表示蓝桶。
若已知输出向量和状态向量,则可以计算出来状态转移矩阵和输出概率矩阵。假设有1k条输出向量和状态向量,则可计算出状态转移总次数和各个状态之间相互转移的次数,从而计算出状态转移矩阵。
viterbi
viterbi要解决的问题是已知输出向量out、状态转移矩阵A和输出概率矩阵B,求状态向量。
定义辅助矩阵xi和phi,其中xi的维度为(输出向量长度,状态个数),矩阵元素(i,j)表示时刻i下由j桶输出out[i]的概率。矩阵phi的维度与xi一样,记录的是最有可能的状态转移路径,矩阵元素(i,j)表示时刻i的j桶最有可能是时刻i-1的哪个桶转移过来的。
xi矩阵的第0行计算如下。
构造辅助函数,计算时刻t+1的状态a,最可能是由时刻t的哪个状态转移而来。
以此类推计算出时刻1和2的xi和phi矩阵。
利用xi矩阵最后一行以及phi矩阵就可以回溯出整个状态向量。
参考文献:
【1】纯python实现机器学习算法,非套用sk-learn,隐马尔可夫篇,维特比算法篇,HMM,viterbi,中文分词,统计学习方法,机器学习_哔哩哔哩_bilibili