隱馬爾可夫模型(HMM)及Viterbi算法

HMM簡介

  對于算法愛好者來說,隱馬爾可夫模型的大名那是如雷貫耳。那么,這個模型到底長什么樣?具體的原理又是什么呢?有什么具體的應用場景呢?本文將會解答這些疑惑。
  本文將通過具體形象的例子來引入該模型,并深入探究隱馬爾可夫模型及Viterbi算法,希望能對大家有所啟發。
  隱馬爾可夫模型(HMM,hidden Markov model)是可用于標注問題的統計學模型,描述由隱藏的馬爾可夫鏈隨機生成觀測序列的過程,屬于生成模型。HMM模型在實際的生活和生產中有著廣泛的應用,包括語音識別,自然語言處理,生物信息,模式識別等領域。

?

引入

  某天,你的女神告訴你說,她放假三天,將要去上海游玩,準備去歡樂谷、迪士尼和外灘(不一定三個都會去)。
  她呢,會選擇在這三個地方中的某幾個逗留并決定是否購物,而且每天只待在一個地方。根據你對她的了解,知道她去哪個地方,僅取決于她去的上一個地方,且是否購物的概率僅取決于她去的地方。已知她去的三個地方的轉移概率表如下:

?

稍微對這個表格做些說明,比如第一行,前一天去了歡樂谷后,第二天還待在歡樂谷的概率為0.8,去迪士尼的概率為0.05,去外灘的概率為0.15。
??她在每個地方的購物概率為:

?

地點購物概率
歡樂谷0.1
迪士尼0.8
外灘0.3

在出發的時候,她跟你說去每個地方的可能性相同。后來,放假回來后,你看了她的朋友圈,發現她的購物情況如下:第一天不購物,第二三天都購物了。于是,你很好奇,她這三天都去了哪些地方。
??怎么樣,聰明的你能求解出來嗎?

HMM的模型參數

  接下來,我們將會介紹隱馬爾可夫模型(HMM)。
??隱馬爾可夫模型是關于時序的概率模型,描述由一個隱藏的馬爾可夫鏈隨機生成不可觀測的狀態隨機序列,再由各個狀態生成一個觀測而產生觀測隨機序列的過程。隱藏的馬爾可夫鏈隨機生成的狀態的序列,稱為狀態序列;每個狀態生成一個觀測,而由此產生的觀測的隨機序列,稱為觀測序列。序列的每一個位置又可以看作是一個時刻。
??隱馬爾可夫模型由初始概率分布、狀態轉移概率分布以及觀測概率分布確定。隱馬爾可夫模型的形式定義如下:
??設Q是所有可能的狀態的集合,V是所有可能的觀測的集合,也就是說,Q是不可見的,而V是可見的,是我們觀測到的可能結果。

? ? ? ? ? ? ? ? ? ? ? ?

其中,N是可能的狀態數,M是可能的觀測數。
??在剛才的例子中,Q是不可見的狀態集合,應為640?wx_fmt=png,而V是可以觀測的集合,應為V={購物,不購物}。
??I是長度為T的狀態序列,O是對應的觀測序列

在剛才的例子中,I這個序列是我們需要求解的,即女生去了哪些地方,而O是你知道的序列,O={不購物,購物,購物}。
??A是狀態轉移概率矩陣

640?wx_fmt=png其中,

640?wx_fmt=png

是在時刻t處于狀態q_i的條件下在時刻t+1轉移到狀態q_j的概率。在剛才的例子中,轉移概率矩陣為:

?

?

?

?

?

B是觀測概率矩陣:

640?wx_fmt=png

其中,

640?wx_fmt=png

是在時刻t處于狀態q_j的條件下生成觀測v_k的概率。在剛才的例子中:

?

640?wx_fmt=png初始狀態概率向量640?wx_fmt=png,其中640?wx_fmt=png是時刻t=1處于狀態q_j的概率。在剛才的例子中,?640?wx_fmt=png

