免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2975 | 回复: 1
打印 上一主题 下一主题

【求大神指点】使用某个字典变量中的某个键值时出错但是没找到未返回的值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-12-30 21:03 |只看该作者 |倒序浏览

新手求教,希望各位大神不要嫌弃。。。时间紧迫所以羞愧的当半个伸手党。。会好好学习的哭唧唧。。

错误如下:
  1. /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py" --multiproc --qt-support --client 127.0.0.1 --port 59067 --file /Users/tt/Desktop/baum-welch.py
  2. warning: Debugger speedups using cython not found. Run '"/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5" "/Applications/PyCharm CE.app/Contents/helpers/pydev/setup_cython.py" build_ext --inplace' to build.
  3. pydev debugger: process 26567 is connecting

  4. Connected to pydev debugger (build 171.4694.38)
  5. Traceback (most recent call last):
  6. at t=0, scale is [ 0.4995  0.      0.      0.      0.      0.      0.      0.      0.      0.    ]
  7.   File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1591, in <module>
  8. 0.333333333333
  9. 0.5
  10.     globals = debugger.run(setup['file'], None, None, is_module)
  11. 0.166666666667
  12.   File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1018, in run
  13. 前向一次的局部概率矩阵是:  [[ 0.33333333  0.5         0.16666667]
  14. [ 0.36363636  0.40909091  0.22727273]
  15. [ 0.36144578  0.43373494  0.20481928]
  16. [ 0.36334405  0.42684887  0.20980707]
  17. [ 0.3211513   0.12639652  0.55245219]
  18. [ 0.3274895   0.51073717  0.16177333]
  19. [ 0.30538114  0.11378704  0.58083182]
  20. [ 0.32955045  0.17497844  0.49547111]
  21. [ 0.33154192  0.16520629  0.5032518 ]
  22. [ 0.33293248  0.16687277  0.50019475]]
  23. 前向求出的scale is : None
  24.     pydev_imports.execfile(file, globals, locals)  # execute the script
  25.   File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
  26.     exec(compile(contents+"\n", file, 'exec'), glob, loc)
  27.   File "/Users/tt/Desktop/baum-welch.py", line 72, in <module>
  28.     backwardWithScale(forward_scale, observation_sequence, partial_prob_backward , log_prob_backward)  
  29.   File "/Users/tt/Desktop/baum-welch.py", line 55, in backwardWithScale
  30.     partial_prob[T-1][i] = 1.0/scale[T-1]
  31. TypeError: 'NoneType' object is not subscriptable

  32. Process finished with exit code 1
复制代码


