def cycle(self, max_iters, min_change): self.trans_list = [(self.A[0][1], self.A[1][0])] for i in range(max_iters): sum_of_probs = 0.0 for word in self.words: alpha, unused_beta = self.forward_backward(word) sum_of_probs += sum(alpha[len(alpha) - 1]) if self.VERBOSE_FLAG: output.sum_of_probs(sum_of_probs, i, self.out) diff = sum_of_probs - self.sum_of_probs if diff < min_change: break self.sum_of_probs = sum_of_probs self.sum_of_probs_list.append(self.sum_of_probs) for word in self.words: self.counts[word] = self.soft_count(word) new_B_values, normalizers = self.maximize_emission() new_A_values = self.maximize_transition(normalizers) new_Pi_values = self.maximize_Pi() self.B = new_B_values self.A = new_A_values self.Pi = new_Pi_values self.trans_list.append((self.A[0][1], self.A[1][0])) if self.VERBOSE_FLAG: output.letter_prob(self.B, self.states, self.out) output.log_letter_prob(self.B, self.states, self.out) output.A_output(self.A, self.states, self.out) output.show_Pi(self.Pi, self.out) output.sum_of_probs(sum_of_probs, i, self.out)
def maximize_Pi(self): if self.VERBOSE_FLAG: output.max_Pi(self.out) new_Pi = [0 for i in self.states] for word in self.words: count = self.counts[word] for i in self.states: for j in self.states: new_Pi[i] += count[0][i][j] Z = len(self.words) for state in self.states: new_Pi[state] = new_Pi[state] / Z if self.VERBOSE_FLAG: output.show_Pi(new_Pi, self.out) return new_Pi