Ejemplo n.º 1
0
 def logpdf(self, rowid, targets, constraints=None, inputs=None):
     DistributionGpm.logpdf(self, rowid, targets, constraints, inputs)
     x = targets[self.outputs[0]]
     if not (x % 1 == 0 and x >= 0):
         return -float('inf')
     return Poisson.calc_predictive_logp(x, self.N, self.sum_x, self.a,
                                         self.b)
Ejemplo n.º 2
0
 def __init__(self,
              outputs,
              inputs,
              hypers=None,
              params=None,
              distargs=None,
              rng=None):
     DistributionGpm.__init__(self, outputs, inputs, hypers, params,
                              distargs, rng)
     # Distargs
     self.l = distargs['l']
     self.h = distargs['h']
     # Sufficient statistics.
     self.N = 0
     self.sum_x = 0
     self.sum_x_sq = 0
     # Hyperparameters (fixed).
     self.alpha = 2.
     self.beta = 2.
     # Uncollapsed mean and precision parameters.
     if params is None: params = {}
     self.mu = params.get('mu', None)
     self.sigma = params.get('sigma', 1)
     if not self.mu or not self.sigma:
         self.mu, self.sigma = NormalTrunc.sample_parameters(
             self.alpha, self.beta, self.l, self.h, self.rng)
Ejemplo n.º 3
0
 def logpdf(self, rowid, targets, constraints=None, inputs=None):
     DistributionGpm.logpdf(self, rowid, targets, constraints, inputs)
     x = targets[self.outputs[0]]
     if x not in [0, 1]:
         return -float('inf')
     return Bernoulli.calc_predictive_logp(x, self.N, self.x_sum,
                                           self.alpha, self.beta)
Ejemplo n.º 4
0
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = observation[self.outputs[0]]
     self.N += 1.
     self.sum_x += x
     self.sum_x_sq += x * x
     self.data[rowid] = x
Ejemplo n.º 5
0
 def logpdf(self, rowid, targets, constraints=None, inputs=None):
     DistributionGpm.logpdf(self, rowid, targets, constraints, inputs)
     x = targets[self.outputs[0]]
     if x < 0:
         return -float('inf')
     return Exponential.calc_predictive_logp(x, self.N, self.sum_x, self.a,
                                             self.b)
Ejemplo n.º 6
0
 def simulate(self, rowid, targets, constraints=None, inputs=None, N=None):
     DistributionGpm.simulate(self, rowid, targets, constraints, inputs, N)
     if rowid in self.data:
         return {self.outputs[0]: self.data[rowid]}
     an, bn = Poisson.posterior_hypers(self.N, self.sum_x, self.a, self.b)
     x = self.rng.negative_binomial(an, bn / (bn + 1.))
     return {self.outputs[0]: x}
Ejemplo n.º 7
0
 def logpdf(self, rowid, targets, constraints=None, inputs=None):
     DistributionGpm.logpdf(self, rowid, targets, constraints, inputs)
     x = targets[self.outputs[0]]
     if not (x % 1 == 0 and 0 <= x < self.k):
         return -float('inf')
     return Categorical.calc_predictive_logp(int(x), self.N, self.counts,
                                             self.alpha)
Ejemplo n.º 8
0
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = observation[self.outputs[0]]
     if x not in [0, 1]:
         raise ValueError('Invalid Bernoulli: %s' % str(x))
     self.N += 1
     self.x_sum += x
     self.data[rowid] = x
Ejemplo n.º 9
0
 def simulate(self, rowid, targets, constraints=None, inputs=None, N=None):
     DistributionGpm.simulate(self, rowid, targets, constraints, inputs, N)
     if rowid in self.data:
         return {self.outputs[0]: self.data[rowid]}
     alpha = self.strength * self.balance
     beta = self.strength * (1. - self.balance)
     x = self.rng.beta(alpha, beta)
     return {self.outputs[0]: x}
Ejemplo n.º 10
0
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = observation[self.outputs[0]]
     if x < 0:
         raise ValueError('Invalid Exponential: %s' % str(x))
     self.N += 1
     self.sum_x += x
     self.data[rowid] = x
Ejemplo n.º 11
0
 def simulate(self, rowid, targets, constraints=None, inputs=None, N=None):
     DistributionGpm.simulate(self, rowid, targets, constraints, inputs, N)
     if rowid in self.data:
         return {self.outputs[0]: self.data[rowid]}
     an, bn = Geometric.posterior_hypers(self.N, self.sum_x, self.a, self.b)
     pn = self.rng.beta(an, bn)
     x = self.rng.geometric(pn) - 1
     return {self.outputs[0]: x}