綜上,我們已經講完HMM中的基本概念。同時,我們可以知道,隱馬爾可夫模型由初始狀態概率向量640?wx_fmt=png,狀態轉移概率矩陣A,和觀測概率矩陣B決定640?wx_fmt=png和A決定狀態序列,B決定觀測序列。因此,隱馬爾可夫模型640?wx_fmt=png可用三元符號表示,即

640?wx_fmt=png

640?wx_fmt=png稱為HMM的三要素。

當然,隱馬爾可夫模型之所以被稱為馬爾可夫模型,是因為它使用了兩個基本的假設,其中之一為馬爾可夫假設。它們分別是:

  1. 齊次馬爾科夫假設,即假設隱藏的馬爾可夫鏈在任意時刻t的狀態只依賴于其前一時刻的狀態,與其他時刻的狀態及觀測無關,也與時刻t無關。

640?wx_fmt=png

  1. 觀測獨立性假設,即假設任意時刻的觀測只依賴于該時刻的馬爾可夫鏈的狀態,與其他觀測及狀態無關。

640?wx_fmt=png

??在剛才的假設中,我們對應的兩個假設分別為:她去哪個地方,僅取決于她去的上一個地方;是否購物的概率僅取決于她去的地方。前一個條件為齊次馬爾科夫假設,后一個條件為觀測獨立性假設。
??以上,我們就介紹了HMM的基本概念及假設。而HMM的三個基本問題如下:

1. 概率計算問題。給定模型640?wx_fmt=png和觀測序列640?wx_fmt=png,計算在模型640?wx_fmt=png下觀測序列O出現的概率640?wx_fmt=png.

2. 學習問題。已知觀測序列640?wx_fmt=png,估計模型640?wx_fmt=png參數,使得在該模型下觀測序列概率640?wx_fmt=png最大。

3. 預測問題。已知模型640?wx_fmt=png和觀測序列640?wx_fmt=png,求對給定觀測序列條件概率640?wx_fmt=png最大的狀態序列640?wx_fmt=png即給定觀測序列,求最有可能的對應的狀態序列。

??上面的例子即為HMM的第三個基本問題,也就是,給定觀測序列{不購物,購物,購物},結果最有可能的狀態序列,即游玩的地方。

Viterbi算法

求解HMM的第三個基本問題,會用到大名鼎鼎的維特比算法(Viterbi Algorithm)。
??維特比算法以安德魯·維特比(Andrew Viterbi)命名,是現代數字通信中最常用的算法,同時也是很多自然語言處理采用的解碼算法。可以毫不夸張地講,維特比是對我們的生活影音力最大的科學家之一,因為基于CDMA的3G移動通信標準主要就是他和厄文·雅各布(Irwin Mark Jacobs)創辦的高通公司(Qualcomm)指定的。
??維特比算法是一個特殊但應用最廣的動態規劃(dynamic programming)算法,利用動態規劃,可以解決任何一個圖中的最短路徑問題,同時,它也是求解HMM描述的第三個基本問題的算法。
??在維特比算法中,需要引入兩個變量640?wx_fmt=png640?wx_fmt=png。定義在時刻t狀態i的所有單個路徑640?wx_fmt=png中概率最大值為

640?wx_fmt=png

定義在時刻t狀態為i的所有單個路徑640?wx_fmt=png中概率最大的路徑的第i-1個節點為

640?wx_fmt=png

??下面是維特比算法在HMM的第三個基本問題的算法:

640?wx_fmt=png640?wx_fmt=png

Python代碼實現

