Beispiel #1
0
    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
Beispiel #2
0
    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)
Beispiel #3
0
    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)))
Beispiel #4
0
 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
Beispiel #5
0
    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
Beispiel #6
0
    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
Beispiel #7
0
    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
Beispiel #8
0
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])
Beispiel #9
0
 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)))
Beispiel #10
0
 def _BiQt(self):
     Q = self._Q
     return cho_solve(self._L(), Q.T)