Пример #1
0
    def _main(self, ratings, sigma, args):
        
        self.n_thread = args.n_threads
        # split data to training & testing
        train_pct = 0.9

        rand_state.shuffle(ratings)
        train_size = int(train_pct * ratings.shape[0])
        train = ratings[:train_size]
        validation = ratings[train_size:]

        self.data = train
       
        nuts_kernel = NUTS(self._conditioned_model, jit_compile=args.jit,)
    
        posterior = MCMC(nuts_kernel,
                         num_samples=args.num_samples,
                         warmup_steps=args.warmup_steps,
                         num_chains=args.num_chains,
                         disable_progbar=False).run(self._model, sigma, train)
        
        sites = ['mu_item', 'mu_user'] + ['u_temp_feature' + str(user_id) for user_id in xrange(self.n_user)] + ['i_temp_feature' + str(item_id) for item_id in xrange(self.n_item)]
        marginal = posterior.marginal(sites=sites)
        marginal = torch.cat(list(marginal.support(flatten=True).values()), dim=-1).cpu().numpy()
        avg_mu_item = np.average(marginal[:, :self.n_feature], axis=0)
        avg_mu_user = np.average(marginal[:, self.n_feature:2*self.n_feature], axis=0)
        avg_u_temp_feature = np.average(marginal[:, 2*self.n_feature:2*self.n_feature + self.n_user*self.n_feature].reshape(-1,self.n_user,self.n_feature), axis=0)
        avg_i_temp_feature = np.average(marginal[:, 2*self.n_feature + self.n_user*self.n_feature:].reshape(-1,self.n_item, self.n_feature), axis=0)
        
        train_preds = self._predict(train[:, :2], True, avg_u_temp_feature, avg_i_temp_feature)
        train_rmse = RMSE(train_preds, train[:, 2])
        val_preds = self._predict(validation[:, :2], True, avg_u_temp_feature, avg_i_temp_feature)
        val_rmse = RMSE(val_preds, validation[:, 2])
        print("After %d iteration, train RMSE: %.6f, validation RMSE: %.6f" % (self.iter_, train_rmse, val_rmse))
Пример #2
0
    def compute_posteriors(self,
                           x_obs: torch.Tensor,
                           mcmc_kwargs: dict = None):
        """

        :param x_obs:
        :param mcmc_kwargs: By default:
        {num_samples=1000, warmup_steps=1000, num_chains=4)
        :return:
        """
        if mcmc_kwargs is None:
            mcmc_kwargs = {
                "num_samples": 1000,
                "warmup_steps": 1000,
                "num_chains": 4
            }
        kernel = NUTS(
            self.pyro_mdl,
            adapt_step_size=True,
            max_plate_nesting=1,
            jit_compile=True,
            target_accept_prob=0.6,
        )
        mcmc_run = MCMC(kernel, **mcmc_kwargs).run(data=x_obs)
        marginals = mcmc_run.marginal(sites=["z"])
        marginals_supp = marginals.support()
        z_x = marginals_supp["z"]
        return z_x, marginals
def nuts_fit(model, data, num_samples=None, warmup_steps=None, var_names=None):
    """ Use No U-turn Sampler for inferring latent variables """
    num_samples = int(0.8 * len(data)) if num_samples is None else num_samples
    warmup_steps = len(
        data) - num_samples if warmup_steps is None else warmup_steps
    nuts_kernel = NUTS(model, adapt_step_size=True)
    trace = MCMC(nuts_kernel,
                 num_samples=num_samples,
                 warmup_steps=warmup_steps).run(data)
    if var_names is None:
        posteriors = None
    else:
        posteriors = trace.marginal(var_names).empirical

    return trace, posteriors
Пример #4
0
class BenchmarkPyroModel(PyroModel):
    def __init__(self,
                 base,
                 subspace,
                 prior_log_sigma,
                 likelihood_given_outputs,
                 batch_size=100,
                 kernel=NUTS,
                 num_samples=30,
                 kernel_kwargs={},
                 *args,
                 **kwargs):
        super(BenchmarkPyroModel, self).__init__(base,
                                                 subspace,
                                                 prior_log_sigma,
                                                 likelihood_given_outputs,
                                                 batch_size=batch_size,
                                                 *args,
                                                 **kwargs)
        self.kernel = kernel(self.model, **kernel_kwargs)
        self.num_samples = num_samples

        #self.loader = loader
        self.all_samples = None
        self.mcmc_run = None

    def fit(self, inputs, targets, *args, **kwargs):
        self.mcmc_run = MCMC(self.kernel,
                             num_samples=self.num_samples,
                             warmup_steps=100).run(inputs, targets)
        self.all_samples = torch.cat(list(
            self.mcmc_run.marginal(sites="t").support(flatten=True).values()),
                                     dim=-1)

    def sample(self, ind=None, scale=1.0):
        if ind is None:
            ind = np.random.randint(self.num_samples)
        self.eval()

        self.t.set_(self.all_samples[int(ind), :])