#?-*-?coding:?utf-8?-*-
#?HMM.py
#?Using?Vertibi?algorithmimport?numpy?as?npdef?Viterbi(A,?B,?PI,?V,?Q,?obs):N?=?len(Q)T?=?len(obs)delta?=?np.array([[0]?*?N]?*?T,?dtype=np.float64)phi?=?np.array([[0]?*?N]?*?T,?dtype=np.int64)#?初始化for?i?in?range(N):delta[0,?i]?=?PI[i]*B[i][V.index(obs[0])]phi[0,?i]?=?0#?遞歸計算for?i?in?range(1,?T):for?j?in?range(N):tmp?=?[delta[i-1,?k]*A[k][j]?for?k?in?range(N)]delta[i,j]?=?max(tmp)?*?B[j][V.index(obs[i])]phi[i,j]?=?tmp.index(max(tmp))#?最終的概率及節點P?=?max(delta[T-1,?:])I?=?int(np.argmax(delta[T-1,?:]))#?最優路徑pathpath?=?[I]for?i?in?reversed(range(1,?T)):end?=?path[-1]path.append(phi[i,?end])hidden_states?=?[Q[i]?for?i?in?reversed(path)]return?P,?hidden_statesdef?main():#?狀態集合Q?=?('歡樂谷',?'迪士尼',?'外灘')#?觀測集合V?=?['購物',?'不購物']#?轉移概率:?Q?->?QA?=?[[0.8,?0.05,?0.15],[0.2,?0.6,?0.2],[0.2,?0.3,?0.5]]#?發射概率,?Q?->?VB?=?[[0.1,?0.9],[0.8,?0.2],[0.3,?0.7]]#?初始概率PI?=?[1/3,?1/3,?1/3]#?觀測序列obs?=?['不購物',?'購物',?'購物']P,?hidden_states?=?Viterbi(A,B,PI,V,Q,obs)print('最大的概率為:?%.5f.'%P)print('隱藏序列為:%s.'%hidden_states)main()

?

輸出結果如下:

最大的概率為:?0.02688.
隱藏序列為:['外灘',?'迪士尼',?'迪士尼'].

?

現在,你有很大的把握可以確定,你的女神去了外灘和迪士尼。

?

參考文獻

  1. 一文搞懂HMM(隱馬爾可夫模型):https://www.cnblogs.com/skyme/p/4651331.html

  2. 李航《統計學習方法》 清華大學出版社

  3. HMM與分詞、詞性標注、命名實體識別:http://www.hankcs.com/nlp/hmm-and-segmentation-tagging-named-entity-recognition.html

  4. Hidden Markov Models 1: http://docplayer.net/21306742-Hidden-markov-models-1.html

  5. 吳軍 《數學之美》 人民郵電出版社

轉載于:https://www.cnblogs.com/ZFJ1094038955/p/10755809.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275271.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

尤大直播分享:vue3生態進展和展望

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12前言10月23日,參加了前端早早聊組織的【vue生態專場】,準備寫一波分享方便大家學習。早上有4個話題:volar開發,搭建平臺組件開發…

利用Python查看微信共同好友

思路 首先通過itchat這個微信個人號接口掃碼登錄個人微信網頁版,獲取可以識別好友身份的數據。這里是需要分別登錄兩人微信的,拿到兩人各自的好友信息存到列表中。 這樣一來,查共同好友就轉化成了查兩個列表中相同元素的問題。獲取到共同好友…

女生適合學ux嗎_UX設計色彩心理學,理論與可訪問性

女生適合學ux嗎Colour is an interesting topic, which I feel is often overlooked and sometimes under-appreciated. One of the first things I was taught was the power of colour, how it can have an impact on human emotion, and that there should be purpose behin…

初學者也能看懂的 Vue2 源碼中那些實用的基礎工具函數

1. 前言大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12想學源碼,極力推薦之前我寫的《學習源碼整體架構系列》jQuery、underscore、lodash、vuex、sentry、axios、redux、koa、vue-devtools、vuex4、koa-compose、…

清除浮動mini版

1) 清除浮動mini版(簡約而不簡單).clr:after { content:"";display:table;clear:both;}.clr{zoom:1;} 轉載于:https://www.cnblogs.com/jinbiao/archive/2011/09/26/2191170.html

Fiddler 十分鐘最全使用介紹

Wireshark 、HTTPWatch、Fiddler的介紹 Firebug雖然可以抓包,但是對于分析http請求的詳細信息,不夠強大。模擬http請求的功能也不夠,且firebug常常是需要“無刷新修改”,如果刷新了頁面,所有的修改都不會保存。Wiresha…

視覺測試_視覺設計流行測驗

