meanstds = [(2., 0.1), (1., 0.1), (1., 0.1)] hmm = HMM(3, transition_matrix=transition, pdf_mean_and_stds=meanstds) print(hmm.A[0]) print(hmm.pi) print(np.random.choice(range(hmm.N), 1, p=hmm.pi)) print(hmm.simulate_state_seq(50)) obs = hmm.simulate_observation_seq(100) plt.plot(obs, 'ko') plt.plot(obs, 'k--') # plt.show() print(hmm.forward(obs)) transition2 = np.asarray([[0.8, 0.18, 0.02], [0.2, 0.4, 0.4], [0.02, 0.4, 0.58]]) hmm2 = HMM(3, transition_matrix=transition2, pdf_mean_and_stds=meanstds) # obs = hmm2.simulate_observation_seq(100) print(hmm2.forward(obs)) print(hmm.backward(obs)) print(hmm2.backward(obs)) print(hmm.backward(obs) / hmm2.backward(obs)) print(hmm.forward(obs) / hmm2.forward(obs)) print(hmm.backward(obs) / hmm2.backward(obs) / (hmm.forward(obs) / hmm2.forward(obs))) # always around 0.998, 1.078 or 0.947
hmm = HMM() hmm.train(train) test(test) def test(data): correct_num = 0.0 token_num = 0.0 for seq in data[10:20]: true = seq.labels sen = seq.features ob, T = self.checkOb(seq) print(sen) result = self.classify(seq) print(true) print(result) B = hmm.backward(ob, T) print(sum(B[:, 0] * hmm.P * hmm.E[ob[0]])) print(hmm.likelihood(seq)) print() token_num += len(sen) for i in range(len(sen)): if true[i] == result[i]: correct_num += 1 print('\nAccuracy: ' + str(correct_num / token_num)) print(hmm.forward(data[10]) == hmm.backward(data[10]) ) # test if the likelihood of Forward algorithm equals to Backforward.