1. 程式人生 > >HMM 的應用之基因檢測

HMM 的應用之基因檢測

這是一篇釋出在 Nature 上面的文章,作為計算機研究僧,其實不怎麼了解 Nature 那一套,然而這篇文章,僅僅是介紹什麼叫 HMM ,就光榮釋出了,當時距離 HMM 被提出應該也有十幾二十年了吧,隔行如隔山,看來生物領域還是很需要計算機專業的人才。稍微扯一點,最近在看《未來簡史》,作者在書中就有一個看法,以後人類的發展就要靠計算機和生物科學家,人腦是計算機,而計算機也是人腦。

Motivation: computational sequence analysis

生物上可以檢測出一系列核苷酸,通過腦海裡僅剩的高中生物的知識可以知道它們是 AGCT 裡面的一種。 一段核苷酸序列組成了一小段基因,基因有顯性,隱性,連線子,三種類型。 現在需要標註一段核苷酸序列的型別(exons, introns, or intergenic sequence),遇到問題:

1. 如何對分類結果進行評分   
2. 概率的解釋,即對評分的信心   
3. 如何做一個通用的模型,而不是定製化的模型  

然後需要藉助於 HMM,據說HMM的在生物學上的應用有以下幾類: genefinding, profile searches, multiple sequence alignment and regulatory site identification

A toy HMM: 5′ splice site recognition

下面給出了一個例子: 已知核苷酸的型別,找到 exons(E) 和 introns(I) 序列的拼接點 (5) 的位置。 E, 5, I 是三個隱狀態 state,ACGT是可觀測空間狀態,概率轉移圖如下。

要計算的是 maxzP(x,zλ)\max_z P(x,z|\lambda)

問題:

  1. viterbi演算法只能找到概率最大的隱序列,其他的隱序列是怎麼算出來的呢? 由於 5 只能表現為 G,A,取其中一個 G,在 t1t_1 時刻, t1t_1 之前DP的過程中只保留了最大概率的路徑,到達 t1t_1 時,不取 t1t_1 層的概率最大值,只取 G ,再以此為起點繼續往後算最大概率的路徑。

  2. P(x,z1λ)P(x,z_1|\lambda)P(x,z2λ)P(x,z_2|\lambda)

    z2λ) 非常接近時,怎樣描述 confidence? 由於本序列的特殊性,所有的 zz 可以算出 P(x,zλ)P(x,z|\lambda) 因此歸一化計算某一序列的確信度。驗算了一下,作者確實是這樣算的:

log_value = [-41.22, -43.90, -43.45, -43.94, -42.58, -41.71]
value = []
for x in log_value:
    value.append(math.exp(x))
normalization(value)
[0.47365226171675695,
0.03247509303560841,
0.05093108413267137,
0.031201726424101746,
0.1215679574980319,
0.29017187719282955]

稍微差了一點點是因為作者只標出了6個數據,其餘的幾個很小就沒給。 不過,不取 log 不就能體現出概率的不同了嘛,其實 e41.22e^{-41.22}e41.71e^{-41.71} 差得挺多的。

發現

在這個例子中狀態轉移圖特別像一個帶了概率的自動機,如果對於序列有什麼要求,都可以加在狀態圖裡。這令人,又想起了學編譯原理的苦逼歲月。 還有對於 Viterbi 的改造,可以說也是相當自然的,或者說這是個 Conditional Viterbi,因為要求了必經某個點作為一個條件。 另外,這個例子實在有點特別吧,剛好就只有 14 個序列,真實情況下不可能算出所有情況歸一化的,一般就除掉分母 P(x,λ)P(x,\lambda) 不就好了嘛。 還有一點思考就是,計算出一個最有可能的狀態序列以後,需不需要驗算一下它的轉移概率,發射概率,到底和給定的引數差多少呢?這種差異要不要再反饋回去呢?

OK,有啥討論的歡迎在下面留言(並沒有評論區)。