Example #1
0
    def test_mvt_pdf(self):
        cov3 = self.cov3
        mu3 = self.mu3

        mvt = MVT((0, 0), 1, 5)
        assert_almost_equal(mvt.logpdf(np.array([0., 0.])),
                            -1.837877066409345,
                            decimal=15)
        assert_almost_equal(mvt.pdf(np.array([0., 0.])),
                            0.1591549430918953,
                            decimal=15)

        mvt.logpdf(np.array([1., 1.])) - (-3.01552989458359)

        mvt1 = MVT((0, 0), 1, 1)
        mvt1.logpdf(np.array([1., 1.])) - (-3.48579549941151)  #decimal=16

        rvs = mvt.rvs(100000)
        assert_almost_equal(np.cov(rvs, rowvar=0), mvt.cov, decimal=1)

        mvt31 = MVT(mu3, cov3, 1)
        assert_almost_equal(mvt31.pdf(cov3), [
            0.0007276818698165781, 0.0009980625182293658, 0.0027661422056214652
        ],
                            decimal=17)

        mvt = MVT(mu3, cov3, 3)
        assert_almost_equal(
            mvt.pdf(cov3),
            [0.000863777424247410, 0.001277510788307594, 0.004156314279452241],
            decimal=17)
    def test_mvt_pdf(self):
        cov3 = self.cov3
        mu3 = self.mu3

        mvt = MVT((0,0), 1, 5)
        assert_almost_equal(mvt.logpdf(np.array([0.,0.])), -1.837877066409345,
                            decimal=15)
        assert_almost_equal(mvt.pdf(np.array([0.,0.])), 0.1591549430918953,
                            decimal=15)

        mvt.logpdf(np.array([1.,1.]))-(-3.01552989458359)

        mvt1 = MVT((0,0), 1, 1)
        mvt1.logpdf(np.array([1.,1.]))-(-3.48579549941151) #decimal=16

        rvs = mvt.rvs(100000)
        assert_almost_equal(np.cov(rvs, rowvar=0), mvt.cov, decimal=1)

        mvt31 = MVT(mu3, cov3, 1)
        assert_almost_equal(mvt31.pdf(cov3),
            [0.0007276818698165781, 0.0009980625182293658, 0.0027661422056214652],
            decimal=17)

        mvt = MVT(mu3, cov3, 3)
        assert_almost_equal(mvt.pdf(cov3),
            [0.000863777424247410, 0.001277510788307594, 0.004156314279452241],
            decimal=17)
Example #3
0
class GaussianBayes(object):
    def __init__(self, priormu, nu, kappa, S, data, alpha=1, true_dist=None):
        """ Initialize Gaussian distribution with data and priors
        then calculate the analytic posterior """
        self.true_dist = true_dist

        self.data = data.copy()
        self.n = data.shape[0]

        self.priormu = np.asarray(priormu)
        self.nu = nu
        self.kappa = kappa
        self.S = np.asarray(S)
        self.alpha = alpha
        self.D = self.data.shape[1]

        self.train_analytic()

    def train_analytic(self):
        """ Calculating the analytic distribution posteriors given on page 15 of Lori's 
        Optimal Classification eq 34. """
        self.nustar = self.nu + self.n

        samplemean = self.data.mean(axis=0)
        samplecov = np.cov(self.data.T)

        self.mustar = (self.nu * self.priormu + self.n * samplemean) / (self.nu + self.n)
        self.kappastar = self.kappa + self.n
        self.Sstar = (
            self.S
            + (self.n - 1) * samplecov
            + self.nu * self.n / (self.nu + self.n) * np.outer((samplemean - self.priormu), (samplemean - self.priormu))
        )

        # Now calculate effective class conditional densities from eq 55 page 21
        self.fx = MVT(
            self.mustar,
            (self.nustar + 1) / (self.kappastar - self.D + 1) / self.nustar * self.Sstar,
            self.kappastar - self.D + 1,
        )

    def eval_posterior(self, pts):
        return self.fx.logpdf(pts)