代码如下:
  1. # -*- coding: utf-8 -*-
  2. """
  3. Spyder Editor

  4. This is a temporary script file.
  5. """

  6. import numpy as np
  7. import math
  8. class hmm:
  9.     M = 2
  10.     N = 3
  11.     A =  [[0.500, 0.375, 0.125],  
  12.           [0.250, 0.125, 0.625],  
  13.           [0.250, 0.375, 0.375]]
  14.     B = [[0.50, 0.50],  
  15.          [0.75, 0.25],  
  16.          [0.25, 0.75]]
  17.     PI = [0.333, 0.333, 0.333]
  18. observation_sequence = [0, 0, 0, 0, 1, 0, 1, 1, 1, 1]
  19. T = len(observation_sequence)
  20. partial_prob_forward = np.zeros((T, hmm.N))
  21. log_prob_forward = 0.

  22. def forwardWithScale(observation_sequence, partial_prob, log_prob_forward):
  23.     scale = np.zeros(T)
  24.     for i in range(hmm.N):
  25.         partial_prob[0][i] = hmm.PI[i] * hmm.B[i][observation_sequence[0]]  
  26.         scale[0] += partial_prob[0][i]
  27.     print ('at t=0, scale is',scale)
  28.     for i in range(hmm.N):
  29.         partial_prob[0][i] /= scale[0]  
  30.         print (partial_prob[0][i])
  31.     for t in range(1, T):
  32.         for j in range(hmm.N):
  33.             temp = 0.
  34.             for i in range(hmm.N):
  35.                 temp += partial_prob[t-1][i] * hmm.A[i][j]
  36.             partial_prob[t][j] = temp*hmm.B[j][observation_sequence[t]]  
  37.             scale[t] += partial_prob[t][j]
  38.         for j in range(hmm.N):
  39.             partial_prob[t][j] /= scale[t]
  40.     for t in range(T):
  41.         log_prob_forward += math.log(scale[t])

  42. forward_scale = forwardWithScale(observation_sequence, partial_prob_forward, log_prob_forward)  
  43. print  ("前向一次的局部概率矩阵是: ", partial_prob_forward )
  44. plogprobinit = log_prob_forward  #log P(O |intial model)

  45. partial_prob_backward = np.zeros((T, hmm.N))  
  46. log_prob_backward = 0.  
  47.   
  48. def backwardWithScale(scale, observation_sequence, partial_prob, log_prob_backward):
  49.     for i in range(hmm.N):
  50.         partial_prob[T-1][i] = 1.0/scale[T-1]
  51.     t = T-2
  52.     while t >= 0:
  53.         for j in range(hmm.N):
  54.             temp = 0.
  55.             for i in range(hmm.N):
  56.                 temp += partial_prob[t+1][i] * hmm.A[i][j] * hmm.B[j][observation_sequence[t+1]]
  57.             partial_prob[t][j] = temp / scale[t]
  58.         t = t-1
  59.     for t in  range(T):
  60.         log_prob_backward += partial_prob[1][i]
  61.         
  62. print ("前向求出的scale is :",  forward_scale)
  63. backwardWithScale(forward_scale, observation_sequence, partial_prob_backward , log_prob_backward)  
  64. print ("后向的局部概率矩阵是: ", partial_prob_backward )

  65. gamma = np.zeros((T,hmm.N))  
  66. def computeGamma(gamma):
  67.     for t in range(T):
  68.         denominator = 0.0
  69.         for j in range(hmm.N):
  70.             gamma[t][j] = partial_prob_forward[t][j] * partial_prob_backward[t][j]  
  71.             denominator += gamma[t][j]
  72.         for i in range(hmm.N):
  73.             gamma[t][i] = gamma[t][i] / denominator
  74.             
  75. computeGamma(gamma)
  76. print ("最后得到的gamma矩阵是: ", gamma )
  77.   
  78. xi = np.zeros((T, hmm.N, hmm.N))  
  79. def computeXi(xi, observation_sequence):
  80.     for t in range(T-1):
  81.         temp = 0.  
  82.         for i in range(hmm.N):
  83.             for j in range(hmm.N):
  84.                 #
  85.                 xi[t][i][j] = partial_prob_forward[t][i]*hmm.A[i][j]*hmm.B[j][observation_sequence[t+1]]*partial_prob_backward[t+1][j]
  86.                 temp += xi[t][i][j]
  87.         for i in range(hmm.N):
  88.             for j in range(hmm.N):
  89.                 xi[t][i][j] = xi[t][i][j] / temp
  90. computeXi(xi, observation_sequence)  
  91. print ("最后得到的 \epsilon 矩阵是: ", xi )

  92. print ("开始更新PI,  A ,  B,  动量是0.999 ")
  93. for i in range(hmm.N):
  94.     hmm.PI[i] = 0.001 + 0.999 * gamma[0][i]
  95. print ("更新后的初始状态矩阵是: ", hmm.PI)

  96. for i in range(hmm.N):
  97.     denominatorA =  0.
  98.     for t in range(T-1):
  99.         denominatorA += gamma[t][i]
  100.     for j in range(hmm.N):
  101.         numeratorA = 0.
  102.         for t in range(T-1):
  103.             numeratorA += xi[t][i][j]
  104.         hmm.A[i][j] = 0.001 + 0.999 * numeratorA / denominatorA
  105.     denominatorB = denominatorA + gamma[T][i]  
  106.     for k in range(hmm.M):
  107.         numeratorB = 0.
  108.         for t in range(T):
  109.             if observation_sequence[t] == k:
  110.                 numeratorB += gamma[t][i]
  111.         hmm.B[i][k] = 0.001 + 0.999 * numeratorB / denominatorB
  112.         
  113. print( "更新后的状态转移矩阵A是: ", hmm.A)
  114. print( "更新后的生成概率矩阵B是: ", hmm.B)
复制代码



万分感谢!!!!!!!!

论坛徽章:
0
2 [报告]
发表于 2017-12-30 21:57 |只看该作者
第46行,forward_scale 变量内容是None啊,forwardWithScale函数没有返回值啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP