def lml_derivative_over_cov(self, dQS): from numpy_sugar.linalg import cho_solve, ddot, dotd self._update() L = self._posterior.L() Q = self._posterior.cov["QS"][0][0] ttau = self._site.tau teta = self._site.eta diff = teta - ttau * self._posterior.mean v0 = dot(dQS[0][0], dQS[1] * dot(dQS[0][0].T, diff)) v1 = ttau * dot(Q, cho_solve(L, dot(Q.T, diff))) dlml = 0.5 * dot(diff, v0) dlml -= dot(v0, v1) dlml += 0.5 * dot(v1, dot(dQS[0][0], dQS[1] * dot(dQS[0][0].T, v1))) dqs = ddot(dQS[1], dQS[0][0].T, left=True) diag = dotd(dQS[0][0], dqs) dlml -= 0.5 * sum(ttau * diag) tmp = cho_solve(L, dot(ddot(Q.T, ttau, left=False), dQS[0][0])) dlml += 0.5 * sum(ttau * dotd(Q, dot(tmp, dqs))) return dlml
def compute(self, covariates, X): A = self._A L = self._L Q = self._Q C = self._C AMs0 = ddot(A, covariates, left=True) dens0 = AMs0 - ddot(A, dot(Q, cho_solve(L, dot(Q.T, AMs0))), left=True) noms0 = dot(self._beta_nom, covariates) AMs1 = ddot(A, X, left=True) dens1 = AMs1 - ddot(A, dot(Q, cho_solve(L, dot(Q.T, AMs1))), left=True) noms1 = dot(self._beta_nom, X) row00 = sum(covariates * dens0, 0) row01 = sum(covariates * dens1, 0) row11 = sum(X * dens1, 0) betas0 = noms0 * row11 betas0 -= noms1 * row01 betas1 = -noms0 * row01 betas1 += noms1 * row00 denom = row00 * row11 denom -= row01**2 with errstate(divide='ignore', invalid='ignore'): betas0 /= denom betas1 /= denom betas0 = nan_to_num(betas0) betas1 = nan_to_num(betas1) ms = dot(covariates, betas0[newaxis, :]) ms += X * betas1 QBiQtCteta = self._QBiQtCteta teta = self._teta Am = ddot(A, ms, left=True) w4 = dot(C * teta, ms) w4 -= dot(QBiQtCteta, Am) QBiQtAm = dot(Q, cho_solve(L, dot(Q.T, Am))) w5 = -sum(Am * ms, 0) w5 += sum(Am * QBiQtAm, 0) w5 /= 2 lmls = self._lml_const + w4 + w5 return (lmls, betas1)
def _QBiQtAm(self): Q = self._Q L = self._L() A = self._A() m = self.m() return dot(Q, cho_solve(L, dot(Q.T, A * m)))
def _optimal_tbeta_denom(self): L = self._L() Q = self._Q AM = ddot(self._A(), self._tM, left=True) QBiQtAM = dot(Q, cho_solve(L, dot(Q.T, AM))) v = dot(self._tM.T, AM) - dot(AM.T, QBiQtAM) if not is_all_finite(v): raise ValueError("tbeta_denom should not be %s." % str(v)) return v
def LQt(self): from numpy_sugar.linalg import cho_solve if self._LQt_cache is not None: return self._LQt_cache L = self.L() Q = self._cov["QS"][0][0] self._LQt_cache = cho_solve(L, Q.T) return self._LQt_cache
def lml(self): from numpy_sugar.linalg import cho_solve if self._cache["lml"] is not None: return self._cache["lml"] self._update() L = self._posterior.L() Q, S = self._posterior.cov["QS"] Q = Q[0] ttau = self._site.tau teta = self._site.eta ctau = self._cav["tau"] ceta = self._cav["eta"] m = self._posterior.mean TS = ttau + ctau lml = [ -log(L.diagonal()).sum(), -0.5 * sum(log(S)), # lml += 0.5 * sum(log(ttau)), +0.5 * dot(teta, dot(Q, cho_solve(L, dot(Q.T, teta)))), -0.5 * dot(teta, teta / TS), +dot(m, teta) - 0.5 * dot(m, ttau * m), -0.5 * dot(m * ttau, dot(Q, cho_solve(L, dot(Q.T, 2 * teta - ttau * m)))), +sum(self._moments["log_zeroth"]), +0.5 * sum(log(TS)), # lml -= 0.5 * sum(log(ttau)), -0.5 * sum(log(ctau)), +0.5 * dot(ceta / TS, ttau * ceta / ctau - 2 * teta), ] lml = fsum(lml) if not isfinite(lml): raise ValueError("LML should not be %f." % lml) self._cache["lml"] = lml return lml
def lml_derivative_over_mean(self, dm): from numpy_sugar.linalg import cho_solve self._update() L = self._posterior.L() Q = self._posterior.cov["QS"][0][0] ttau = self._site.tau teta = self._site.eta diff = teta - ttau * self._posterior.mean dlml = dot(diff, dm) dlml -= dot(diff, dot(Q, cho_solve(L, dot(Q.T, (ttau * dm.T).T)))) return dlml
def test_cho_solve(): random = RandomState(0) L = random.randn(2, 2) b = random.randn(2) assert_allclose(cho_solve(L, b), [0.82259811, -0.40095633])
def _QBiQtCteta(self): Q = self._Q L = self._L() C = self._C() teta = self._sitelik_eta return dot(Q, cho_solve(L, dot(Q.T, C * teta)))
def _BiQt(self): Q = self._Q return cho_solve(self._L(), Q.T)