Example #4
0
class GaussianBayes(object):
    def __init__(self, priormu, nu, kappa, S, data, alpha=1, true_dist=None):
        """ Initialize Gaussian distribution with data and priors
        then calculate the analytic posterior """
        self.true_dist = true_dist

        self.data = data.copy()
        self.n = data.shape[0]

        self.priormu = np.asarray(priormu)
        self.nu = nu
        self.kappa = kappa
        self.S = np.asarray(S)
        self.alpha = alpha
        self.D = self.data.shape[1]

        self.train_analytic()

    def train_analytic(self):
        """ Calculating the analytic distribution posteriors given on page 15 of Lori's 
        Optimal Classification eq 34. """
        self.nustar = self.nu + self.n

        samplemean = self.data.mean(axis=0)
        samplecov = np.cov(self.data.T)

        self.mustar = (self.nu * self.priormu + self.n * samplemean) \
                / (self.nu + self.n)
        self.kappastar = self.kappa + self.n
        self.Sstar = self.S + (self.n-1)*samplecov + self.nu*self.n/(self.nu+self.n)\
                * np.outer((samplemean - self.priormu), (samplemean - self.priormu))
                
        # Now calculate effective class conditional densities from eq 55 page 21
        self.fx = MVT(
                self.mustar, 
                (self.nustar+1)/(self.kappastar-self.D+1)/self.nustar * self.Sstar, 
                self.kappastar - self.D + 1)

    def eval_posterior(self, pts):
        return self.fx.logpdf(pts)
Example #5
0
class Classification():
    def __init__(self):
        np.random.seed(1234)

        self.n = 4 # Data points

        self.true_mu = 0.0
        self.true_sigma = 1 #di.invgamma.rvs(3)

        # For G function calculation and averaging
        self.grid_n = 100
        low,high = -4, 4
        self.gextent = (low,high)
        self.grid = np.linspace(low,high,self.grid_n)
        self.gavg = np.zeros(self.grid_n)
        self.numgavg = 0

        #self.data = di.norm.rvs(size=self.n)
        self.data = np.array([0.0, -0.0, 0.5, -0.5])
        assert self.data.size == self.n
        
        ######## Starting point of MCMC Run #######
        self.mu = 0.0
        self.sigma = 2.0

        ###### Bookeeping ######
        self.oldmu = None
        self.oldsigma = None

        ##### Prior Values and Confidences ######
        self.priorsigma = 2
        self.kappa = 1
        self.priormu = 0
        self.nu = 8.0
        #### Calculating the Analytic solution given on page 15 of Lori's 
        #### Optimal Classification eq 34.
        self.nustar = self.nu + self.n

        samplemean = self.data.mean()
        samplevar = np.cov(self.data)

        self.mustar = (self.nu*self.priormu + self.n * samplemean) \
                / (self.nu + self.n)
        self.kappastar = self.kappa + self.n
        self.Sstar = self.priorsigma + (self.n-1)*samplevar + self.nu*self.n/(self.nu+self.nu)\
                * (samplemean - self.priormu)**2
                
        #### Now calculate effective class conditional densities from eq 55
        #### page 21

        #self.fx = MVT(
                #self.mu0star, 
                #(self.nu0star+1)/(self.kappa0star-self.D+1)/self.nu0star * self.S0star, 
                #self.kappa0star - self.D + 1)
        # So I'm pretty sure this is incorrect below, off by some scaling
        # parameters
        self.fx = MVT(
                [self.mustar], 
                [(self.nustar+1)/(self.kappastar)/self.nustar * self.Sstar / 2],
                self.kappastar /2 )

        self.analyticfx = self.fx.logpdf(self.grid.reshape(-1,1))


    def propose(self):
        self.oldmu = self.mu
        self.oldsigma = self.sigma

        self.mu += np.random.randn()*0.1
        #self.mu = np.random.randn()
        self.sigma = di.invgamma.rvs(1)
        return 0

    def copy(self):
        return (self.mu, self.sigma, di.norm.rvs(loc=self.mu, scale=self.sigma))

    def reject(self):
        self.mu = self.oldmu
        self.sigma = self.oldsigma

    def energy(self):
        sum = 0.0
        sum -= di.norm.logpdf(self.data, loc=self.mu, scale=self.sigma).sum()
        #Now add in the priors...
        sum -= log(self.sigma)*(-0.5) - self.nu/2 * (self.mu-self.priormu)**2/self.sigma
        sum -= log(self.sigma)*(self.kappa+2)/(-2) - 0.5*self.priorsigma/self.sigma
        return sum

    def calc_gfunc(self):
        return di.norm.pdf(self.grid, loc=self.mu, scale=self.sigma) 

    def init_db(self, db, dbsize):
        pass
        #dtype = [('thetas',np.double),
                #('energies',np.double),
                #('funcs',np.double)]
        #if db == None:
            #return np.zeros(dbsize, dtype=dtype)
        #elif db.shape[0] != dbsize:
            #return np.resize(db, dbsize)
        #else:
            #raise Exception("DB Not inited")

    def save_to_db(self, db, theta, energy, iteration):
        #func = 0.0
        #db[iteration] = np.array([theta, energy, func])
        global mydb
        mydb.append(self.copy())

        # Update G function average
        self.numgavg += 1
        self.gavg += (self.calc_gfunc() - self.gavg) / self.numgavg
