R语言机器学习与临床预测模型47--隐马尔可夫模型

本内容为【科研私家菜】R语言机器学习与临床预测模型系列课程

你想要的R语言学习资料都在这里, 快来收藏关注【科研私家菜】


01 隐马尔可夫模型

HMM(Hidden Markov Model), 也称隐性马尔可夫模型,是一个概率模型,用来描述一个系统隐性状态的转移和隐性状态的表现概率。
既是马尔可夫模型,就一定存在马尔可夫链,该马尔可夫链服从马尔可夫性质:即无记忆性。也就是说,这一时刻的状态,受且只受前一时刻的影响,而不受更往前时刻的状态的影响。



系统的隐性状态指的就是一些外界不便观察(或观察不到)的状态,
比如在当前的例子里面, 系统的状态指的是大叔使用骰子的状态,即{正常骰子, 作弊骰子1, 作弊骰子2,...}隐性状态的表现也就是,
可以观察到的,由隐性状态产生的外在表现特点。这里就是说, 骰子掷出的点数. {1,2,3,4,5,6}HMM模型将会描述,系统隐性状态的转移概率。也就是大叔切换骰子的概率,下图是一个例子,这时候大叔切换骰子的可能性被描述得淋漓尽致。


02 隐马尔可夫模型的解释

最经典的例子,掷骰子。假设我手里有三个不同的骰子。第一个骰子是我们平常见的骰子(称这个骰子为D6),6个面,每个面(1,2,3,4,5,6)出现的概率是1/6。第二个骰子是个四面体(称这个骰子为D4),每个面(1,2,3,4)出现的概率是1/4。第三个骰子有八个面(称这个骰子为D8),每个面(1,2,3,4,5,6,7,8)出现的概率是1/8。


假设我们开始掷骰子,我们先从三个骰子里挑一个,挑到每一个骰子的概率都是1/3。然后我们掷骰子,得到一个数字,1,2,3,4,5,6,7,8中的一个。不停的重复上述过程,我们会得到一串数字,每个数字都是1,2,3,4,5,6,7,8中的一个。例如我们可能得到这么一串数字(掷骰子10次):1 6 3 5 2 7 3 5 2 4这串数字叫做可见状态链。但是在隐马尔可夫模型中,我们不仅仅有这么一串可见状态链,还有一串隐含状态链。在这个例子里,这串隐含状态链就是你用的骰子的序列。比如,隐含状态链有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8一般来说,HMM中说到的马尔可夫链其实是指隐含状态链,因为隐含状态(骰子)之间存在转换概率(transition probability)。在我们这个例子里,D6的下一个状态是D4,D6,D8的概率都是1/3。D4,D8的下一个状态是D4,D6,D8的转换概率也都一样是1/3。这样设定是为了最开始容易说清楚,但是我们其实是可以随意设定转换概率的。比如,我们可以这样定义,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1。
这样就是一个新的HMM。同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability)。就我们的例子来说,六面骰(D6)产生1的输出概率是1/6。产生2,3,4,5,6的概率也都是1/6。我们同样可以对输出概率进行其他定义。比如,我有一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。


03 隐马尔科夫模型R语言实现

## 隐马尔可夫模型的简单应用
## 状态序列:隐藏马尔科夫链随机生成的状态序列,称为i状态序列
## 观测序列:每个状态生成一个观测,由此产生的观测是随机的序列,称为观测序列

## 隐马尔科夫模型由,初始概率分布、状态转移概率分布以及观测概率分布确定

## 问题:我们有三个盒子,每个盒子都放有红球和白球
## 问题来自《统计学习方法》


## HMM - Hidden Markov Models
library(HMM)
## 所有可能状态集合
state <- c("1","2","3")

## 所有可能观测集合
Symbols <- c("红","白")

## 初始概率分布:第一次抽取到相应盒子的概率
startprob <- c(0.2,0.4,0.4)

## 状态转移概率矩阵
transpro <- matrix(c(0.5, 0.3, 0.2, 0.2, 0.5, 0.3,0.3,0.2,0.5),nrow = 3)
transpro
##      [,1] [,2] [,3]
## [1,]  0.5  0.2  0.3
## [2,]  0.3  0.5  0.2
## [3,]  0.2  0.3  0.5
## 观测概率分布:每个盒子里不同颜色球的概率
emisspr <- matrix(c(0.5,0.4,0.7,0.5,0.6,0.3),nrow = 3)
emisspr
##      [,1] [,2]
## [1,]  0.5  0.5
## [2,]  0.4  0.6
## [3,]  0.7  0.3
## 初始化隐马尔科夫模型
hmm <- initHMM(States = state,Symbols = Symbols,startProbs = startprob,transProbs = transpro,
        emissionProbs = emisspr)

## 的到的一个观测
ober <- c("红","白","红","红")

