def build_an_hmm_example(): # i think the characters in each DiscreteDistribution definition, means the emission matrix for each state # because it says the probability of seeing each character when the system is in that state d1 = DiscreteDistribution({'A': 0.35, 'C': 0.20, 'G': 0.05, 'T': 0.40}) d2 = DiscreteDistribution({'A': 0.25, 'C': 0.25, 'G': 0.25, 'T': 0.25}) d3 = DiscreteDistribution({'A': 0.10, 'C': 0.40, 'G': 0.40, 'T': 0.10}) s1 = State(d1, name="s1") s2 = State(d2, name="s2") s3 = State(d3, name="s3") model = HiddenMarkovModel('example') model.add_states([s1, s2, s3]) model.add_transition(model.start, s1, 0.90) model.add_transition(model.start, s2, 0.10) model.add_transition(s1, s1, 0.80) model.add_transition(s1, s2, 0.20) model.add_transition(s2, s2, 0.90) model.add_transition(s2, s3, 0.10) model.add_transition(s3, s3, 0.70) model.add_transition(s3, model.end, 0.30) model.bake() for i in range(len(model.states)): print(model.states[i].name) model.plot() #print(model.log_probability(list('ACGACTATTCGAT'))) #print(", ".join(state.name for i, state in model.viterbi(list('ACGACTATTCGAT'))[1])) print("forward:", model.forward(list('ACG')))
def build_the_same_model_in_test_sample_from_site_line_by_line(): # State olds emission distribution, but not #transition distribution, because that's stored in the graph edges. s1 = State(NormalDistribution(5, 1)) s2 = State(NormalDistribution(1, 7)) s3 = State(NormalDistribution(8, 2)) model = HiddenMarkovModel() model.add_states(s1, s2, s3) model.add_transition(model.start, s1, 1.0) model.add_transition(s1, s1, 0.7) model.add_transition(s1, s2, 0.3) model.add_transition(s2, s2, 0.8) model.add_transition(s2, s3, 0.2) model.add_transition(s3, s3, 0.9) model.add_transition(s3, model.end, 0.1) model.bake() model.plot()