視覺測試重點 (Top highlight)I often discuss the topic of improving visual design skills with junior and mid-level designers. While there are a number of design principles the designers should learn and practice, one important skill that is not often consid…

如何給開源項目提過 PR 呢?其實很簡單

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12源碼共讀群里有小伙伴聊到如何給開源項目提PR,所以今天分享這篇文章。你有給開源的庫或者框架提過 PR 嗎?如果沒有,那么今天的文章會教你怎么…

一次回母校教前端的經歷

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12已進行了三個月,很多小伙伴都表示收獲頗豐。分享一篇武大畢業的耀耀大佬的文章。有些時候會受限于環境影響,特別是在校大學生。所以要融入到積極上進的環…

設計插畫工具_5個強大的設計師插畫工具

設計插畫工具As Product Designers, most likely, we have come across illustrative work. Visual design is one important element in enhancing the user experience. As many gravitate toward attractive looking products, designers are also adapting to the changing…

如何才能更合理地分配項目獎金?

項目獎金通常情況下都是屬于基本工資之外的一種績效獎勵,也就是說,它在員工的薪酬中,是屬于浮動的那一部分收入,而不是一種固定收入。基于這樣一種認知,跟大家討論下如何才能更合理地進行項目獎金的分配? 首…

Codeforces 741 D - Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

D - Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 思路: 樹上啟發式合并 從根節點出發到每個位置的每個字符的奇偶性記為每個位置的狀態,每次統計一下每個狀態的最大深度 為了保證鏈經過當前節點u,我們先計算每個子樹的答案…

figma下載_切換到Figma并在其中工作不必是火箭科學,這就是為什么

figma下載We have seen Elon Musk and SpaceX making Rocket Science look like a child’s play. In the same spirit, should design tools be rocket science that is too hard to master? Not at all.我們已經看到埃隆馬斯克(Elon Musk)和SpaceX使Rocket Science看起來像是…

npm、yarn、cnpm、pnpm 使用操作都在這了

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12有時候想查個命令,或者換個鏡像找了幾篇文章才找到,最近閑著沒事干,干脆整理一篇文檔,以后就不用在網上瞎搜有的還寫不全。Usage…

CAN控制器的選擇

在進行CAN總線開發前,首先要選擇好CAN總線控制器。下面就比較一些控制器的特點。 一些主要的CAN總線器件產品 制造商 產品型號 器件功能及特點 Intel 82526 82527 8XC196CA/CB CAN通信控制器,符合CAN2.0A CAN通信控制器,符合CAN2.0B 擴展…

洛谷 4115 Qtree4——鏈分治

題目:https://www.luogu.org/problemnew/show/P4115 論文:https://wenku.baidu.com/view/1bc2e4ea172ded630b1cb602.html 重鏈剖分,分別用線段樹維護每條重鏈。線段樹葉子的信息是該點輕孩子的信息;線段樹區間的信息是考慮重鏈的一…

每次啟動項目的服務,電腦竟然乖乖的幫我打開了瀏覽器,100行源碼揭秘!

1. 前言大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12 參與,已進行三個月了,大家一起交流學習,共同進步。想學源碼,極力推薦之前我寫的《學習源碼整體架構系列》 包含jQuery、…

初級爬蟲師_初級設計師的4條視覺原則

初級爬蟲師重點 (Top highlight)Like many UXers, I got into the industry from a non-visual background (in my case it was Business and later on Human Cognition). Even though I found great benefits coming from those backgrounds, it also meant I had no UI/Visua…

String類中IndexOf與SubString

IndexOfpublic: int IndexOf( String^ value, int startIndex, int count ) 說明: value類型:System..::.String要查找的 String。 startIndex類型:System..::.Int32搜索起始位置。 count類型:System..::.Int32要檢查的字符位置…

開源監控解決方案OpenFalcon系列(一)

OpenFalcon是由小米的運維團隊開源的一款企業級、高可用、可擴展的開源監控解決方案,,在眾多開源愛好者的支持下,功能越來越豐富,文檔更加的完善,OpenFalcon 已經成為國內最流行的監控系統之一。小米、美團、金山云、快…