## 1:概率计算问题
## 使用向前算法的到相应观测的概率
## 包含向前概率的矩阵。第一个维度指的是状态和第二维度的时间。
exp(forward(hmm, ober))
##       index
## states    1      2        3          4
##      1 0.10 0.0770 0.041870 0.02107790
##      2 0.16 0.1104 0.035512 0.01679232
##      3 0.28 0.0606 0.052836 0.03225698
## 状态求和,得到每次个时间为该序列的概率
colSums(exp(forward(hmm, ober)))
##         1         2         3         4 
## 0.5400000 0.2480000 0.1302180 0.0701272
## 使用向后算法的到相应观测的概率
## 包含向后概率的矩阵。第一个维度指的是状态和第二维度的时间。
exp(backward(hmm, ober))
##       index
## states        1      2    3 4
##      1 0.132638 0.2939 0.54 1
##      2 0.140463 0.2588 0.49 1
##      3 0.122819 0.3123 0.57 1
colSums(exp(backward(hmm, ober)))
##       1       2       3       4 
## 0.39592 0.86500 1.60000 3.00000
## 预测问题:给定观测序列,求最有可能的对应的状态序列
## 维特比算法求解
## 输出:一个字符串向量,包含最可能的状态路径。
viterbi(hmm,ober)
## [1] "3" "3" "3" "3"
## 此函数计算在一个给定的序列的观测和给定的Hidden Markov模型在时间k在状态x的后验概率。
posterior(hmm,ober)
##       index
## states         1         2         3         4
##      1 0.1891392 0.3227036 0.3224113 0.3005667
##      2 0.3204759 0.4074242 0.2481331 0.2394552
##      3 0.4903849 0.2698722 0.4294556 0.4599782
## 从结果可以得出,最有可能的状态序列为:3,2,3,3
colSums(posterior(hmm,ober))
## 1 2 3 4 
## 1 1 1 1
## 给定一个隐马尔科夫模型的模拟
simHMM(hmm,4)
## $states
## [1] "3" "2" "2" "1"
## 
## $observation
## [1] "红" "白" "白" "红"
## 学习问题:已知观测序列,学习模型的参数
hmm <- initHMM(States = state,Symbols = Symbols,startProbs = startprob,
               transProbs = transpro,emissionProbs = emisspr)
hmm
## $States
## [1] "1" "2" "3"
## 
## $Symbols
## [1] "红" "白"
## 
## $startProbs
##   1   2   3 
## 0.2 0.4 0.4 
## 
## $transProbs
##     to
## from   1   2   3
##    1 0.5 0.2 0.3
##    2 0.3 0.5 0.2
##    3 0.2 0.3 0.5
## 
## $emissionProbs
##       symbols
## states  红  白
##      1 0.5 0.5
##      2 0.4 0.6
##      3 0.7 0.3
ober <- c(sample(c(rep("红",100),rep("白",200))),
          sample(c(rep("白",300),rep("红",100))))
bw <- baumWelch(hmm,observation = ober)

bw$hmm
## $States
## [1] "1" "2" "3"
## 
## $Symbols
## [1] "红" "白"
## 
## $startProbs
##   1   2   3 
## 0.2 0.4 0.4 
## 
## $transProbs
##     to
## from         1         2         3
##    1 0.5162805 0.2293114 0.2544081
##    2 0.2987254 0.5283639 0.1729107
##    3 0.2226074 0.4078684 0.3695243
## 
## $emissionProbs
##       symbols
## states        红        白
##      1 0.2942211 0.7057789
##      2 0.2399061 0.7600939
##      3 0.3448797 0.6551203
## 连续迭代的差异
bw$difference
##   [1] 0.711033336 0.006630626 0.006323676 0.006074176 0.005842350
##   [6] 0.005626430 0.005424877 0.005236343 0.005059639 0.004893716
##  [11] 0.004737642 0.004590589 0.004451817 0.004320666 0.004196539
##  [16] 0.004078903 0.003967275 0.003861218 0.003760336 0.003664268
##  [21] 0.003572688 0.003485297 0.003401820 0.003322007 0.003245628
##  [26] 0.003172473 0.003102346 0.003035068 0.002970474 0.002908409
##  [31] 0.002848733 0.002791312 0.002736026 0.002682760 0.002631408
##  [36] 0.002581872 0.002534060 0.002487884 0.002443265 0.002400128
##  [41] 0.002358401 0.002318018 0.002278918 0.002241040 0.002204332
##  [46] 0.002168739 0.002134215 0.002100712 0.002068187 0.002036598
##  [51] 0.002005908 0.001976079 0.001947077 0.001918868 0.001891421
##  [56] 0.001864706 0.001838696 0.001813363 0.001788683 0.001764630
##  [61] 0.001741182 0.001718317 0.001696014 0.001674253 0.001653014
##  [66] 0.001632281 0.001612035 0.001592261 0.001572941 0.001554062
##  [71] 0.001535608 0.001517565 0.001499921 0.001482663 0.001465778
##  [76] 0.001449255 0.001433083 0.001417251 0.001401748 0.001386564
##  [81] 0.001371691 0.001357119 0.001342838 0.001328841 0.001315120
##  [86] 0.001301666 0.001288472 0.001275531 0.001262836 0.001250379
##  [91] 0.001238155 0.001226157 0.001214379 0.001202815 0.001191460
##  [96] 0.001180307 0.001169353 0.001158591 0.001148016 0.001137625

参考资料

https://www.zhihu.com/question/20962240

关注R小盐,关注科研私家菜(VX_GZH: SciPrivate),有问题请联系R小盐。让我们一起来学习 R语言机器学习与临床预测模型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容