Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.66 KB | None | 0 0
  1. import numpy as np
  2. import generator as gn
  3.  
  4. def Calc_alpha(A,B,Pi,V,O,T,N,K):
  5. alpha = []
  6. for k in range(K):
  7. alpha.append([])
  8. column = V.index(O[k][0])
  9. alpha[k].append([Pi[i]*B[i][column] for i in range(N)])
  10. for t in range(1,T):
  11. cur = []
  12. column = V.index(O[k][t])
  13. for i in range(N):
  14. temp = sum([alpha[k][t-1][j] * A[j][i] for j in range(N)])
  15. cur.append(B[i][column] * temp)
  16. alpha[k].append(cur)
  17. return alpha
  18.  
  19.  
  20. def Calc_betta(A,B,V,O,T,N,K):
  21. betta = []
  22.  
  23. for k in range(K):
  24. betta.append([])
  25. betta[k].append([1,1,1])
  26. for t in range(1,T):
  27. cur = []
  28. column = V.index(O[k][T-t])
  29. for i in range(N):
  30. cur.append(sum([betta[k][t - 1][j] * B[j][column]*A[i][j] for j in range(N)]))
  31. betta[k].append(cur)
  32.  
  33. for i in betta:
  34. i.reverse()
  35.  
  36. return betta
  37.  
  38.  
  39. def Calc_gamma(alpha,betta,T,N,K):
  40. gamma = []
  41.  
  42. for k in range(K):
  43. gamma.append([])
  44. P = sum(alpha[k][T-1])
  45. for t in range(T):
  46. gamma[k].append([(alpha[k][t][i] * betta[k][t][i]) / P for i in range(N)])
  47.  
  48. return gamma
  49.  
  50. def Calc_ksi(alpha,betta,A,B,O,V,T,N,K):
  51.  
  52. ksi = []
  53.  
  54. for i in range(K):
  55. ksi.append([])
  56. P = sum(alpha[i][T-1])
  57. for j in range(T-1):
  58. ksi[i].append([])
  59. cur = []
  60. column = V.index(O[i][j+1])
  61. for k in range(N):
  62. cur_k = []
  63. for z in range(N):
  64. cur_k.append((alpha[i][j][k] * A[k][z]*B[z][column]*betta[i][j+1][z]) / P)
  65. cur.append(cur_k)
  66. ksi[i][j].append(cur)
  67.  
  68. return ksi
  69.  
  70.  
  71. def Estimate_Pi(gamma,K,N):
  72. return [sum([k[0][n] for k in gamma]) / K for n in range(N)]
  73.  
  74. def Estimate_A(ksi,gamma,N,K,T):
  75. est_A = []
  76.  
  77. for i in range(N):
  78. cur = []
  79. sum_gamma = sum([sum([t[i] for t in k]) for k in gamma])
  80. for j in range(N):
  81. sum_ksi = sum([sum([t[0][i][j] for t in k]) for k in ksi])
  82. cur.append(sum_ksi/sum_gamma)
  83. est_A.append(cur)
  84.  
  85. return est_A
  86.  
  87. def Estimate_B(gamma,N,K,T,O,V):
  88. est_B = []
  89.  
  90. for i in range(N):
  91. cur = []
  92. sum_gamma = sum([sum([t[i] for t in k]) for k in gamma])
  93. for j in range(N):
  94. sum_gamma_V = 0
  95. for k in range(K):
  96. for t in range(T-1):
  97. if V[j] == O[k][t]:
  98. sum_gamma_V += gamma[k][t][i]
  99.  
  100. cur.append(sum_gamma_V/sum_gamma)
  101. est_B.append(cur)
  102.  
  103. return est_B
  104.  
  105. def Calc_Log(alpha,K,T):
  106. L = 0
  107.  
  108. for k in range(K):
  109. L += np.log(sum(alpha[k][T-1]))
  110.  
  111. return L
  112.  
  113.  
  114. def iter_algoritm(A,B,O,Pi,V,K,T,N):
  115.  
  116. alpha = Calc_alpha(A,B,Pi,V,O,T,len(B),K)
  117. betta = Calc_betta(A,B,V,O,T,len(B),K)
  118. gamma = Calc_gamma(alpha,betta,T,len(B),K)
  119. ksi = Calc_ksi(alpha,betta,A,B,O,V,T,len(B),K)
  120. est_pi = Estimate_Pi(gamma,K,N)
  121. est_A = Estimate_A(ksi,gamma,len(B),K,T)
  122. est_B = Estimate_B(gamma,len(B),K,T,O,V)
  123.  
  124. IterL = Calc_Log(alpha,K,T)
  125. IterL_next = Calc_Log(Calc_alpha(est_A,est_B,est_pi,V,O,T,len(B),K),K,T)
  126.  
  127. accuracy = abs(IterL_next - IterL)
  128.  
  129. print(est_B)
  130.  
  131. flag = accuracy > 1e-7
  132.  
  133. return est_A,est_B,est_pi,flag,accuracy
  134.  
  135. def Baum_Welch(A,B,O,Pi,V,K,T,N,max_iter):
  136.  
  137. pred_A,pred_B,pred_Pi = A,B,Pi
  138.  
  139. next_A,next_B,next_Pi,flag,accuracy = iter_algoritm(pred_A,pred_B,O,pred_Pi,V,K,T,N)
  140.  
  141. iteration = 1
  142. while flag and iteration < max_iter:
  143. iteration += 1
  144. pred_A,pred_B,pred_Pi = next_A,next_B,next_Pi
  145. next_A,next_B,next_Pi,flag,accuracy = iter_algoritm(pred_A,pred_B,O,pred_Pi,V,K,T,N)
  146. print('Iteration:',iteration)
  147. print('Accuracy:',accuracy)
  148.  
  149. print('Iteration:',iteration)
  150. print('Accuracy:',accuracy)
  151. print(pred_B)
  152.  
  153.  
  154. def get_params():
  155. file = open('input_test_1.txt','r')
  156. A = []
  157. B = []
  158. Pi = []
  159.  
  160.  
  161. if file.readline() == 'Pi\n':
  162. buff = file.readline()
  163.  
  164. while buff != '\n':
  165. buff = buff.split(' ')
  166. for i in buff:
  167. Pi.append(float(i))
  168.  
  169. buff = file.readline()
  170. else:
  171. print('Ошибка считывания файла в блоке V')
  172.  
  173. if file.readline() == 'A\n':
  174. buff = file.readline()
  175. while buff != '\n':
  176.  
  177. buff = buff.split(' ')
  178. A.append([float(i) for i in buff])
  179. buff = file.readline()
  180. else:
  181. print('Ошибка считывания файла в блоке A')
  182.  
  183.  
  184. if file.readline() == 'B\n':
  185. buff = file.readline()
  186. while buff:
  187.  
  188. buff = buff.split(' ')
  189. B.append([float(i) for i in buff])
  190. buff = file.readline()
  191. else:
  192. print('Ошибка считывания файла в блоке B')
  193.  
  194. file.close()
  195.  
  196. return A,B,Pi
  197.  
  198. def main():
  199. print('Введите K:')
  200. K = 100
  201. print('Введите T:')
  202. T = 100
  203. print('Введите максимально кол-ва итераций:')
  204. M_iter = 100
  205.  
  206. #int(input())
  207.  
  208. O,V = gn.test(K,T)
  209. A,B,Pi = get_params()
  210. Baum_Welch(A,B,O,Pi,V,K,T,len(B),M_iter)
  211.  
  212. if __name__ == '__main__':
  213.  
  214. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement