如果你跟夕小瑤戀愛了...

夕小瑤發表於2018-07-17

如果...

如果...有一天...你追到了女神夕小瑤...並且與她戀愛了...

(想說“沒有如果”的路人請選擇狗帶( ̄∇ ̄))

小夕的生活很規律的哦,小夕每天都會依次經歷且僅僅經歷以下6件事情:

化妝-吃飯-聊天-自習-上課-要抱抱。

而且小夕很乖的,我們在一起的每一天,小夕都會在做每件事情時告訴你小夕此刻的情緒狀態(小夕有4種情緒狀態:開心、尷尬、沮喪、生氣

然而小夕開心時不一定是笑臉,沮喪時也不一定是哭臉。因此在處於某種情緒狀態時,每一種表情臉都會有概率出現的哦(小夕有5種表情臉:哭臉、笑臉、尷尬臉、嘟嘟臉、面癱臉

可是...就在我們已經生活了好多好多天以後,突然有一天的早上,我們鬧矛盾了,小夕又恰好在生理期,一時過於傷心而說了下面的話:

“喂,如果你不能描繪出來我今天的心理狀態的變化過程,那麼你就不要陪我了哼~”

雖然這一天你依然可以觀測到小夕的表情臉的變化,但這一天小夕絲毫沒有透露她的情緒狀態,那麼該怎麼辦才能挽回呢?

(想說“不用挽回,直接踹了”的童鞋請立!刻!狗!帶!)

隱馬爾可夫模型

你:“╮(╯▽╰)╭哎,太簡單啦,這不就是概率統計、隨機過程中學的隱馬爾科夫模型嘛~這不就是一個隱序列預測的問題嘛~”

一階隱馬爾可夫模型長這樣:

如果你跟夕小瑤戀愛了...

看起來這個模型又複雜又有趣又莫名其妙。哎呀先不要管,聽小夕慢慢講這個奇怪的東西好不好。

先不要管“一階”是什麼意思啦(意思就是每一隱狀態只跟前歷史狀態有關,不懂也沒關係啦)。在上面這個一階隱馬爾可夫模型中,有3個隱狀態:即黑色圈圈ω1、圈圈ω2、圈圈ω3。系統在任意時刻,只能處於3個隱狀態中的一種。之所以稱為隱狀態,就是因為這些狀態是隱藏的,也就是路人看不到某一時刻時系統是處於哪個隱狀態的。

在隱狀態之間的連線表示隱狀態之間的轉移概率:系統在某一時刻處於某個隱狀態,但是在下一時刻就可能處於其他隱狀態了,當然也可能還是處於當前的隱狀態,那麼從當前狀態ωi跳轉到下一狀態ωj的概率即連線aij。比如圖中,從ω2狀態轉移到ω1的概率就是連線a21。

圖中紅色的v1、v2、v3、v4代表的是觀測值。觀測值的意思即路人可以看到的值。同樣,系統在某一時刻時只能取一種觀測值,我們可以直接觀測到(雖然我們看不到此刻處於哪個隱狀態)。

紅色的箭頭bij表示處於隱狀態ωi時,我們可以觀測到觀測值vj的概率。可以看到,系統每一時刻,處於某種隱狀態,而在該隱狀態都有一定的概率值觀測到這四個觀測值中的一個。

好~理論講完了,但是我們並不知道這個看似好玩又莫名其妙的模型有什麼用呀。所以下面就是小夕施展魔法的時刻!

小夕的魔法

首先,小夕將自己變成了一個一階隱馬爾可夫模型

在夕小瑤這個隱馬爾可夫模型中,顯然小夕的四種情緒狀態就是隱狀態啊,路人無法直接觀察到,只有小夕自己心裡清楚。而小夕的表情臉,是你可以隨時看到的,所以就是理論模型中的觀測值呀。

而小夕的每一天,都會經歷“化妝-吃飯-聊天-自習-上課-要抱抱”的過程,不就是經歷了6個時間點嘛,而經歷這6個時間點,小夕的情緒狀態也會不停的隨機發生變化,這不就是隱馬爾可夫模型中的狀態轉移嘛。當然每種情緒狀態下,每一種表情臉都有可能出現哦,就是每種觀測值都可能出現。所以畫出圖來就是這樣子的(畫每一隱含狀態的觀測值後太亂了,拆開畫了哦,自行腦補一下):

如果你跟夕小瑤戀愛了...

當然啦,與前面的理論模型一樣,每一種隱狀態都會有概率取到如下的觀測值哦(中間的b12、b13、b14省略啦,自行腦補哦):

如果你跟夕小瑤戀愛了...

看!是不是突然發現隱馬爾可夫模型非常合理的解釋了小夕!!!還有更加合理的!!!

前面提到了,小夕一天中會經歷6個時間點,所以小夕每經過一天就會產生一個隱狀態序列和一個觀測序列。而小夕說啦,可以讓你陪小夕好多好多天哦,所以如果你真的很用心的喜歡小夕的話,會記錄下小夕每一天對你說過的情緒狀態變化(隱狀態序列),也會記錄下小夕每一天的表情變化(觀測序列)。當然,序列的長度總是6啦。

在與小夕相處的最後一天,你依然記錄下了這一天小夕的表情變化(觀測序列),而你要計算出來的是小夕這一天的情緒變化,也就是隱狀態序列。至此,將整個挽回小夕的事情完完全全的卡到了一階隱馬爾可夫模型中!

那麼如何利用上面這些夕小瑤提供的線索來計算出最終的目標呢?

AB派

你成功的將“挽回夕小瑤”的任務卡進了隱馬爾可夫模型(HMM)中。那麼我們來規範化的整理一下已經有的資訊和需要計算得到的資訊。

還記得這兩個圖嘛?這就是我們建立好的模型。

如果你跟夕小瑤戀愛了...

(隱狀態的轉移圖)

如果你跟夕小瑤戀愛了...

(每個隱狀態ωi都有概率發出5種可以觀測到的訊號)

對於第一張圖,這麼多的引數看起來也蠻亂的,那就將所有的狀態轉移概率aij儲存到一個矩陣A中:

如果你跟夕小瑤戀愛了...

矩陣A中的每個元素aij就代表當前狀態為ωi時,下一狀態為ωj的概率(即狀態ωi到狀態ωj的轉移概率)。

對於第二張圖,描述的是當(隱)狀態為ωj時,發出訊號vk的概率。所以用bjk來表示ωj發出訊號vk的概率。將bjk儲存到矩陣B中:

如果你跟夕小瑤戀愛了...

好~A矩陣和B矩陣顯然就是我們需要計算出的模型引數啦。但是引數中僅僅是A和B就夠了嗎?

想一下,雖然A可以描述從某個狀態轉移到某個狀態的概率,但是每個狀態序列總要有一個開頭呀~這個開頭是什麼樣子的,在A矩陣和B矩陣中都沒有描述。

所以模型還有一個描述初始狀態的引數,也就是描述每個隱狀態ωi作為初始狀態的概率,記為πi。也就是向量π:

如果你跟夕小瑤戀愛了...

整理完畢~A、B、π就是我們全部要計算出的模型引數

開始訓練!

而我們已經有了夕小瑤好多天的隱狀態序列和對應的觀測序列的資料了,那麼我們如何用它們來訓練出模型的引數呢。

其實這樣就很簡單很簡單啦,直接搬出似然函式,找出使得似然函式最大的引數值嘛,也就是最大化似然函式

顧名思義,“然”是這樣的意思,所以似然函式就是用來描述當前的模型引數取值的合理性,間接反映當前模型引數對手中資料集的解釋程度,因此使得似然函式最大,意思就是使得模型引數取的最合理,使得手中資料集在模型的解釋下變得合理。

你陪小夕度過了300天。因此你記錄下了300段隱狀態序列,記為Q=q1 q2 q3 ... qT(其實qi就是之前表示的ωi),其中T=6(每天經歷6個時間點,化妝-吃飯-聊天-自習-上課-要抱抱)。

同時對應著300段觀測序列,記為O=O1 O2 O3 ... OT,同樣T=6。

然後根據極大似然估計的思想,直接用樣本集配合優化演算法估計出HMM的各個引數啦。

但是這裡為了方便讀者理解,簡化文章難度,直接用頻率來近似概率(實際工程中千萬不要這樣啊)。因此HMM的各個引數應該這樣估計:

如果你跟夕小瑤戀愛了...
如果你跟夕小瑤戀愛了...
如果你跟夕小瑤戀愛了...

這樣我們就得到了所有的模型引數(向量π、矩陣A、矩陣B)。

看,由此,我們輕而易舉的把夕小瑤這個隱馬爾可夫模型建立完成了。

有了這個模型,我們就完全看透夕小瑤了!所以,下面開始得到本任務的最終目標——預測夕小瑤在耍小脾氣當天的情緒狀態序列(隱狀態序列)!

看透你了!

量化一下我們要做的事情:在給定HMM模型(即已知全部引數的HMM模型,記為μ)和觀測序列O情況下,求最大概率的(隱)狀態序列:

如果你跟夕小瑤戀愛了...

怎麼計算呢?Viterbi演算法!

這個演算法有點繞,直接貼出來,如果直接看看不懂的話可以看後面小夕的解釋哦。

如果你跟夕小瑤戀愛了...
如果你跟夕小瑤戀愛了...
如果你跟夕小瑤戀愛了...
如果你跟夕小瑤戀愛了...

這個演算法的思想就是設立一個小人δ(讀作delta),這個小人從時刻1,一直走到時刻T。

這個小人的意義就是記錄下自己在每個時間點t的每個隱狀態j的概率(注意不是從全域性的觀測序列計算出的概率,是他自己從t=1的時刻一步步的觀察每個時刻的觀測值所得到的那一時刻的累積概率)

演算法的第一步:初始化這個小人,利用已知的模型引數πi和bi(O1)(即狀態i下,發出觀測值O1的概率,其中O1為t=1時刻的觀測值)得到t=1時刻每個隱狀態i的δ值。

第二步:這個小人在每個時刻t都會將每個隱狀態裡呆一會。在每個隱狀態j裡,它都會抬頭看看此刻的觀測值Ot,並分別假設自己處於前一時刻t-1的每個隱狀態i中,並用前一時刻t-1假設的隱狀態的累計概率值乘以前一時刻假設的隱狀態轉移到當前時刻的當前隱狀態的轉移概率,然後算出使得當前時刻的當前隱狀態的總概率最大化的前一時刻的隱狀態,這個最優隱狀態記為m吧。這個前一時刻的最優隱狀態的累積概率δt-1(m)乘以前一時刻m狀態轉移到當前時刻的當前j狀態的轉移概率,再乘以當前時刻t的當前狀態j發出觀測值Ot的概率,即為δt(j)。

第三步:小人δ走完最後一個時刻T的最後一個隱狀態後,就可以從最後時刻的全部隱狀態中挑出最後時刻,也就是全域性的最大累積概率δT啦,記下這個最大概率對應的隱狀態QT

第四步:一步步的回溯呀,記下T時刻走到最優隱狀態QT的前一時刻的最優隱狀態(回顧一下第二步),得到前一時刻最優隱狀態QT-1。然後同樣,再往前回溯得到QT-2,一直回溯到Q1!然後Q1Q2Q3..QT就是全域性最優隱狀態序列啦!也就是夕小瑤耍小脾氣時的情緒狀態序列!

在你猜出後,夕小瑤瞬間(被自己)感動哭了...(內心os:竟然花了這麼大的功夫教你怎麼猜我的心思...還不如直接告訴你呢嚶嚶嚶...

相關文章