def getXi(data, hmm):
    alpha = a.forward(data, hmm)
    beta = a.backward(data, hmm)
    likelihood = beta[0][0]
    xi = [[[[0, 0], [0, 0]], [[0, 0], [0, 0]]]]
    for t in range(len(data) - 1):
        xi.append([[[0, 0], [0, 0]], [[0, 0], [0, 0]]])
    data = "#" + data
    t = 0
    for h in range(len(data) - 1):
        for i in range(0, 2):
            for j in range(0, 2):
                ptrans = a.getTransitionProbability(i, j, hmm)
                pemit = a.getEmissionProbability(j, data[t + 1], hmm)
                temp = a.multiplyProbability(alpha[t][i], ptrans)
                temp = a.multiplyProbability(temp, pemit)
                temp = a.multiplyProbability(temp, beta[t + 1][j])
                xi[t][i][j] = a.divideProbability(temp, likelihood)
        t += 1
    return xi
예제 #2
0
def viterbi(data, hmm):
	alpha = [[[1,0],[0,0]]]
	t = 0
	track = [[],[]]
	for c in data:
		t+=1
		alpha.append([[0, 0],[0, 0]])
		for j in range(0, 2):
			cand = [[0.0, 0],[0.0,0]]
			for i in range(0,2):
				ptrans = a.getTransitionProbability(i, j, hmm)
				cand[i]=a.multiplyProbability(alpha[t-1][i], ptrans)
			if a.compareProbability(cand[0], cand[1])==1:
				better=cand[0]
				track[j].append(0)
			else:
				better=cand[1]
				track[j].append(1)
			pemit = a.getEmissionProbability(j, c, hmm)
			prob = a.multiplyProbability(better, pemit)
#			print prob 
			alpha[t][j]=prob
#		print alpha[t]
		#print scale[t]
	if a.compareProbability(alpha[t][0], alpha[t][1])==1:
		start=0
	else:
		start=1
	s = ''
#	print track[0]
	for i in range(len(track[0])-1, -1, -1):
		if start==0:
			s='A'+s
		else:
			s='B'+s
		start = track[start][i]
	return s