mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-11 13:02:38 +02:00
Changes in plot functions, to allow 1D multiple outputs visualization
This commit is contained in:
parent
f0569d6d88
commit
ea7c18fccc
1 changed files with 57 additions and 46 deletions
|
|
@ -46,6 +46,8 @@ class GPBase(Model):
|
||||||
:param which_parts: which of the kernel functions to plot (additively)
|
:param which_parts: which of the kernel functions to plot (additively)
|
||||||
:type which_parts: 'all', or list of bools
|
:type which_parts: 'all', or list of bools
|
||||||
:param resolution: the number of intervals to sample the GP on. Defaults to 200 in 1D and 50 (a 50x50 grid) in 2D
|
:param resolution: the number of intervals to sample the GP on. Defaults to 200 in 1D and 50 (a 50x50 grid) in 2D
|
||||||
|
:param output: which output to plot (for multiple output models only)
|
||||||
|
:type output: integer (first output is 0)
|
||||||
|
|
||||||
Plot the posterior of the GP.
|
Plot the posterior of the GP.
|
||||||
- In one dimension, the function is plotted with a shaded region identifying two standard deviations.
|
- In one dimension, the function is plotted with a shaded region identifying two standard deviations.
|
||||||
|
|
@ -92,13 +94,14 @@ class GPBase(Model):
|
||||||
|
|
||||||
|
|
||||||
elif self.X.shape[1] == 2 and hasattr(self,'multioutput'):
|
elif self.X.shape[1] == 2 and hasattr(self,'multioutput'):
|
||||||
|
output -= 1
|
||||||
|
assert self.num_outputs >= output, 'The model has only %s outputs.' %self.num_outputs
|
||||||
Xu = self.X[self.X[:,-1]==output ,0:1]
|
Xu = self.X[self.X[:,-1]==output ,0:1]
|
||||||
Xnew, xmin, xmax = x_frame1D(Xu, plot_limits=plot_limits)
|
Xnew, xmin, xmax = x_frame1D(Xu, plot_limits=plot_limits)
|
||||||
|
|
||||||
if samples == 0:
|
if samples == 0:
|
||||||
m, v = self._raw_predict_single_output(Xnew, output=output, which_parts=which_parts)
|
m, v = self._raw_predict_single_output(Xnew, output=output, which_parts=which_parts)
|
||||||
gpplot(Xnew, m, m - 2 * np.sqrt(v), m + 2 * np.sqrt(v), axes=ax)
|
gpplot(Xnew, m, m - 2 * np.sqrt(v), m + 2 * np.sqrt(v), axes=ax)
|
||||||
#ax.plot(self.X[which_data], self.likelihood.Y[which_data], 'kx', mew=1.5)
|
|
||||||
ax.plot(Xu[which_data], self.likelihood.Y[self.likelihood.index==output][:,None], 'kx', mew=1.5)
|
ax.plot(Xu[which_data], self.likelihood.Y[self.likelihood.index==output][:,None], 'kx', mew=1.5)
|
||||||
else:
|
else:
|
||||||
m, v = self._raw_predict_single_output(Xnew, output=output, which_parts=which_parts, full_cov=True)
|
m, v = self._raw_predict_single_output(Xnew, output=output, which_parts=which_parts, full_cov=True)
|
||||||
|
|
@ -117,6 +120,11 @@ class GPBase(Model):
|
||||||
Zu = self.Z[self.Z[:,-1]==output ,0:1] #??
|
Zu = self.Z[self.Z[:,-1]==output ,0:1] #??
|
||||||
ax.plot(Zu, np.zeros_like(Zu) + ax.get_ylim()[0], 'r|', mew=1.5, markersize=12)
|
ax.plot(Zu, np.zeros_like(Zu) + ax.get_ylim()[0], 'r|', mew=1.5, markersize=12)
|
||||||
|
|
||||||
|
elif self.X.shape[1] == 3 and hasattr(self,'multioutput'):
|
||||||
|
raise NotImplementedError, "Plots not implemented for multioutput models with 2D inputs...yet"
|
||||||
|
output -= 1
|
||||||
|
assert self.num_outputs >= output, 'The model has only %s outputs.' %self.num_outputs
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError, "Cannot define a frame with more than two input dimensions"
|
raise NotImplementedError, "Cannot define a frame with more than two input dimensions"
|
||||||
|
|
||||||
|
|
@ -126,6 +134,8 @@ class GPBase(Model):
|
||||||
|
|
||||||
:param levels: for 2D plotting, the number of contour levels to use
|
:param levels: for 2D plotting, the number of contour levels to use
|
||||||
is ax is None, create a new figure
|
is ax is None, create a new figure
|
||||||
|
:param output: which output to plot (for multiple output models only)
|
||||||
|
:type output: integer (first output is 0)
|
||||||
"""
|
"""
|
||||||
# TODO include samples
|
# TODO include samples
|
||||||
if which_data == 'all':
|
if which_data == 'all':
|
||||||
|
|
@ -135,7 +145,9 @@ class GPBase(Model):
|
||||||
fig = pb.figure(num=fignum)
|
fig = pb.figure(num=fignum)
|
||||||
ax = fig.add_subplot(111)
|
ax = fig.add_subplot(111)
|
||||||
|
|
||||||
if self.X.shape[1] == 1 and not hasattr(self,'multioutput'):
|
if not hasattr(self,'multioutput'):
|
||||||
|
|
||||||
|
if self.X.shape[1] == 1:
|
||||||
resolution = resolution or 200
|
resolution = resolution or 200
|
||||||
|
|
||||||
Xu = self.X * self._Xscale + self._Xoffset # NOTE self.X are the normalized values now
|
Xu = self.X * self._Xscale + self._Xoffset # NOTE self.X are the normalized values now
|
||||||
|
|
@ -150,7 +162,7 @@ class GPBase(Model):
|
||||||
ax.set_xlim(xmin, xmax)
|
ax.set_xlim(xmin, xmax)
|
||||||
ax.set_ylim(ymin, ymax)
|
ax.set_ylim(ymin, ymax)
|
||||||
|
|
||||||
elif self.X.shape[1] == 2 and not hasattr(self,'multioutput'):
|
elif self.X.shape[1] == 2:
|
||||||
resolution = resolution or 50
|
resolution = resolution or 50
|
||||||
Xnew, _, _, xmin, xmax = x_frame2D(self.X, plot_limits, resolution)
|
Xnew, _, _, xmin, xmax = x_frame2D(self.X, plot_limits, resolution)
|
||||||
x, y = np.linspace(xmin[0], xmax[0], resolution), np.linspace(xmin[1], xmax[1], resolution)
|
x, y = np.linspace(xmin[0], xmax[0], resolution), np.linspace(xmin[1], xmax[1], resolution)
|
||||||
|
|
@ -162,33 +174,32 @@ class GPBase(Model):
|
||||||
ax.set_xlim(xmin[0], xmax[0])
|
ax.set_xlim(xmin[0], xmax[0])
|
||||||
ax.set_ylim(xmin[1], xmax[1])
|
ax.set_ylim(xmin[1], xmax[1])
|
||||||
|
|
||||||
elif self.X.shape[1] == 2 and hasattr(self,'multioutput'):
|
else:
|
||||||
|
raise NotImplementedError, "Cannot define a frame with more than two input dimensions"
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
assert self.num_outputs > output, 'The model has only %s outputs.' %self.num_outputs
|
||||||
|
if self.X.shape[1] == 2:
|
||||||
|
resolution = resolution or 200
|
||||||
Xu = self.X[self.X[:,-1]==output,:] #keep the output of interest
|
Xu = self.X[self.X[:,-1]==output,:] #keep the output of interest
|
||||||
Xu = self.X * self._Xscale + self._Xoffset
|
Xu = self.X * self._Xscale + self._Xoffset
|
||||||
Xu = self.X[self.X[:,-1]==output ,0:1] #get rid of the index column
|
Xu = self.X[self.X[:,-1]==output ,0:1] #get rid of the index column
|
||||||
|
|
||||||
Xnew, xmin, xmax = x_frame1D(Xu, plot_limits=plot_limits)
|
Xnew, xmin, xmax = x_frame1D(Xu, plot_limits=plot_limits)
|
||||||
|
|
||||||
m, _, lower, upper = self.predict_single_output(Xnew, which_parts=which_parts,output=output)
|
m, _, lower, upper = self.predict_single_output(Xnew, which_parts=which_parts,output=output)
|
||||||
#if not isinstance(self.likelihood,EP_Mixed_Noise):
|
|
||||||
# m, _, lower, upper = self.predict(np.hstack([Xnew,np.repeat(output,Xnew.size)[:,None]]), which_parts=which_parts)
|
|
||||||
#else:
|
|
||||||
# m, _, lower, upper = self.predict_single_output(Xnew, which_parts=which_parts,output=output)
|
|
||||||
|
|
||||||
for d in range(m.shape[1]):
|
for d in range(m.shape[1]):
|
||||||
gpplot(Xnew, m[:, d], lower[:, d], upper[:, d], axes=ax)
|
gpplot(Xnew, m[:, d], lower[:, d], upper[:, d], axes=ax)
|
||||||
#ax.plot(Xu[which_data], self.likelihood.data[self.likelihood.index==output][:,None], 'kx', mew=1.5)
|
|
||||||
ax.plot(Xu[which_data], self.likelihood.noise_model_list[output].data, 'kx', mew=1.5)
|
ax.plot(Xu[which_data], self.likelihood.noise_model_list[output].data, 'kx', mew=1.5)
|
||||||
ymin, ymax = min(np.append(self.likelihood.data, lower)), max(np.append(self.likelihood.data, upper))
|
ymin, ymax = min(np.append(self.likelihood.data, lower)), max(np.append(self.likelihood.data, upper))
|
||||||
ymin, ymax = ymin - 0.1 * (ymax - ymin), ymax + 0.1 * (ymax - ymin)
|
ymin, ymax = ymin - 0.1 * (ymax - ymin), ymax + 0.1 * (ymax - ymin)
|
||||||
ax.set_xlim(xmin, xmax)
|
ax.set_xlim(xmin, xmax)
|
||||||
ax.set_ylim(ymin, ymax)
|
ax.set_ylim(ymin, ymax)
|
||||||
|
|
||||||
|
elif self.X.shape[1] == 3:
|
||||||
|
raise NotImplementedError, "Plots not yet implemented for multioutput models with 2D inputs"
|
||||||
|
resolution = resolution or 50
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError, "Cannot define a frame with more than two input dimensions"
|
raise NotImplementedError, "Cannot define a frame with more than two input dimensions"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue