|
我如何对一个自定义的成分表创建一个N阶分布(order N distribution)?
这个例子创建了用户自定义的含有七个标志的字母表。用户自定义的标志和字母表能够用来创建标志链,序列,分布等等。当字母表管理器创建交叉产物字母表(CrossProductAlphabet)时,它将推断调节前的字母表(Conditioning
alphabet)的阶为-1,调节好了的字母表(Conditioned alphabet)的阶为1.
本文由Russell Smithies 贡献。
import java.io.*;
import java.util.*;
import org.biojava.bio.*;
import org.biojava.bio.dist.*;
import org.bioajva.bio.symbol.*;
import org.biojava.utils.*;
public class DistTest {
public static void main(String[] args) throws Exception {
// 创建一个“侏儒“ 字母表 (白雪公主和七个小矮人的故事 -- 译者注)
String[] dNames = {
"Grumpy","Sleepy","Dopey","Doc","Happy","Sneezy","Bashful"
};
Symbol[] dwarfs = new Symbol[7];
// 设置字母表的名字
SimpleAlphabet.setName("Dwarf");
for (int i = 1; i<=7; i++) {
try {
dwarfs[i-1] = AlphabetManager.createSymbol((char)('0'+i), ""
+ dNames[i-1], Annotation.EMPTY_ANNOTATION);
// 将新创建的标志添加到字母表中
dwarfAlphabet.addSymbol(dwarfs[dwarfs[i-1]);
}
catch(Exception e){
throw new NestedError(e,"Can't create symbols to represent dwarf");
}
// 通常将新建的字母表注册到字母表管理器中
AlphabetManager.registerAlphabet(dwarfAlphabet.getName(), dwarfAlphabet);
}
使用新创建的"侏儒"字母表来创建一个N阶分布
// 分布的阶数
int order = 3;
// 创建交叉产物字母表
Alphabet a = AlphabetManager.getCrossProductAlphabet(Collections.nCopies(order,dwarfAlphabet));
// 使用n阶分布工厂类创建分布
OrderNDistribution ond = (OrderNDistribution)OrderNDistributionFactory.DEFAULT.createDistribution(a);
//创建分布训练器
DistributionTrainerContext dtc = new SimpleDistributionTrainerContext();
//将分布注册到训练器
dtc.registerDistribution(ond);
我们能用"侏儒"字母表创建一条序列来检测我们创建的n阶分布.我们使用同一分布(能够随机化样本)将标志
添加到链表中.然后用这个链表构建标志链.
//从"侏儒"字母表中随机创建一条标志链
UniformDistribution udist = new UniformDistribution((FiniteAlphabet)dwarfAlphabet);
int size = 100;
List list = new ArrayList();
for (int i = 0; i < size; i++) {
list.add(udist.sampleSymbol());
}
//创建一条标志链来检测分布
SymbolList symbl = new SimpleSymbolList(dwarfAlphabet, list);
这个标志链被转化成一条n阶标志链从而能应用n阶分布.
//转化成一条n阶标志链
symbl = SymbolListViews.orderNSymbolList(symbl, order);
//或者使用窗口标志链(WindowedSymbolList)
//symbl = SymbolListViews.windowedSymbolList(symbl, order);
//将计数添加到分布中
for (Iterator i = symbl.iterator(); i.hasNext(); ) {
try {
dtc.addCount(ond, (Symbol) i.next(), 1.0);
}
catch (IllegalSymbolException ex) {
//标志非法
ex.printstacktrace()}
}
// 不要忘记训练,否则没有权重会添加到分布中
dtc.train();
//将分布写入XML文件中
XMLDistributionWriter writer = new XMLDistributionWriter();
writer.writeDistribution(ond, new FileOutputStream("dwarf.xml"));
}
}
--BACK TO TOP
|