diff --git a/GPy/likelihoods/likelihood.py b/GPy/likelihoods/likelihood.py index d41468ab..67a6a3a3 100644 --- a/GPy/likelihoods/likelihood.py +++ b/GPy/likelihoods/likelihood.py @@ -298,13 +298,8 @@ class Likelihood(Parameterized): return self.conditional_mean(f)*p scaled_mean = [quad(int_mean, fmin, fmax,args=(mj,s2j))[0] for mj,s2j in zip(mu,variance)] mean = np.array(scaled_mean)[:,None] / np.sqrt(2*np.pi*(variance)) - return mean - def _conditional_mean(self, f): - """Quadrature calculation of the conditional mean: E(Y_star|f)""" - raise NotImplementedError("implement this function to make predictions") - def predictive_variance(self, mu,variance, predictive_mean=None, Y_metadata=None): """ Approximation to the predictive variance: V(Y_star) @@ -608,23 +603,30 @@ class Likelihood(Parameterized): :param full_cov: whether to use the full covariance or just the diagonal :type full_cov: Boolean """ - - pred_mean = self.predictive_mean(mu, var, Y_metadata) - pred_var = self.predictive_variance(mu, var, pred_mean, Y_metadata) + try: + pred_mean = self.predictive_mean(mu, var, Y_metadata=Y_metadata) + pred_var = self.predictive_variance(mu, var, pred_mean, Y_metadata=Y_metadata) + except NotImplementedError: + print "Finding predictive mean and variance via sampling rather than quadrature" + Nf_samp = 300 + Ny_samp = 1 + s = np.random.randn(mu.shape[0], Nf_samp)*np.sqrt(var) + mu + ss_y = self.samples(s, Y_metadata, samples=Ny_samp) + pred_mean = np.mean(ss_y, axis=1)[:, None] + pred_var = np.var(ss_y, axis=1)[:, None] return pred_mean, pred_var def predictive_quantiles(self, mu, var, quantiles, Y_metadata=None): #compute the quantiles by sampling!!! - N_samp = 500 - s = np.random.randn(mu.shape[0], N_samp)*np.sqrt(var) + mu - #ss_f = s.flatten() - #ss_y = self.samples(ss_f, Y_metadata) - #ss_y = self.samples(s, Y_metadata, samples=100) - ss_y = self.samples(s, Y_metadata) - #ss_y = ss_y.reshape(mu.shape[0], N_samp) + Nf_samp = 300 + Ny_samp = 1 + s = np.random.randn(mu.shape[0], Nf_samp)*np.sqrt(var) + mu + ss_y = self.samples(s, Y_metadata, samples=Ny_samp) + #ss_y = ss_y.reshape(mu.shape[0], mu.shape[1], Nf_samp*Ny_samp) - return [np.percentile(ss_y ,q, axis=1)[:,None] for q in quantiles] + pred_quantiles = [np.percentile(ss_y, q, axis=1)[:,None] for q in quantiles] + return pred_quantiles def samples(self, gp, Y_metadata=None, samples=1): """ diff --git a/GPy/plotting/matplot_dep/models_plots.py b/GPy/plotting/matplot_dep/models_plots.py index 77c42825..9f841372 100644 --- a/GPy/plotting/matplot_dep/models_plots.py +++ b/GPy/plotting/matplot_dep/models_plots.py @@ -107,11 +107,13 @@ def plot_fit(model, plot_limits=None, which_data_rows='all', upper = m + 2*np.sqrt(v) else: if isinstance(model,GPCoregionalizedRegression) or isinstance(model,SparseGPCoregionalizedRegression): - meta = {'output_index': Xgrid[:,-1:].astype(np.int)} - else: - meta = None - m, v = model.predict(Xgrid, full_cov=False, Y_metadata=meta, **predict_kw) - lower, upper = model.predict_quantiles(Xgrid, Y_metadata=meta) + extra_data = Xgrid[:,-1:].astype(np.int) + if Y_metadata is None: + Y_metadata = {'output_index': extra_data} + else: + Y_metadata['output_index'] = extra_data + m, v = model.predict(Xgrid, full_cov=False, Y_metadata=Y_metadata, **predict_kw) + lower, upper = model.predict_quantiles(Xgrid, Y_metadata=Y_metadata) for d in which_data_ycols: @@ -120,7 +122,9 @@ def plot_fit(model, plot_limits=None, which_data_rows='all', #optionally plot some samples if samples: #NOTE not tested with fixed_inputs - Ysim = model.posterior_samples(Xgrid, samples) + Ysim = model.posterior_samples(Xgrid, samples, Y_metadata=Y_metadata) + print Ysim.shape + print Xnew.shape for yi in Ysim.T: plots['posterior_samples'] = ax.plot(Xnew, yi[:,None], Tango.colorsHex['darkBlue'], linewidth=0.25) #ax.plot(Xnew, yi[:,None], marker='x', linestyle='--',color=Tango.colorsHex['darkBlue']) #TODO apply this line for discrete outputs. @@ -185,10 +189,12 @@ def plot_fit(model, plot_limits=None, which_data_rows='all', m, _ = model._raw_predict(Xgrid, **predict_kw) else: if isinstance(model,GPCoregionalizedRegression) or isinstance(model,SparseGPCoregionalizedRegression): - meta = {'output_index': Xgrid[:,-1:].astype(np.int)} - else: - meta = None - m, v = model.predict(Xgrid, full_cov=False, Y_metadata=meta, **predict_kw) + extra_data = Xgrid[:,-1:].astype(np.int) + if Y_metadata is None: + Y_metadata = {'output_index': extra_data} + else: + Y_metadata['output_index'] = extra_data + m, v = model.predict(Xgrid, full_cov=False, Y_metadata=Y_metadata, **predict_kw) for d in which_data_ycols: m_d = m[:,d].reshape(resolution, resolution).T plots['contour'] = ax.contour(x, y, m_d, levels, vmin=m.min(), vmax=m.max(), cmap=pb.cm.jet)