Example #6
0
class Classification():
    def __init__(self):
        np.random.seed(1234)

        self.n = 4  # Data points

        self.true_mu = 0.0
        self.true_sigma = 1  #di.invgamma.rvs(3)

        # For G function calculation and averaging
        self.grid_n = 100
        low, high = -4, 4
        self.gextent = (low, high)
        self.grid = np.linspace(low, high, self.grid_n)
        self.gavg = np.zeros(self.grid_n)
        self.numgavg = 0

        #self.data = di.norm.rvs(size=self.n)
        self.data = np.array([0.0, -0.0, 0.5, -0.5])
        assert self.data.size == self.n

        ######## Starting point of MCMC Run #######
        self.mu = 0.0
        self.sigma = 2.0

        ###### Bookeeping ######
        self.oldmu = None
        self.oldsigma = None

        ##### Prior Values and Confidences ######
        self.priorsigma = 2
        self.kappa = 1
        self.priormu = 0
        self.nu = 8.0
        #### Calculating the Analytic solution given on page 15 of Lori's
        #### Optimal Classification eq 34.
        self.nustar = self.nu + self.n

        samplemean = self.data.mean()
        samplevar = np.cov(self.data)

        self.mustar = (self.nu*self.priormu + self.n * samplemean) \
                / (self.nu + self.n)
        self.kappastar = self.kappa + self.n
        self.Sstar = self.priorsigma + (self.n-1)*samplevar + self.nu*self.n/(self.nu+self.nu)\
                * (samplemean - self.priormu)**2

        #### Now calculate effective class conditional densities from eq 55
        #### page 21

        #self.fx = MVT(
        #self.mu0star,
        #(self.nu0star+1)/(self.kappa0star-self.D+1)/self.nu0star * self.S0star,
        #self.kappa0star - self.D + 1)
        # So I'm pretty sure this is incorrect below, off by some scaling
        # parameters
        self.fx = MVT([self.mustar],
                      [(self.nustar + 1) /
                       (self.kappastar) / self.nustar * self.Sstar / 2],
                      self.kappastar / 2)

        self.analyticfx = self.fx.logpdf(self.grid.reshape(-1, 1))

    def propose(self):
        self.oldmu = self.mu
        self.oldsigma = self.sigma

        self.mu += np.random.randn() * 0.1
        #self.mu = np.random.randn()
        self.sigma = di.invgamma.rvs(1)
        return 0

    def copy(self):
        return (self.mu, self.sigma, di.norm.rvs(loc=self.mu,
                                                 scale=self.sigma))

    def reject(self):
        self.mu = self.oldmu
        self.sigma = self.oldsigma

    def energy(self):
        sum = 0.0
        sum -= di.norm.logpdf(self.data, loc=self.mu, scale=self.sigma).sum()
        #Now add in the priors...
        sum -= log(self.sigma) * (-0.5) - self.nu / 2 * (
            self.mu - self.priormu)**2 / self.sigma
        sum -= log(self.sigma) * (self.kappa + 2) / (
            -2) - 0.5 * self.priorsigma / self.sigma
        return sum

    def calc_gfunc(self):
        return di.norm.pdf(self.grid, loc=self.mu, scale=self.sigma)

    def init_db(self, db, dbsize):
        pass
        #dtype = [('thetas',np.double),
        #('energies',np.double),
        #('funcs',np.double)]
        #if db == None:
        #return np.zeros(dbsize, dtype=dtype)
        #elif db.shape[0] != dbsize:
        #return np.resize(db, dbsize)
        #else:
        #raise Exception("DB Not inited")

    def save_to_db(self, db, theta, energy, iteration):
        #func = 0.0
        #db[iteration] = np.array([theta, energy, func])
        global mydb
        mydb.append(self.copy())

        # Update G function average
        self.numgavg += 1
        self.gavg += (self.calc_gfunc() - self.gavg) / self.numgavg