使用隐马尔可夫模型预测观察

机器算法验证 机器学习 预言 隐马尔可夫模型
2022-03-22 14:06:33

我有一系列观察结果,例如["Click", "Scroll", "Hover", "Zoom", "Select"]我需要预测这个观察序列的下一个值,而不是下一个隐藏状态。

我知道 HMM 存在三个基本问题:

  • a)给定模型参数和观察数据,我们可以估计隐藏状态的最佳序列。
  • b) 给定模型参数和观测数据,我们可以计算数据的可能性。
  • c) 仅给定观察数据,我们可以估计模型参数。

因此,对于我的问题的解决方案:

  • 我通过参考 b) 认为,如果我制作条件数据序列,每个数据序列都以可能代表下一次观察的一个可能值结束,并计算给定模型的每个数据的可能性,那么这可以被认为是预言?

更具体地说,在我的示例中(如果我知道可能的观察结果只能是 Click/Scroll/Hover/Zoom/Select)我将模拟以下序列

["Click", "Scroll", "Hover", "Zoom", "Select", "Scroll"] 
                                               
["Click", "Scroll", "Hover", "Zoom", "Select", "Click"]
                                               
["Click", "Scroll", "Hover", "Zoom", "Select", "Select"]
                                               
["Click", "Scroll", "Hover", "Zoom", "Select", "Hover"]
                                               
["Click", "Scroll", "Hover", "Zoom", "Select", "Zoom"] 

并且给出更高概率的序列是“预测的”,所以最终我也有预测的下一个观察,这将是给出更高可能性的序列的最后一次观察。这个对吗?

  • 在此链接中提到的另一种方法是根据 a) 预测最可能的隐藏状态序列,然后通过最后一个隐藏状态的发射分布来计算该分布的平均值?上面的链接从未经过验证,我想知道是否有人可以验证它。

  • 另一种方法是获得所有状态的可能性总和,每个状态乘以状态分布的平均值。这是对的吗?

提前感谢您可以给我的任何反馈。

2个回答

从你的问题中,我理解(希望是正确的)你想要估计下一个观察,考虑到现在的观察。y1:N=Y你到目前为止看到的 N 个观察结果,让Θ是 HMM 的参数。然后你想在给定已经观察到的数据的情况下推断下一次观察的概率,可以表示为:

P(yN+1|y1:N=Y,Θ)

如果这是你想要的,上面的条件表达式等于:

P(yN+1|y1:N=Y,Θ)=P(y1:N=Y,yN+1|Θ)P(y1:N=Y|Θ)

请注意,分母独立于yN+1. 所以,它是:

P(yN+1|y1:N=Y,Θ)P(y1:N=Y,yN+1|Θ)

蛮力方法如下:

对于您可能的每一个观察结果,yN+1=Click,yN+1=Scroll等,计算序列的可能性y1:N+1. 所以你需要计算的是P(yN+1=Click,y1:N=Y|Θ),P(yN+1=Scroll,y1:N=Y|Θ),等等。对于每个可能的观察序列。然后yN+1这给出了最大似然可以估计为下一次观察的最佳猜测。请注意,这些似然计算中的每一个都是前向传递算法的直接应用,它对应于 HMM 的三个问题之一: 观察序列的似然计算。您在问题中已在 b) 中说明了这一点。

希望这可以帮助。

您可以通过 2 种方式解决此问题。

  • 您可以为 HMM 模型设置新的观察结果并运行前向概率。一旦有了,您应该关注概率的最后一列,因为前向算法有效地将每个序列中每个观察值的所有可能路径的所有概率求和。最终结果是最终观察列中的对数似然值表示通过 HMM 的所有可能路径的似然性。一旦找到最可能的状态,则只需从发射矩阵中找到新的观察值。对于第二次观察,您应该查看下一个状态的转换矩阵,一旦您对下一个状态进行采样,您应该从发射矩阵计算第二次观察......

  • 第二个选项是从前向概率中的所有可能观察中找到新观察的最大可能性正如您所提到的,您需要运行所有观察结果,并且与第一种方法相同,您只需要计算最后一列的可能性。(我已经提到了原因)。一旦找到最大可能的观察值,您就可以设置它并计算第二个观察值以同样的方式。

对于 seqHMM 包

第一个选项

model$transition_probs[,apply(fb$forward_probs[, , 1], 2, which.max)[column_number]]

第二个选项

fb_<-forward_backward(model_,forward_only = TRUE)
fb_<-data.frame(fb_$forward_probs)
last_probs<-fb_[,ncol(fb_)]
print(logSumExp(last_probs))