def aBl_einsum(self):
if self._aBBl is None:
sigmas = np.array([[c.sigmas for c in d.components] for d in self.obs_distns])
Js = -1./(2*sigmas)
mus = np.array([[c.mu for c in d.components] for d in self.obs_distns])
# all_likes is T x Nstates x Ncomponents
all_likes = \
(np.einsum('td,td,nkd->tnk',self.data,self.data,Js)
- np.einsum('td,nkd,nkd->tnk',self.data,2*mus,Js))
all_likes += (mus**2*Js - 1./2*np.log(2*np.pi*sigmas)).sum(2)
# weights is Nstates x Ncomponents
weights = np.log(np.array([d.weights.weights for d in self.obs_distns]))
all_likes += weights[na,...]
# aBl is T x Nstates
aBl = self._aBl = np.logaddexp.reduce(all_likes, axis=2)
aBl[np.isnan(aBl).any(1)] = 0.
aBBl = self._aBBl = np.empty((self.Tblock,self.num_states))
for idx, (start,stop) in enumerate(self.changepoints):
aBBl[idx] = aBl[start:stop].sum(0)
return self._aBBl
评论列表
文章目录