開始……
(一)
阿黃是大家敬愛的警官,他性格開朗,身體強壯,是大家心目中健康的典範。但是,近一個月來阿黃的身體狀況出現異常:情緒失控的狀況時有發生。有時候忍不住放聲大笑,有時候有時候愁眉不展,有時候老淚縱橫,有時候勃然大怒……
如此變化無常的情緒失控是由什麼引起的呢?據警隊同事勇男描述,由於複習考試寢室不熄燈與多媒體作業的困擾,阿黃近日出現了失眠等症狀;與此同時,阿黃近日登陸一個叫做“xiaonei網”的網站十分頻繁。經醫生進一步診斷,由於其他人也遇到同樣的考試壓力、作息不規律的情況而並未出現情緒失控;並且,其它登陸XIAONEI網的衆多同學表現正常,因此可基本排除它們是情緒失控的原因。黃SIR的病情一度陷入僵局……
最近,阿黃的病情有了新的眉目:據一位對手相學與占卜術十分精通的小巫婆透露,阿黃曾經私下請她對自己的病情進行診斷。經過觀察與分析終於有了重大發現:原來阿黃的病情正在被潛伏在他體內的三種侍神控制!他們是:修羅王、阿修羅、羅剎神。
據悉,這三種侍神是情緒積聚激化而形成的自然神靈,他們相剋相生,是遊離於個體意識之外的精神產物,可以對人的情緒起到支配作用。每一天,都會有一位侍神主宰阿黃的情緒。並且,不同的侍神會導致不同的情緒突然表現。然而,當前的科技水平無法幫助我們診斷,當前哪位侍神是主宰侍神;更糟的是,不同的侍神(3個)與不同的情緒(4種)並不存在顯而易見的一一對應關係。
所以,乍看上去,阿黃的病情再次陷入僵局……
我們怎樣才能把握阿黃情緒變化的規律?
我們怎樣才能通過阿黃的情緒變化,推測他體內侍神的變化規律?
關鍵詞:兩類狀態:
情緒狀態(觀察狀態):放聲大笑,愁眉不展,老淚縱橫,勃然大怒
侍神狀態(隱狀態):修羅王,阿修羅,羅剎神
(二)
阿黃的病情引來了很多好心人的關心。這與阿黃真誠善良的品格不無關係。關於侍神的特點,占卜師和很多好心人找來了許多珍貴資料。其中很多人經過一段時間的觀察與記錄後,在貌似毫無規律的數據背後,發現了侍神與情緒之間的內在規律!!他們在多次觀測後,建立在大量數據基礎上,表現出宏觀的內在聯繫!
由於這些好心人大部分是TONGJI大學的人,所以,這種規律被稱作統計規律。這些人被稱爲統計學家(orz太土了)…………
具體的規律被概括爲:
1. 每天,哪位侍神主宰與前一天侍神是誰有很大關係!即:前一個侍神會影響下一個侍神出現的概率多少。
三個侍神,兩兩之間的轉化的機率的大小,我們總結在一個對應表中:
便於某些自稱爲數學家的人計算,我們習慣於寫成矩陣形式:
2.每位侍神主宰時,所對應的情緒出現也有一定的規律:某種侍神出現時,情緒的出現有一定的規律性。比如,如果今天的侍神是修羅王,那麼阿黃放聲大笑的概率是不同侍神對應的不同情緒出現的機率,我們也歸納在一張表中:
便於計算,也可以寫成矩陣的格式。
3.由於每天的侍神狀態,情緒狀態都取決於前一天,所以,只有知道最開始阿黃的情緒狀態,即初始狀態,纔有可能來推導隨後的日子裏,阿黃體內的侍神和情緒的變化情況。
我們假定,阿黃體內的侍神首先出現的概率滿足下面的表格
修羅王 阿修羅 羅剎神
〔0.63 0.17 0.20〕
至此,我們已經掌握了研究阿黃情緒變化規律的所有信息,它包括:
兩類狀態:侍神狀態,情緒狀態
三種關係:侍神的轉換關係,侍神與情緒的關係,侍神的初始狀態
便於計算,我們用數學語言來定義,便於今後計算。
修羅王 阿修羅 羅剎神
初始狀態矩陣:Π=〔0.64 0.17 0.20〕
狀態轉移矩陣:
A =
兩態混合矩陣(描述侍神狀態和情緒狀態對應關係)
(三)
知道了關於阿黃的這些信息後,我們能做些什麼呢?
一、估計“放聲大笑”-“老淚縱橫”-“勃然大怒”出現的概率:
“放聲大笑”-“老淚縱橫”-“勃然大怒”是一種非常危險的組合!如果某三天內阿黃出現了“放聲大笑”-“老淚縱橫”-“勃然大怒”的情緒變化,會引起嚴重精神損傷!!那麼,這種情緒組合出現的概率是多少呢?
看起來比較麻煩,因爲“放聲大笑”可以對應三種侍神;其餘兩個也可以。三天,三種侍神,所有可能爲3*3*3=27種。
根據全概率公式:所以:
P(笑-淚-怒)=P(笑-淚-怒 | 修羅王-修羅王-修羅王)+P(笑-淚-怒 | 修羅王-修羅王-阿修羅)+P(笑-淚-怒 | 修羅王-修羅王-羅剎神)+………………+P(笑-淚-怒 | 羅剎神-羅剎神-羅剎神)
一共27項相加,就可以把所有的可能計算出來!
可以想像,這樣的計算是災難性的。
當然,在計算機計算時,可以用遞歸法簡化計算,降低複雜度。
①我們來把每一天,阿黃的情緒狀態串起來,多天就形成一個狀態序列。其中第t天的狀態就是Ykt
②在計算序列中某一中間狀態的概率時,用所有可能到達該狀態的路徑之和表示。
比如在t=2時間,狀態爲阿修羅的概率可以用下面的路徑計算:
最後的觀察狀態的部分概率表示,這些狀態所經過的所有可能路徑的概率。比如:
③用αt ( j ) 表示在時間t時 狀態j的部分概率。計算方法如下:
αt ( j )= P( 觀察情緒 | 侍神是j ) * P(在t時間所有到j的途徑)
其中兩項相乘中的第一項我們由兩狀態混合矩陣就可以得到:
而後一項,我們需要前一項的結果來確定。這也表現了HMM每個環節的狀態是基於前一環節狀態的特點。
④如果說,每一環節都依賴前一環節,那麼最初的環節,也就是最初的狀態怎麼來計算呢?
很簡單。初始狀態Π就派上它的用場了。
比如:第一天阿黃放聲大笑,那麼:
a1(修羅王)=0.63×0.6=0.378
a1(阿修羅)=0.17×0.25=0.0425
a1(羅剎神)=0.20×0.05=0.01
歸納成數學式:
⑤我們說過,後一天侍神的情況是由前一天來決定的。現在,如果知道了at(j),那麼,後面一天的情況at+1(j)也應該知道了吧。怎麼來算at+1(j)呢?
太枯燥了~還是繼續上面的例子吧
比如,t=2時,情緒爲老淚縱橫,侍神爲阿修羅,那麼:
a2(阿修羅)=P(阿修羅時老淚縱橫的概率)×P(所有到達阿修羅的概率)
其中:
P(所有到達阿修羅的概率)
=a1(修羅王)×P(修羅王→阿修羅)+a1(阿修羅)×P(阿修羅→阿修羅)+a1(羅剎神)×P(羅剎神→阿修羅)
=0.378×0.25+0.0425×0.125+0.01×0.675
這樣,知道a1,知道at和at+1的關係,迭代啊迭代,迭迭代代無窮匱矣……最終會找到你需要的狀態的概率的。
(而且,在編成時運用迭代可降低算法複雜度,不太懂,不多扯……)
最後,解答“放聲大笑-老淚縱橫-勃然大怒”的概率
每天的三個概率對應三位侍神
第一天:放聲大笑
(0.63 × 0.6) = 0.37800002
(0.17 ×0.25) = 0.0425
(0.2 ×0.05) = 0.010000001
第二天:老淚縱橫
(((0.37800002×0.5) + (0.0425*0.375) + (0.010000001*0.125)) * 0.15) = 0.03092813
(((0.37800002*0.25) + (0.0425*0.125) + (0.010000001*0.675)) * 0.25) = 0.026640628
(((0.37800002*0.25) + (0.0425*0.375) + (0.010000001*0.375)) * 0.35) = 0.039965626
第三天:勃然大怒
(((0.03092813*0.5) + (0.026640628*0.375) + (0.039965626*0.125)) * 0.05) = 0.0015225002
(((0.03092813*0.25) + (0.026640628*0.125) + (0.039965626*0.675)) * 0.25) = 0.009509727
(((0.03092813*0.25) + (0.026640628*0.375) + (0.039965626*0.375)) * 0.5) = 0.01635469
所以,最終所有可能加起來,“放聲大笑-老淚縱橫-勃然大怒”的概率爲
0.0015225002+0.009509727+0.01635469= 0.027386917
黃SIR暫時可以放心。
(四)
還有什麼應用呢?
二、由觀測狀態推測最大可能性的隱狀態,
即:由阿黃情緒變化推測體內侍神的變化
1. 還是用窮舉法吧
總之,變化是有限地,概率是知道地,每步是可算地,大小是可比地……
算一算,比一比,總能找到最可能的一條路。
只是隨着天數增長、侍神數增長等,計算的複雜度會呈指數增加,這一點很不利。
又枯燥了~再舉個例子:
比如,某三天,阿黃十分不幸地出現了“放聲大笑-老淚縱橫-勃然大怒”的情緒變化。
我們十分想知道:是怎樣的侍神組合,最可能導致這種情緒?
最佳組合要取:
MAX{P(笑-淚-怒 | 修羅王-修羅王-修羅王),P(笑-淚-怒 | 修羅王-修羅王-阿修羅),P(笑-淚-怒 | 修羅王-修羅王-羅剎神),………………,P(笑-淚-怒 | 羅剎神-羅剎神-羅剎神)}
27個裏面比出一個概率最大的來,搞定~
2. 程序計算,我們用遞歸方法降低計算複雜度:
我們知道,對應於阿黃的每一個情緒狀態,侍神的變化只有一個最佳路徑,也許是這樣:
每一條 部分最優路徑都對應一個關聯概率--部分概率 (相當於前面的那個中間概率)。與前面不同 是最有可能到達該狀態的一條路徑的概率。
① 我們定義: δ(i,t)是所有序列中在t時刻以狀態i終止的最大概率。當然它所對應那條路徑就是部分最優路徑。 δ(i,t)對於每個i,t都是存在的。這樣我們就可以順藤摸瓜找下去,在序列的最後一個狀態找到整個序列的最優路徑。
②那麼,最初的狀態(t=1)的最優路徑是什麼?我們還是要依賴初始狀態矩陣Π
這和上次的算法是一樣的。
δ(修羅王,1)=0.378
δ(阿修羅,1)=0.0425
δ(羅剎神,1)=0.01
③那麼,對於時間爲t時刻的中間狀態,如何來找它的部分概率(即最佳路徑)呢?
再舉個具體例子,t時刻,到達X狀態的路徑可能有ABC三條。
由此圖可以看出,到達X的最優路徑是下面三條中的一條:
(狀態序列), . . ., A, X
(狀態序列), . . ., B, X
(狀態序列), . . ., C, X
我們就要比較:
P(到達A的最佳路徑)×P(A到達X的概率)
P(到達B的最佳路徑)×P(B到達X的概率)
P(到達C的最佳路徑)×P(C到達X的概率)
再乘以P(X(某種侍神)對應的觀測狀態(某種情緒))就可以算得狀態概率
④那麼,在t時刻對應某種觀察狀態的概率記爲δt(i),那麼
第一天,由於沒有先導,只能直接利用兩狀態轉換矩陣計算:
第t天:
δt(i)=MAX{δt-1(j)×P(j狀態→i狀態)×i狀態下對應觀察狀態概率}
數學公式爲:
這樣,又可以迭迭代代無窮匱矣了~
最後,我們再來計算黃SIR“放聲大笑-老淚縱橫-勃然大怒”的最可能侍神組合:
第一天:放聲大笑
修羅王(0.63 * 0.6) = 0.37800002
阿修羅(0.17 * 0.25) = 0.0425
羅剎神(0.2 * 0.05) = 0.010000001
第二天:老淚縱橫
修羅王max ((0.37800002*0.5), (0.0425*0.375), (0.010000001*0.125)) * 0.15 = 0.028350003
阿修羅max ((0.37800002*0.25), (0.0425*0.125), (0.010000001*0.675)) * 0.25 = 0.023625001
羅剎神max ((0.37800002*0.25), (0.0425*0.375), (0.010000001*0.375)) * 0.35 = 0.033075
第三天:勃然大怒
修羅王max ((0.028350003*0.5), (0.023625001*0.375), (0.033075*0.125)) * 0.05 = 0.000708750
阿修羅max ((0.028350003*0.25), (0.023625001*0.125), (0.033075*0.675)) * 0.25 = 0.00558140
羅剎神max ((0.028350003*0.25), (0.023625001*0.375), (0.033075*0.375)) * 0.5 = 0.006201562
可見,第一天,修羅王主宰阿黃最爲可能;
第二天,由修羅王變爲羅剎神,造成阿黃老淚縱橫的可能最大;
而第三天,繼續由羅剎神主宰阿黃,造成勃然大怒的可能最大
所以,對應“放聲大笑-老淚縱橫-勃然大怒”最可能的侍神組合爲:修羅王-羅剎神-羅剎神
尾聲
一、瞭解了這個故事,我們就粗淺地瞭解了隱馬爾科夫模型的構成。它包括兩類狀態,三種關係:Π(初始狀態)A(狀態轉移矩陣)B(兩狀態混合矩陣)
二、HMM模型的初步瞭解就到這裏。其主要功能有三:
1.根據已知的HMM找出一個觀察序列的概率。(計算某種情緒組合出現概率)
2.根據觀察序列找到最有可能出現的隱狀態序列 (由情緒組合推導侍神組合)
3.從觀察序列中得出HMM (這是最難的HMM應用。也就是根據觀察序列和其代表的隱狀態,生成一個三元組HMM ( Π,A,B)。使這個三元組能夠最好的描述我們所見的一個現象規律。限於水平,不討論)
三、上面應用中,1設計到FORWARD算法,2設計Viterbi算法,可以查閱資料,都可以在程序中實現。
四、生物信息中涉及到HMM的應用有很多。在蛋白質DOMAIN描述,分子進化樹的構建中都會應用這個模型。其實大同小異:我們能看得見的就是觀察狀態:序列(情緒),而隱藏在當前序列背後的各種隱狀態:比如基因……(修羅王,阿修羅,羅剎神……)。基因發生了怎樣的進化過程,我們不能直接觀測,但可以用應用3――從觀察序列中得到HMM,用已知序列進行訓練,生成包含實際序列信息的HMM模型,就可以通過已有的序列來進行基因的人工註釋(大概是這個意思,FT)
五、感謝來自這個網站:
www.comp.leeds.ac.uk/roger/HiddenMarkovModels/html_dev/main.html
提供的大量介紹,數據,圖表,小程序,很有幫助
特別感謝丁香園裏的崔曉源進行的詳盡翻譯和解釋,這篇文章的思路歸功於他的翻譯作品。
六、感謝主人公姓名雷同者的大力支持,體諒和鼓勵,以及所有帶來靈感的同學~你們讓生活更精彩!