Пример #5
0
def model(utt, phi):
  a = pyro.sample("a", dist.Uniform(.1, 20.))
  b = pyro.sample("b", dist.Uniform(.1, 20.))
  
  mu = pyro.sample("mu", dist.Beta(a,b))
  nu = pyro.sample("nu", dist.LogNormal(2,0.5))
  
  a2 = mu * (nu + 1)
  b2 = (1-mu) * (nu + 1)
  
  with pyro.plate("data"):
         pyro.sample("obs", RSASpeaker(mu, phi), obs=utt)


utt = torch.ones(200)
utt[50:200] = 0

phi = torch.rand(50) * .3
phi2 = torch.rand(150) * 0.6 + .4

phi = torch.cat([phi, phi2])


nuts_kernel = NUTS(model, jit_compile=True, adapt_step_size=True)

hmc_posterior = MCMC(nuts_kernel, num_samples=100, warmup_steps=200) \
    .run(utt, phi)

print(EmpiricalMarginal(hmc_posterior, "mu")._get_samples_and_weights()[0])
print(hmc_posterior.marginal('mu').empirical['mu'].mean)
Пример #6
0
inpts = inpts.reshape([num_batches, batch_size, *inpts.shape[1:]])
trgts = trgts.reshape([num_batches, batch_size])
print("Inputs:", inpts.shape)
print("Targets:", trgts.shape)

printf, logfile = utils.get_logging_print(os.path.join(args.dir, args.log_fname + '-%s.txt'))
print('Saving logs to: %s' % logfile)

nuts_kernel = NUTS(pyro_model.model, step_size=10.)

num_samples = 30

# x_, y_ = loaders["train"].dataset.tensors
mcmc_run = MCMC(nuts_kernel, num_samples=num_samples, warmup_steps=10).run(inpts, trgts)
#mcmc_run = MCMC(nuts_kernel, num_samples=num_samples, warmup_steps=100).run(islice(loaders["train"], 1000))
samples = torch.cat(list(mcmc_run.marginal(sites="t").support(flatten=True).values()), dim=-1)
print(samples)

utils.save_checkpoint(
    args.dir,
    0,
    name='nuts',
    state_dict=pyro_model.state_dict()
)


predictions = np.zeros((len(loaders['test'].dataset), num_classes))
targets = np.zeros(len(loaders['test'].dataset))

printf, logfile = utils.get_logging_print(os.path.join(args.dir, args.log_fname + '-%s.txt'))
print('Saving logs to: %s' % logfile)
Пример #7
0
    def _main(self,
              ratings,
              validation,
              jit=False,
              num_samples=30,
              warmup_steps=5,
              num_chains=1):
        ratingstmp = np.zeros((self.n_user, self.n_item), dtype='float64')
        for rat in ratings:
            ratingstmp[rat[0], rat[1]] = rat[2]

        nuts_kernel = NUTS(
            self._conditioned_model,
            jit_compile=jit,
        )
        posterior = MCMC(nuts_kernel,
                         num_samples=num_samples,
                         warmup_steps=warmup_steps,
                         num_chains=num_chains,
                         disable_progbar=False).run(self._model, ratingstmp)
        sites = ['mu_item', 'mu_user'] + [
            'u_temp_feature' + str(user_id) for user_id in xrange(self.n_user)
        ] + [
            'i_temp_feature' + str(item_id) for item_id in xrange(self.n_item)
        ]
        marginal = posterior.marginal(sites=sites)
        marginal = torch.cat(list(marginal.support(flatten=True).values()),
                             dim=-1)

        numOfres = (2 + int(self.n_user) + int(self.n_item)) * int(
            self.n_feature)
        print("shape : " + str(marginal.shape))
        print("numOfres : " + str(numOfres))
        marginal = marginal[num_samples - 1]

        ifmatrix = torch.zeros(
            (int(self.n_item), int(self.n_feature))).detach().numpy()
        ufmatrix = torch.zeros(
            (int(self.n_user), int(self.n_feature))).detach().numpy()

        marginal = torch.reshape(
            marginal,
            (2 + int(self.n_user) + int(self.n_item), int(self.n_feature)))
        for i in range(int(self.n_user)):
            ufmatrix[i, :] = marginal[2 + i]
        for i in range(int(self.n_item)):
            ifmatrix[i, :] = marginal[2 + int(self.n_user) + i]

        Y = np.matmul(ufmatrix, ifmatrix.transpose())

        for x in range(self.n_user):
            for y in range(self.n_item):
                if Y[x, y] > self.max_rating:
                    Y[x, y] = self.max_rating
                elif Y[x, y] < self.min_rating:
                    Y[x, y] = self.min_rating

        output_file.write("item feature : \n")
        output_file.write(str(ifmatrix) + "\n")
        output_file.write("user feature : \n")
        output_file.write(str(ufmatrix) + "\n")
        output_file.write("Y : \n")
        output_file.write(str(Y) + "\n")

        numOfrat = 0
        summ = 0.0
        for rat in validation:
            numOfrat += 1
            summ += np.power(Y[rat[0], rat[1]] - rat[2], 2)
        rmse = np.power(summ / numOfrat, 0.5)
        output_file.write("RMSE: " + str(rmse))
        print("RMSE: " + str(rmse))