Ejemplo n.º 12
0
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = observation[self.outputs[0]]
     if not (x % 1 == 0 and x >= 0):
         raise ValueError('Invalid Geometric: %s') % str(x)
     self.N += 1
     self.sum_x += x
     self.data[rowid] = x
Ejemplo n.º 13
0
Archivo: crp.py Proyecto: wilsondy/cgpm
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = int(observation[self.outputs[0]])
     self.N += 1
     if x not in self.counts:
         self.counts[x] = 0
     self.counts[x] += 1
     self.data[rowid] = x
Ejemplo n.º 14
0
 def logpdf(self, rowid, targets, constraints=None, inputs=None):
     DistributionGpm.logpdf(self, rowid, targets, constraints, inputs)
     x = targets[self.outputs[0]]
     if not (0 <= x <= 2 * pi):
         return -float('inf')
     return Vonmises.calc_predictive_logp(x, self.N, self.sum_sin_x,
                                          self.sum_cos_x, self.a, self.b,
                                          self.k)
Ejemplo n.º 15
0
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = observation[self.outputs[0]]
     if x <= 0:
         raise ValueError('Invalid Lognormal: %s' % str(x))
     self.N += 1
     self.sum_log_x += log(x)
     self.sum_log_x_sq += log(x) * log(x)
     self.data[rowid] = x
Ejemplo n.º 16
0
 def simulate(self, rowid, targets, constraints=None, inputs=None, N=None):
     DistributionGpm.simulate(self, rowid, targets, constraints, inputs, N)
     if rowid in self.data:
         return {self.outputs[0]: self.data[rowid]}
     an, bn = Exponential.posterior_hypers(self.N, self.sum_x, self.a,
                                           self.b)
     mu = self.rng.gamma(an, scale=1. / bn)
     x = self.rng.exponential(scale=1. / mu)
     return {self.outputs[0]: x}
Ejemplo n.º 17
0
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = observation[self.outputs[0]]
     if not (x % 1 == 0 and x >= 0):
         raise ValueError('Invalid Poisson: %s' % str(x))
     self.N += 1
     self.sum_x += x
     self.sum_log_fact_x += gammaln(x + 1)
     self.data[rowid] = x
Ejemplo n.º 18
0
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = observation[self.outputs[0]]
     if not (x % 1 == 0 and 0 <= x < self.k):
         raise ValueError('Invalid Categorical(%d): %s' % (self.k, x))
     x = int(x)
     self.N += 1
     self.counts[x] += 1
     self.data[rowid] = x
Ejemplo n.º 19
0
 def logpdf(self, rowid, targets, constraints=None, inputs=None):
     DistributionGpm.logpdf(self, rowid, targets, constraints, inputs)
     x = targets[self.outputs[0]]
     if x <= 0:
         return -float('inf')
     return - log(x) + \
         Normal.calc_predictive_logp(
             log(x), self.N, self.sum_log_x, self.sum_log_x_sq, self.m,
             self.r, self.s, self.nu)
Ejemplo n.º 20
0
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = observation[self.outputs[0]]
     if not (0 <= x <= 2 * pi):
         raise ValueError('Invalid Vonmises: %s' % str(x))
     self.N += 1
     self.sum_sin_x += sin(x)
     self.sum_cos_x += cos(x)
     self.data[rowid] = x
Ejemplo n.º 21
0
 def logpdf(self, rowid, targets, constraints=None, inputs=None):
     DistributionGpm.logpdf(self, rowid, targets, constraints, inputs)
     x = targets[self.outputs[0]]
     if not (self.l <= x <= self.h):
         return -float('inf')
     logpdf_unorm = NormalTrunc.calc_predictive_logp(
         x, self.mu, self.sigma, self.l, self.h)
     logcdf_norm = NormalTrunc.calc_log_normalizer(self.mu, self.sigma,
                                                   self.l, self.h)
     return logpdf_unorm - logcdf_norm
Ejemplo n.º 22
0
Archivo: crp.py Proyecto: wilsondy/cgpm
 def simulate(self, rowid, targets, constraints=None, inputs=None, N=None):
     DistributionGpm.simulate(self, rowid, targets, constraints, inputs, N)
     if rowid in self.data:
         x = self.data[rowid]
     else:
         K = sorted(self.counts) + [max(self.counts) + 1] if self.counts\
             else [0]
         logps = [self.logpdf(rowid, {targets[0]: x}, None) for x in K]
         x = gu.log_pflip(logps, array=K, rng=self.rng)
     return {self.outputs[0]: x}
Ejemplo n.º 23
0
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = observation[self.outputs[0]]
     if not (self.l <= x <= self.h):
         raise ValueError('Invalid NormalTrunc(%f,%f): %s' %
                          (self.l, self.h, str(x)))
     self.N += 1
     self.sum_x += x
     self.sum_x_sq += x * x
     self.data[rowid] = x
