在R中使用HMM包

时间:2017-05-05 15:57:49

标签: r hidden-markov-models

我无法理解如何在HMM包中使用方法baumWelch

根据documentation,我们首先要初始化隐藏的马尔可夫模型

hmm = initHMM(c("A","B"), c("L","R"), transProbs=matrix(c(.8,.2,.2,.8),2),
              emissionProbs=matrix(c(.6,.4,.4,.6),2)

这意味着状态被命名为“A”,“B”排放被命名为“L”和“R”,我们也有传输和发射概率。

到目前为止一切顺利,但现在教程创建了观察列表:

observations = sample(c("L","R"),prob=c(.8,.2),size=100,replace=TRUE)

这是一维向量作为观察列表。根据Rabiner经典论文的描述,前向和后向概率是根据上述代码中的变量observations等一系列观察计算出来的。即我们需要一个这样的observations矩阵,以便远程训练任何东西。我怎么在这里做到这一点?

编辑:

在上面的例子中,排放量是“L”和“R”。应该用这些排放产生肥胖序列O.例如O = LRRRLLLRR等,假设长度为t

在前向算法中使用这种观察,其给出完整的马尔可夫模型,并且观察序列O将生成维度nxt的矩阵,其中n是我们的HMM中的状态的数量,这种矩阵的第i个元素被解释为“在时间j,生成观察序列的第一个j元素并处于状态i”。

现在前进和后退以及Baum-Welch训练算法中使用的其他几种算法。

我认为Baum-Welch的输入应该是一个观察序列列表而不是排放列表。在我的版本中,矩阵输入的维数应为t乘以m,其中t是观测序列的长度,m是此类序列的数量。

我如何理解这里的输入?我们有一百个长度为1的观测序列吗?如何在HMM中为baumWelch方法提供这样的矩阵

2 个答案:

答案 0 :(得分:1)

据我了解, HMM 包中的internal JsonObject ToJson() { JsonObject root = new JsonObject(); root.Add(JSON_ID, JsonValue.CreateStringValue(Id)); root.Add(JSON_DELETED, JsonValue.CreateBooleanValue(Deleted)); root.Add(JSON_PHOTO, Photo != null ? Photo.ToJson() : null); root.Add(JSON_PREFIX, JsonValue.CreateStringValue(Prefix)); root.Add(JSON_GIVENNAME, JsonValue.CreateStringValue(GivenName)); root.Add(JSON_MIDDLENAMES, JsonValue.CreateStringValue(MiddleNames)); root.Add(JSON_FAMILYNAME, JsonValue.CreateStringValue(FamilyName)); root.Add(JSON_SUFFIX, JsonValue.CreateStringValue(Suffix)); root.Add(JSON_NOTES, JsonValue.CreateStringValue(Notes)); return root; } 函数仅接受单个观察序列作为其次要参数。如果您的训练数据包含多个序列,您可以尝试使用 aphid 包,它支持包含多序列表的Baum Welch和Viterbi模型训练。免责声明:我撰写了一揽子计划,部分原因是因为我遇到了同样的问题。

答案 1 :(得分:0)

虽然前一段时间被问过,但当我被同样的事情困惑时,我发现了这个问题。

An Intoduction to Hidden Markov Models and Bayesian Networks第7页引用Ghahramani:

"如果观测向量包含贝叶斯网络中的所有变量而不是对数似然函数中的每个项,则进一步将因子视为..." see equation here

基本上从我的理解,因为网络中的每个节点仅依赖于它的父母,你不需要将训练向量分离成矩阵,而是可以使用一个完整的训练向量。我想唯一的问题是在新的训练向量的开头,但你可以通过创建一个特殊的开始状态来克服这个问题" *"这始终是新序列中的第一个状态。