# -*- coding: utf-8 -*- import numpy as np import dspBox as dsp Tobser=[] file=open('Observation_1.txt','r') obser1_r =file.read() Tobser.append(dsp.str2ndar(obser1_r)) file.close file=open('Observation_2.txt','r') obser2_r =file.read() Tobser.append(dsp.str2ndar(obser2_r)) file.close file=open('Observation_3.txt','r') obser3_r =file.read() Tobser.append(dsp.str2ndar(obser3_r)) file.close A1=np.array([[0.2,0.7,0.1],[0.1,0.2,0.7],[0.7,0.1,0.2]]) B1=np.array([[0.5,0.4,0.1],[0.7,0.2,0.1],[0.7,0.1,0.2]]) pi1=np.array([0.7,0.2,0.1]) A2=np.array([[0.7,0.2,0.1],[0.3,0.6,0.1],[0.1,0.2,0.7]]) B2=np.array([[0.1,0.8,0.1],[0.2,0.7,0.1],[0.4,0.5,0.1]]) pi2=np.array([0.1,0.7,0.2]) A3=np.array([[0.2,0.7,0.1],[0.6,0.3,0.1],[0.2,0.7,0.1]]) B3=np.array([[0.1,0.2,0.7],[0.2,0.2,0.6],[0.3,0.1,0.6]]) pi3=np.array([0.2,0.2,0.6]) TA=np.array([A1,A2,A3]) TB=np.array([B1,B2,B3]) Tpi=np.array([pi1,pi2,pi3])
import numpy as np from dspBox import str2ndar a1 = np.array([[0.3, 0.3, 0.4], [0.3, 0.3, 0.4], [0.4, 0.4, 0.2]]) b1 = np.array([[0.4, 0.4, 0.2], [0.3, 0.3, 0.4], [0.3, 0.3, 0.4]]) pi1 = np.array([0.3, 0.3, 0.4]) a ,b, pi = [a1.copy() for _ in range(3)], [b1.copy() for _ in range(3)], \ [pi1.copy() for _ in range(3)] obs = [str2ndar(l) for l in iter(open('./Obervations.txt', 'r'))] ans = open('./Observations_Ans.txt', 'w') model = [open('./model_{:d}.txt'.format(i + 1), 'w') for i in range(3)] tr = [[] for _ in range(3)] for index in range(3): tr[index] = [str2ndar(l) for l in \ iter(open('./training/model_{:d}_training.txt'.format(index+1), 'r'))] for mi in range(3): # model index trsize = len(tr[mi]) for iteration in range(5): # iter index size = len(tr[mi][0]) xi, gm = np.zeros((trsize, size, 3, 3)), np.zeros((trsize, size, 3)) for ti in range(trsize): # training seq index # =====forward algorithm===== forwardp = np.zeros((size, 3)) forwardp[0] = [pi[mi][state] * b[mi][state, tr[mi][ti][0]] \ for state in range(3)] for i in range(1, size): # time index for state in range(3): for from_ in range(3): forwardp[i, state] += forwardp[i-1, from_] * \ a[mi][from_, state] * b[mi][state, tr[mi][ti][i]] # =====backward algorithm=====
import numpy as np from dspBox import str2ndar obs1 = str2ndar(open('obser1.txt', 'r').read()) obs2 = str2ndar(open('obser2.txt', 'r').read()) obs3 = str2ndar(open('obser3.txt', 'r').read()) # obser3.txt要跟其他兩個一樣多加一空行才能正確讀取到最後一個字 a1 = np.array([[0.2, 0.7, 0.1], [0.1, 0.2, 0.7], [0.7, 0.1, 0.2]]) b1 = np.array([[0.5, 0.4, 0.1], [0.7, 0.2, 0.1], [0.7, 0.1, 0.2]]) pi1 = np.array([0.7, 0.2, 0.1]) a2 = np.array([[0.7, 0.2, 0.1], [0.3, 0.6, 0.1], [0.1, 0.2, 0.7]]) b2 = np.array([[0.1, 0.8, 0.1], [0.2, 0.7, 0.1], [0.4, 0.5, 0.1]]) pi2 = np.array([0.1, 0.7, 0.2]) a3 = np.array([[0.2, 0.7, 0.1], [0.6, 0.3, 0.1], [0.2, 0.7, 0.1]]) b3 = np.array([[0.1, 0.2, 0.7], [0.2, 0.2, 0.6], [0.3, 0.1, 0.6]]) pi3 = np.array([0.2, 0.2, 0.6]) obs, a, b, pi = [obs1, obs2, obs3], [a1, a2, a3], [b1, b2, b3], [pi1, pi2, pi3] # ------------------- for obsi in range(3): # Index of observation print("obser" + str(obsi + 1)) for mi in range(3): # Index of model # =====forward algorithm===== forwardp = np.zeros((50, 3)) forwardp[0] = [ pi[mi][state] * b[mi][state, obs[obsi][0]] for state in range(3) ] for i in range(1, 50): for state in range(3): for from_ in range(3): forwardp[i, state] += forwardp[i - 1, from_] * a[mi][
# -*- coding: utf-8 -*- import numpy as np import dspBox as dsp file = open('obser1.txt', 'r') obser1_r = file.read() #print(obser1_r) obser1 = dsp.str2ndar(obser1_r) file.close file = open('obser2.txt', 'r') obser2_r = file.read() obser2 = dsp.str2ndar(obser2_r) file.close file = open('obser3.txt', 'r') obser3_r = file.read() obser3 = dsp.str2ndar(obser3_r) file.close A1 = np.array([[0.2, 0.7, 0.1], [0.1, 0.2, 0.7], [0.7, 0.1, 0.2]]) B1 = np.array([[0.5, 0.4, 0.1], [0.7, 0.2, 0.1], [0.7, 0.1, 0.2]]) pi1 = np.array([0.7, 0.2, 0.1]) A2 = np.array([[0.7, 0.2, 0.1], [0.3, 0.6, 0.1], [0.1, 0.2, 0.7]]) B2 = np.array([[0.1, 0.8, 0.1], [0.2, 0.7, 0.1], [0.4, 0.5, 0.1]]) pi2 = np.array([0.1, 0.7, 0.2]) A3 = np.array([[0.2, 0.7, 0.1], [0.6, 0.3, 0.1], [0.2, 0.7, 0.1]]) B3 = np.array([[0.1, 0.2, 0.7], [0.2, 0.2, 0.6], [0.3, 0.1, 0.6]]) pi3 = np.array([0.2, 0.2, 0.6]) #print(obser1) p_f = [] p_b = []
import numpy as np from dspBox import str2ndar obs1 = str2ndar(open('observation1.txt', 'r').read()) obs2 = str2ndar(open('observation2.txt', 'r').read()) obs3 = str2ndar(open('observation3.txt', 'r').read()) # 助教附的oberservation3.txt跟上次一樣沒有換行,所以只會讀到49個狀態,如果加了換行可以讀到50個。 a1 = np.array([[0.2, 0.7, 0.1], [0.1, 0.2, 0.7], [0.7, 0.1, 0.2]]) b1 = np.array([[0.5, 0.4, 0.1], [0.7, 0.2, 0.1], [0.7, 0.1, 0.2]]) pi1 = np.array([0.7, 0.2, 0.1]) a2 = np.array([[0.7, 0.2, 0.1], [0.3, 0.6, 0.1], [0.1, 0.2, 0.7]]) b2 = np.array([[0.1, 0.8, 0.1], [0.2, 0.7, 0.1], [0.4, 0.5, 0.1]]) pi2 = np.array([0.1, 0.7, 0.2]) a3 = np.array([[0.2, 0.7, 0.1], [0.6, 0.3, 0.1], [0.2, 0.7, 0.1]]) b3 = np.array([[0.1, 0.2, 0.7], [0.2, 0.2, 0.6], [0.3, 0.1, 0.6]]) pi3 = np.array([0.2, 0.2, 0.6]) obs, a ,b, pi = [obs1, obs2, obs3], [a1, a2, a3], [b1, b2, b3], [pi1, pi2, pi3] # ------------------- for obsi in range(3): # Index of observation size = len(obs[obsi]) print("\nobser" + str(obsi + 1)) for mi in range(3): # Index of model # =====viterbi algorithm===== p = np.zeros((size, 3)) # possibility s = np.zeros((size, 3)) # max state p[0] = [pi[mi][state] * b[mi][state, obs[obsi][0]] for state in range(3)] s[0] = [state for state in range(3)] for i in range(1, size): for state in range(3): evaluate = [p[i-1, from_] * a[mi][from_, state] * b[mi][state, obs[obsi][i]] for from_ in range(3)] p[i, state] = np.max(evaluate)