关于数据挖掘:R语言中的隐马尔可夫HMM模型实例附代码数据

5次阅读

共计 4445 个字符,预计需要花费 12 分钟才能阅读完成。

原文链接:http://tecdat.cn/?p=17592

最近咱们被客户要求撰写对于隐马尔可夫 HMM 模型的钻研报告,包含一些图形和统计输入。

最近,咱们应用隐马尔可夫模型开发了一种解决方案,并被要求解释这个计划

HMM 用于建模数据序列,无论是从间断概率分布还是从离散概率分布得出的。它们与状态空间和高斯混合模型相干,因为它们旨在预计引起观测的状态。状态是未知或“暗藏”的,并且 HMM 试图预计状态,相似于无监督聚类过程。

例子

在介绍 HMM 背地的根本实践之前,这里有一个示例,它将帮忙您了解外围概念。有两个骰子和一罐软糖。B 掷骰子,如果总数大于 4,他会拿几颗软糖再掷一次。如果总数等于 2,则他拿几把软糖,而后将骰子交给 A。当初该轮到 A 掷骰子了。如果她的掷骰大于 4,她会吃一些软糖,然而她不喜爱彩色的其余色彩(两极分化的认识),因而咱们心愿 B 会比 A 多。他们这样做直到罐子空了。

当初假如 A 和 B 在不同的房间里,咱们看不到谁在掷骰子。取而代之的是,咱们只晓得起初吃了多少软糖。咱们不晓得色彩,仅是从罐子中取出的软糖的最终数量。咱们怎么晓得谁掷骰子?HMM。

在此示例中,状态是掷骰子的人,A 或 B。察看后果是该回合中吃了多少软糖。如果该值小于 4,骰子的掷骰和通过骰子的条件就是转移概率。因为咱们组成了这个示例,咱们能够精确地计算出转移概率,即 1 /12。没有条件说转移概率必须雷同,例如 A 掷骰子 2 时能够将骰子移交给他,例如,概率为 1 /36。

模仿

首先,咱们将模仿该示例。B 均匀要吃 12 颗软糖,而 A 则须要 4 颗。

