- 论坛徽章:
- 0
|
新手求教,希望各位大神不要嫌弃。。。时间紧迫所以羞愧的当半个伸手党。。会好好学习的哭唧唧。。
错误如下:
- /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
- 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.
- pydev debugger: process 26567 is connecting
- Connected to pydev debugger (build 171.4694.38)
- Traceback (most recent call last):
- at t=0, scale is [ 0.4995 0. 0. 0. 0. 0. 0. 0. 0. 0. ]
- File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1591, in <module>
- 0.333333333333
- 0.5
- globals = debugger.run(setup['file'], None, None, is_module)
- 0.166666666667
- File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1018, in run
- 前向一次的局部概率矩阵是: [[ 0.33333333 0.5 0.16666667]
- [ 0.36363636 0.40909091 0.22727273]
- [ 0.36144578 0.43373494 0.20481928]
- [ 0.36334405 0.42684887 0.20980707]
- [ 0.3211513 0.12639652 0.55245219]
- [ 0.3274895 0.51073717 0.16177333]
- [ 0.30538114 0.11378704 0.58083182]
- [ 0.32955045 0.17497844 0.49547111]
- [ 0.33154192 0.16520629 0.5032518 ]
- [ 0.33293248 0.16687277 0.50019475]]
- 前向求出的scale is : None
- pydev_imports.execfile(file, globals, locals) # execute the script
- File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
- exec(compile(contents+"\n", file, 'exec'), glob, loc)
- File "/Users/tt/Desktop/baum-welch.py", line 72, in <module>
- backwardWithScale(forward_scale, observation_sequence, partial_prob_backward , log_prob_backward)
- File "/Users/tt/Desktop/baum-welch.py", line 55, in backwardWithScale
- partial_prob[T-1][i] = 1.0/scale[T-1]
- TypeError: 'NoneType' object is not subscriptable
- Process finished with exit code 1
复制代码
代码如下:
- # -*- coding: utf-8 -*-
- """
- Spyder Editor
- This is a temporary script file.
- """
- import numpy as np
- import math
- class hmm:
- M = 2
- N = 3
- A = [[0.500, 0.375, 0.125],
- [0.250, 0.125, 0.625],
- [0.250, 0.375, 0.375]]
- B = [[0.50, 0.50],
- [0.75, 0.25],
- [0.25, 0.75]]
- PI = [0.333, 0.333, 0.333]
- observation_sequence = [0, 0, 0, 0, 1, 0, 1, 1, 1, 1]
- T = len(observation_sequence)
- partial_prob_forward = np.zeros((T, hmm.N))
- log_prob_forward = 0.
- def forwardWithScale(observation_sequence, partial_prob, log_prob_forward):
- scale = np.zeros(T)
- for i in range(hmm.N):
- partial_prob[0][i] = hmm.PI[i] * hmm.B[i][observation_sequence[0]]
- scale[0] += partial_prob[0][i]
- print ('at t=0, scale is',scale)
- for i in range(hmm.N):
- partial_prob[0][i] /= scale[0]
- print (partial_prob[0][i])
- for t in range(1, T):
- for j in range(hmm.N):
- temp = 0.
- for i in range(hmm.N):
- temp += partial_prob[t-1][i] * hmm.A[i][j]
- partial_prob[t][j] = temp*hmm.B[j][observation_sequence[t]]
- scale[t] += partial_prob[t][j]
- for j in range(hmm.N):
- partial_prob[t][j] /= scale[t]
- for t in range(T):
- log_prob_forward += math.log(scale[t])
- forward_scale = forwardWithScale(observation_sequence, partial_prob_forward, log_prob_forward)
- print ("前向一次的局部概率矩阵是: ", partial_prob_forward )
- plogprobinit = log_prob_forward #log P(O |intial model)
- partial_prob_backward = np.zeros((T, hmm.N))
- log_prob_backward = 0.
-
- def backwardWithScale(scale, observation_sequence, partial_prob, log_prob_backward):
- for i in range(hmm.N):
- partial_prob[T-1][i] = 1.0/scale[T-1]
- t = T-2
- while t >= 0:
- for j in range(hmm.N):
- temp = 0.
- for i in range(hmm.N):
- temp += partial_prob[t+1][i] * hmm.A[i][j] * hmm.B[j][observation_sequence[t+1]]
- partial_prob[t][j] = temp / scale[t]
- t = t-1
- for t in range(T):
- log_prob_backward += partial_prob[1][i]
-
- print ("前向求出的scale is :", forward_scale)
- backwardWithScale(forward_scale, observation_sequence, partial_prob_backward , log_prob_backward)
- print ("后向的局部概率矩阵是: ", partial_prob_backward )
- gamma = np.zeros((T,hmm.N))
- def computeGamma(gamma):
- for t in range(T):
- denominator = 0.0
- for j in range(hmm.N):
- gamma[t][j] = partial_prob_forward[t][j] * partial_prob_backward[t][j]
- denominator += gamma[t][j]
- for i in range(hmm.N):
- gamma[t][i] = gamma[t][i] / denominator
-
- computeGamma(gamma)
- print ("最后得到的gamma矩阵是: ", gamma )
-
- xi = np.zeros((T, hmm.N, hmm.N))
- def computeXi(xi, observation_sequence):
- for t in range(T-1):
- temp = 0.
- for i in range(hmm.N):
- for j in range(hmm.N):
- #
- 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]
- temp += xi[t][i][j]
- for i in range(hmm.N):
- for j in range(hmm.N):
- xi[t][i][j] = xi[t][i][j] / temp
- computeXi(xi, observation_sequence)
- print ("最后得到的 \epsilon 矩阵是: ", xi )
- print ("开始更新PI, A , B, 动量是0.999 ")
- for i in range(hmm.N):
- hmm.PI[i] = 0.001 + 0.999 * gamma[0][i]
- print ("更新后的初始状态矩阵是: ", hmm.PI)
- for i in range(hmm.N):
- denominatorA = 0.
- for t in range(T-1):
- denominatorA += gamma[t][i]
- for j in range(hmm.N):
- numeratorA = 0.
- for t in range(T-1):
- numeratorA += xi[t][i][j]
- hmm.A[i][j] = 0.001 + 0.999 * numeratorA / denominatorA
- denominatorB = denominatorA + gamma[T][i]
- for k in range(hmm.M):
- numeratorB = 0.
- for t in range(T):
- if observation_sequence[t] == k:
- numeratorB += gamma[t][i]
- hmm.B[i][k] = 0.001 + 0.999 * numeratorB / denominatorB
-
- print( "更新后的状态转移矩阵A是: ", hmm.A)
- print( "更新后的生成概率矩阵B是: ", hmm.B)
复制代码
万分感谢!!!!!!!!
|
|