维特比算法的实现与应用 HMM 隐马尔可夫链作业分析

本文介绍了如何利用隐马尔可夫模型(HMM)和维特比算法来分析基因组序列,特别是针对GC组成的不均一性。问题设定为一个有两个状态(A和B)的HMM,分别对应不同的碱基组成。通过HMM的参数,如发射概率和转移概率,以及维特比算法,对给定的基因序列进行分割,确定属于状态A和状态B的区域。

问题提出:

大多数基因组序列的碱基组成不均一。特别是,GC组成可能会因地区而异。例如,在人类基因组中,存在“ CpG岛”,其显示出非常强的统计信号(在二核苷酸组成水平上甚至比单核苷酸组成水平更强),并且倾向于标记许多基因的5’末端。因此,自然出现将基因组序列客观地划分为不同组成区域的问题。分割基因组的一种方法是使用HMM算法。

假定可以将基因组建模为具有两个状态A和B的两个状态的HMM。假定此HMM的参数如下。状态A对于{A,C,G,T}的概率具有AT偏移的发射分布{0.35,0.15,0.15,0.35}。状态B具有GC偏向的发射分布{0.15,0.35,0.35,0.15}。状态A以0.001的概率切换到状态B。状态B以0.01的概率切换回状态A。假设HMM的初始分布是均匀的; 0.5,两个状态为0.5。

输入:

  • 首先 读模型结构 输入的格式是这样的
    2 4 ACGT
    .5 .5
    .999 .001 .35 .15 .15 .35
    .01 .99 .15 .35 .35 .15
  • 给出基因序列 判断哪些是状态a , 哪些是状态b.

思路


"_@AUTHOR_ Lavinia ZHANGMENGFAN"
"STUDENT ID 55955735"

import numpy as np

"""
get the parameters we need about markov model from the .hmm file we have 
"""
def get_hmm_model(model_path="example.hmm"):
    f=open(model_path)
    hmm_model=f.readlines()         #reading files
    count=1
    matrix=[]
    for line in hmm_model:      
        parameters=line.split()    
        
        if count == 1 :
            state_size=int(parameters[0])
            symbols_size=int(parameters[1])
            symbols=[]
            for i in parameters[2]:
                symbols.append(i)

        elif count == 2 :
            primary_p=np.array(list(map(float,parameters)))

        else:
            matrix.append(np.array(list(map(float,line.split()))))
        count=count+1
    matrix=np.array(matrix)
    transition_p=matrix[:,:2]      
    emission_p=matrix[:,2:]
    f=open("hmm_optimal_path.txt",'a')
    f.writelines(['The markov model have ',str(state_size), ' states :state A and state B respectively.'])
    f
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值