# 设置
simulate <- function(N, dice.val = 6, jbns, switch.val = 4){

  #模仿变量
    #能够只应用一个骰子样本
    #不同的机制,例如只丢 1 个骰子,或任何其余概率分布
  
    b<- sample(1:dice.val, N, replace = T) + sample(1:dice.val, N, replace = T)
    a <- sample(1:dice.val, N, replace = T) + sample(1:dice.val, N, replace = T)
    bob.jbns <- rpois(N, jbns[1])
    alice.jbns <- rpois(N, jbns[2])

    # 状态 
    draws <- data.frame(state = rep(NA, N), obs = rep(NA, N), 





    # 返回后果
    return(cbind(roll = 1:N, draws))


# 模仿场景


draws <- simulate(N, jbns = c(12, 4), switch.val = 4)

# 察看后果

ggplot(draws, aes(x = roll, y = obs)) + geom_line()

如您所见,仅查看一系列计数来确定谁掷骰子是艰难的。咱们将拟合 HMM。因为咱们正在解决计数数据,因而察看值是从泊松散布中得出的。

fit.hmm <- function(draws){

  # HMM 
  mod <- fit(obs ~ 1, data = draws, nstates = 2, family = poisson()



  # 通过预计后验来预测状态
  est.states <- posterior(fit.mod)
  head(est.states)

  # 后果
 
  hmm.post.df <- melt(est.states, measure.vars = 


  # 输入表格
  print(table(draws[,c("state", "est.state.labels")]))

<!—->

## iteration 0 logLik: -346.2084 
## iteration 5 logLik: -274.2033 
## converged at iteration 7 with logLik: -274.2033 
##        est.state.labels
## state   alice bob
##   a     49   2
##   b      3  46

模型迅速收敛。应用后验概率,咱们预计过程处于哪个状态,即谁领有骰子,A 或 B。要具体答复该问题,咱们须要更多地理解该过程。在这种状况下,咱们晓得 A 只喜爱黑软糖。否则,咱们只能说该过程处于状态 1 或 2。下图显示了 HMM 很好地拟合了数据并预计了暗藏状态。

# 绘图输入


    g0 <- (ggplot(model.output$draws, aes(x = roll, y = obs)) + geom_line() +
        theme(axis.ticks = element_blank(), axis.title.y = element_blank())) %>% ggplotGrob
    g1 <- (ggplot(model.output$draws, aes(x = roll, y = state, fill = state, col = state)) + 
      


    g0$widths <- g1$widths
    return(grid.arrange(g0, g1


plot.hmm.output(hmm1)

令人印象粗浅的是,该模型拟合数据和滤除噪声以预计状态的良好水平。偏心地说,能够通过疏忽工夫重量并应用 EM 算法来预计状态。然而,因为咱们晓得数据造成一个序列,因为察看下一次产生的概率取决于前一个即 \(P(X\_t | X\_ {t-1})\),其中 \(X\_t \)是软糖的数量。


点击题目查阅往期内容

隐马尔可夫模型 (HMM) 辨认一直变动的股市情况股票指数预测实战

左右滑动查看更多

01

02

03

04

思考到咱们结构的问题,这可能是一个绝对简略的案例。如果转移概率大得多怎么办?

 simulate(100, jbns = c(12, 4), switch.val = 7)

<!—->

## iteration 0 logLik: -354.2707 
## iteration 5 logLik: -282.4679 
## iteration 10 logLik: -282.3879 
## iteration 15 logLik: -282.3764 
## iteration 20 logLik: -282.3748 
## iteration 25 logLik: -282.3745 
## converged at iteration 30 with logLik: -282.3745 
##        est.state.labels
## state   alice bob
##   alice    54   2
##   bob       5  39

<!—->

plot(hmm2)

这有很多乐音数据,然而 HMM 依然做得很好。性能的进步局部归因于咱们对从罐中取出的软糖数量的抉择。散布越显著,模型就越容易拾取转移。偏心地讲,咱们能够计算中位数,并将所有低于中位数的值都归为一个状态,而将所有高于中位数的值归为另一状态,您能够从后果中看到它们做得很好。这是因为转移概率十分高,并且预计咱们会从每个状态察看到类似数量的察看后果。当转移概率不同时,咱们会看到 HMM 体现更好。

如果察看后果来自雷同的散布,即 A 和 B 吃了雷同数量的软糖怎么办?

hmm3 <- fit.hmm(draws)
plot(hmm3)

不太好,但这是能够预期的。如果从中得出察看后果的散布之间没有差别,则可能也只有 1 个状态。

理论如何估算状态?

首先,状态数量及其散布形式实质上是未知的。利用对系统建模的常识,用户能够抉择正当数量的状态。在咱们的示例中,咱们晓得有两种状态使事件变得容易。可能晓得确切的状态数,但这并不常见。再次通过零碎常识来假如察看后果通常是正当的,这通常是正当的。

从这里开始,应用 Baum-Welch 算法 来预计参数,这是 EM 算法的一种变体,它利用了观测序列和 Markov 属性。除了预计状态的参数外,还须要预计转移概率。Baum-Welch 算法首先对数据进行正向传递,而后进行反向传递。而后更新状态转移概率。而后反复此过程,直到收敛为止。

在事实世界

在事实世界中,HMM 通常用于

  • 股票市场预测,无论市场处于牛市还是熊市
  • 预计 NLP 中的词性
  • 生物测序
  • 序列分类

仅举几例。只有有察看序列,就能够应用 HMM,这对于离散状况也实用。

点击文末 “浏览原文”

获取全文残缺材料。

本文选自《 R 语言中的隐马尔可夫 HMM 模型实例》。

点击题目查阅往期内容

python 中应用马尔可夫决策过程 (MDP) 动静编程来解决最短门路强化学习问题 \
隐马尔可夫模型 (HMM) 辨认一直变动的股市情况股票指数预测实战 \
马尔可夫 Markov 区制转移模型剖析基金利率 \
马尔可夫区制转移模型 Markov regime switching\
时变马尔可夫区制转换 MRS 自回归模型剖析经济工夫序列 \
马尔可夫转换模型钻研交通伤亡人数事变工夫序列预测 \
如何实现马尔可夫链蒙特卡罗 MCMC 模型、Metropolis 算法?\
Matlab 用 BUGS 马尔可夫区制转换 Markov switching 随机稳定率模型、序列蒙特卡罗 SMC、M H 采样剖析工夫序列 \
R 语言 BUGS 序列蒙特卡罗 SMC、马尔可夫转换随机稳定率 SV 模型、粒子滤波、Metropolis Hasting 采样工夫序列剖析 \
matlab 用马尔可夫链蒙特卡罗 (MCMC) 的 Logistic 逻辑回归模型剖析汽车试验数据 \
stata 马尔可夫 Markov 区制转移模型剖析基金利率 \
PYTHON 用时变马尔可夫区制转换(MRS)自回归模型剖析经济工夫序列 \
R 语言应用马尔可夫链对营销中的渠道归因建模 \
matlab 实现 MCMC 的马尔可夫转换 ARMA – GARCH 模型预计 \
R 语言隐马尔可夫模型 HMM 辨认一直变动的股票市场条件 \
R 语言中的隐马尔可夫 HMM 模型实例 \
用机器学习辨认一直变动的股市情况—隐马尔科夫模型 (HMM)\
Matlab 马尔可夫链蒙特卡罗法(MCMC)预计随机稳定率(SV,Stochastic Volatility)模型 \
MATLAB 中的马尔可夫区制转移(Markov regime switching) 模型 \
Matlab 马尔可夫区制转换动静回归模型预计 GDP 增长率 \
R 语言马尔可夫区制转移模型 Markov regime switching\
stata 马尔可夫 Markov 区制转移模型剖析基金利率 \
R 语言如何做马尔可夫转换模型 markov switching model\
R 语言隐马尔可夫模型 HMM 辨认股市变动剖析报告 \
R 语言中实现马尔可夫链蒙特卡罗 MCMC 模型

正文完
 0