COMPUTER SCIENCE

 

JAVA

 

R

 

XML

 

LINUX

 

OTHERS

 

BIOINFORMATICS

 

BIOJAVA

 

 

BIOSQL

 

 

MICROARRAY

 

 

MOTIF FINDING

 

 

REGULATION NETWORK

 

OTHERS

 

LIFE SCIENCE

 

 


我如何创建一个隐马模型序列谱(Profile HMM)?

隐马模型序列谱(例如HMMER程序使用的)是一种敏感度非常高的搜索模体的方法.通常使用Baum-Welch算法对一组序列进行训练,这组序列含有我们感兴趣模体.
这个算法能将模型参数不断优化直到符合终止标准.一旦序列谱被构建,则能用Viterbi算法决定最可能生成观测序列的状态序列.如果在观测序列中有足够多的
状态匹配或者使用一个定义了阈值的打分矩阵(比如说对数几率)且分值超过阈值则该序列被认为含有模体.下面的程序展示了这点.

首先创建一个隐马模型序列谱.

// 创建一个十二列的DNA隐马模型序列谱,用默认的分布工厂类创建转移和生成分布
ProfileHMM hmm = new ProfileHMM(DNATools.getDNA(),
12,
DistributionFactory.DEFAULT,
DistributionFactory.DEFAULT,
"my profilehmm");
// 为模型创建一个动态规划矩阵
dp = DPFactory.DEFAULT.createDP(hmm);

这时你要读取训练序列集.

// 存储训练集的数据库
SequenceDB db = new HashSequenceDB();

// 在这里编码,装载训练集

现在,以一致的数值初始化所有的模型参数。另外,参数可以随机化或者猜测最符合模型的参数值。
使用Baum-Welch算法优化序列。

// 将所有参数以同一数值训练
ModelTrainer mt = new SimpleModelTrainer();

// 注册模型
mt.registerModel(hmm);

// 使用空权重训练参数
mt.setNullModelWeight(1.0);
mt.train();

// 使用BW训练器,以动态规划矩阵为参数
BaumWelchTrainer bwt = new BaumWelchTrainer(dp);

// 使用匿名内类制定终止标准:20遍
StoppingCriteria stopper = new StoppingCriteria() {
public boolean isTrainingComplete(TrainingAlgorithm ta) {
return (ta.getCycle()>20);
}
};

// 使用空模型(null model)权重1.0和上面定义的终止标准,优化动态规划矩阵
bwt.train(db,1.0,stopper);

下面的例子对一条序列打分,并且输出状态序列
SymbolList test = null;
// 在这里编码,并且初始化待测序列
// 将待测序列装进一个数组中,这里使用数组是因为使用HMM的双序列比对需要在数组中的两条标志链。

SymbolList[] sla = {test};

// 解码最可能的状态序列,产生几率分值
StatePath path = dp.viterbi(sla,ScoreType.ODDS);
System.out.println("Log Odds = "+path.getScore());

// 输出状态序列
for(int i = 1; i<= path.length();i++){
System.out.println(path.symbolAt(StatePath.STATES, i).getName());
}

--BACK TO TOP

 

Maintainted by Wu Xin, CBI, Peking University, China, 2003