(self, x)
| 192 | return alpha[-1].sum() |
| 193 | |
| 194 | def get_state_sequence(self, x): |
| 195 | # returns the most likely state sequence given observed sequence x |
| 196 | # using the Viterbi algorithm |
| 197 | T = len(x) |
| 198 | |
| 199 | # make the emission matrix B |
| 200 | B = np.zeros((self.M, T)) |
| 201 | for j in range(self.M): |
| 202 | for t in range(T): |
| 203 | for k in range(self.K): |
| 204 | p = self.R[j,k] * mvn.pdf(x[t], self.mu[j,k], self.sigma[j,k]) |
| 205 | B[j,t] += p |
| 206 | |
| 207 | # perform Viterbi as usual |
| 208 | delta = np.zeros((T, self.M)) |
| 209 | psi = np.zeros((T, self.M)) |
| 210 | delta[0] = self.pi*B[:,0] |
| 211 | for t in range(1, T): |
| 212 | for j in range(self.M): |
| 213 | delta[t,j] = np.max(delta[t-1]*self.A[:,j]) * B[j,t] |
| 214 | psi[t,j] = np.argmax(delta[t-1]*self.A[:,j]) |
| 215 | |
| 216 | # backtrack |
| 217 | states = np.zeros(T, dtype=np.int32) |
| 218 | states[T-1] = np.argmax(delta[T-1]) |
| 219 | for t in range(T-2, -1, -1): |
| 220 | states[t] = psi[t+1, states[t+1]] |
| 221 | return states |
| 222 | |
| 223 | def likelihood_multi(self, X): |
| 224 | return np.array([self.likelihood(x) for x in X]) |
no outgoing calls
no test coverage detected