예제 #1
0
    def _update_hyperstate2(self, X, y, update_hyperstate):
        if update_hyperstate:
            basis = _basis(X, self.random_matrix, self.bias, self.basis_dim,
                           self.length_scale, self.signal_sd)
            basis = np.expand_dims(basis, axis=1)
            y = y[..., np.newaxis]
            XX_tiled_new = self.XX_tiled + np.matmul(
                np.transpose(basis, [0, 2, 1]), basis)
            Xy_tiled_new = self.Xy_tiled + np.matmul(
                np.transpose(basis, [0, 2, 1]), y)

            XX_tiled, Xy_tiled, Llower_tiled = [], [], []
            for XX_old, XX_new, Xy_old, Xy_new, Llower_old in zip(
                    self.XX_tiled, XX_tiled_new, self.Xy_tiled, Xy_tiled_new,
                    self.Llower_tiled):
                try:
                    tmp = spla.cholesky(XX_new +
                                        (self.noise_sd / self.prior_sd)**2 *
                                        np.eye(self.basis_dim),
                                        lower=True)
                    XX_tiled.append(XX_new.copy())
                    Xy_tiled.append(Xy_new.copy())
                    Llower_tiled.append(tmp.copy())
                except Exception as e:
                    print(e)
                    XX_tiled.append(XX_old.copy())
                    Xy_tiled.append(Xy_old.copy())
                    Llower_tiled.append(Llower_old.copy())
            self.XX_tiled = np.stack(XX_tiled, axis=0)
            self.Xy_tiled = np.stack(Xy_tiled, axis=0)
            self.Llower_tiled = np.stack(Llower_tiled, axis=0)
예제 #2
0
    def _update_hyperstate(self, X, y, update_hyperstate):
        if update_hyperstate:
            basis = _basis(X, self.random_matrix, self.bias, self.basis_dim, self.length_scale, self.signal_sd)

            self.Llower_tiled = self.Llower_tiled.transpose([0, 2, 1])
            assert len(self.Llower_tiled) == len(basis)
            for i in range(len(self.Llower_tiled)):
                cholupdate(self.Llower_tiled[i], basis[i].copy())
            self.Llower_tiled = self.Llower_tiled.transpose([0, 2, 1])

            self.Xy_tiled += np.matmul(basis[:, None, :].transpose([0, 2, 1]), y[:, None, :])
예제 #3
0
    def _predict(self, X, update_hyperstate):
        if update_hyperstate:
            basis = _basis(X, self.random_matrix, self.bias, self.basis_dim, self.length_scale, self.signal_sd)
            basis = np.expand_dims(basis, axis=1)

            LinvXT = solve_triangular(self.Llower_tiled, np.transpose(basis, [0, 2, 1]))
            pred_sigma = np.sum(np.square(LinvXT), axis=1)*self.noise_sd**2+self.noise_sd**2
            tmp0 = np.transpose(solve_triangular(self.Llower_tiled, np.transpose(basis, [0, 2, 1])), [0, 2, 1])
            tmp1 = solve_triangular(self.Llower_tiled, self.Xy_tiled)
            pred_mu = np.matmul(tmp0, tmp1)
            pred_mu = np.squeeze(pred_mu, axis=-1)
            return pred_mu, pred_sigma
        else:
            return RegressionWrapper._predict(self, X)