Ejemplo n.º 24
0
 def simulate(self, rowid, targets, constraints=None, inputs=None, N=None):
     DistributionGpm.simulate(self, rowid, targets, constraints, inputs, N)
     if rowid in self.data:
         return {self.outputs[0]: self.data[rowid]}
     mn, rn, sn, nun = Normal.posterior_hypers(self.N, self.sum_x,
                                               self.sum_x_sq, self.m,
                                               self.r, self.s, self.nu)
     mu, rho = Normal.sample_parameters(mn, rn, sn, nun, self.rng)
     x = self.rng.normal(loc=mu, scale=rho**-.5)
     return {self.outputs[0]: x}
Ejemplo n.º 25
0
 def simulate(self, rowid, targets, constraints=None, inputs=None, N=None):
     DistributionGpm.simulate(self, rowid, targets, constraints, inputs, N)
     if rowid in self.data:
         return {self.outputs[0]: self.data[rowid]}
     p0 = Bernoulli.calc_predictive_logp(0, self.N, self.x_sum, self.alpha,
                                         self.beta)
     p1 = Bernoulli.calc_predictive_logp(1, self.N, self.x_sum, self.alpha,
                                         self.beta)
     x = gu.log_pflip([p0, p1], rng=self.rng)
     return {self.outputs[0]: x}
Ejemplo n.º 26
0
 def simulate(self, rowid, targets, constraints=None, inputs=None, N=None):
     DistributionGpm.simulate(self, rowid, targets, constraints, inputs, N)
     if rowid in self.data:
         return {self.outputs[0]: self.data[rowid]}
     max_iters = 1000
     for i in xrange(max_iters):
         x = self.rng.normal(loc=self.mu, scale=self.sigma)
         if self.l <= x <= self.h:
             return {self.outputs[0]: x}
     else:
         raise RuntimeError('NormalTrunc failed to rejection sample.')
Ejemplo n.º 27
0
Archivo: crp.py Proyecto: wilsondy/cgpm
 def __init__(
         self, outputs, inputs,
         hypers=None, params=None, distargs=None, rng=None):
     DistributionGpm.__init__(
         self, outputs, inputs, hypers, params, distargs, rng)
     # Distargs.
     self.N = 0
     self.data = OrderedDict()
     self.counts = OrderedDict()
     # Hyperparameters.
     if hypers is None: hypers = {}
     self.alpha = hypers.get('alpha', 1.)
Ejemplo n.º 28
0
 def simulate(self, rowid, targets, constraints=None, inputs=None, N=None):
     DistributionGpm.simulate(self, rowid, targets, constraints, inputs, N)
     if rowid in self.data:
         return {self.outputs[0]: self.data[rowid]}
     an, bn = Vonmises.posterior_hypers(self.N, self.sum_sin_x,
                                        self.sum_cos_x, self.a, self.b,
                                        self.k)
     # if not 0 <= bn <= 2*pi:
     #     import ipdb; ipdb.set_trace()
     mu = self.rng.vonmises(bn - pi, an) + pi
     x = self.rng.vonmises(mu - pi, self.k) + pi
     assert 0 <= x <= 2 * pi
     return {self.outputs[0]: x}
Ejemplo n.º 29
0
 def incorporate(self, rowid, observation, inputs=None):
     DistributionGpm.incorporate(self, rowid, observation, inputs)
     x = observation[self.outputs[0]]
     if np.allclose(0, x):
         x = 0.001
     elif np.allclose(1, x):
         x = 0.999
     if not 0 < x < 1:
         raise ValueError('Invalid Beta: %s' % str(x))
     self.N += 1
     self.sum_log_x += log(x)
     self.sum_minus_log_x += log(1.-x)
     self.data[rowid] = x
Ejemplo n.º 30
0
 def simulate(self, rowid, targets, constraints=None, inputs=None, N=None):
     # XXX This implementation is not verified but will be covered in
     # future univariate simulate tests, see Github issue #14.
     DistributionGpm.simulate(self, rowid, targets, constraints, inputs, N)
     if rowid in self.data:
         return {self.outputs[0]: self.data[rowid]}
     # Simulate normal parameters.
     mn, rn, sn, nun = Normal.posterior_hypers(self.N, self.sum_log_x,
                                               self.sum_log_x_sq, self.m,
                                               self.r, self.s, self.nu)
     mu, rho = Normal.sample_parameters(mn, rn, sn, nun, self.rng)
     xn = self.rng.normal(loc=mu, scale=rho**-.5)
     x = np.exp(xn)
     return {self.outputs[0]: x}