Merge pull request #359 from SheffieldML/devel

Minor patch
This commit is contained in:
Max Zwiessele 2016-04-05 13:46:21 +01:00
commit 8d08da3348
15 changed files with 201 additions and 182 deletions

View file

@ -1 +1 @@
__version__ = "1.0.1" __version__ = "1.0.2"

View file

@ -437,15 +437,22 @@ class GP(Model):
warnings.warn("Wrong naming, use predict_wishart_embedding instead. Will be removed in future versions!", DeprecationWarning) warnings.warn("Wrong naming, use predict_wishart_embedding instead. Will be removed in future versions!", DeprecationWarning)
return self.predict_wishart_embedding(Xnew, kern, mean, covariance) return self.predict_wishart_embedding(Xnew, kern, mean, covariance)
def predict_magnification(self, Xnew, kern=None, mean=True, covariance=True): def predict_magnification(self, Xnew, kern=None, mean=True, covariance=True, dimensions=None):
""" """
Predict the magnification factor as Predict the magnification factor as
sqrt(det(G)) sqrt(det(G))
for each point N in Xnew for each point N in Xnew.
:param bool mean: whether to include the mean of the wishart embedding.
:param bool covariance: whether to include the covariance of the wishart embedding.
:param array-like dimensions: which dimensions of the input space to use [defaults to self.get_most_significant_input_dimensions()[:2]]
""" """
G = self.predict_wishard_embedding(Xnew, kern, mean, covariance) G = self.predict_wishard_embedding(Xnew, kern, mean, covariance)
if dimensions is None:
dimensions = self.get_most_significant_input_dimensions()[:2]
G = G[:, dimensions][:,:,dimensions]
from ..util.linalg import jitchol from ..util.linalg import jitchol
mag = np.empty(Xnew.shape[0]) mag = np.empty(Xnew.shape[0])
for n in range(Xnew.shape[0]): for n in range(Xnew.shape[0]):

View file

@ -15,19 +15,10 @@
# #
import numpy as np import numpy as np
from scipy import linalg
from scipy import stats from scipy import stats
from ..core import Model
from .. import kern
#from GPy.plotting.matplot_dep.models_plots import gpplot
#from GPy.plotting.matplot_dep.base_plots import x_frame1D
#from GPy.plotting.matplot_dep import Tango
#import pylab as pb
from GPy.core.parameterization.param import Param
import GPy
from .. import likelihoods from .. import likelihoods
#from . import state_space_setup as ss_setup
from ..core import Model
from . import state_space_main as ssm from . import state_space_main as ssm
from . import state_space_setup as ss_setup from . import state_space_setup as ss_setup
@ -37,12 +28,12 @@ class StateSpace(Model):
if len(X.shape) == 1: if len(X.shape) == 1:
X = np.atleast_2d(X).T X = np.atleast_2d(X).T
self.num_data, input_dim = X.shape self.num_data, self.input_dim = X.shape
if len(Y.shape) == 1: if len(Y.shape) == 1:
Y = np.atleast_2d(Y).T Y = np.atleast_2d(Y).T
assert input_dim==1, "State space methods are only for 1D data" assert self.input_dim==1, "State space methods are only for 1D data"
if len(Y.shape)==2: if len(Y.shape)==2:
num_data_Y, self.output_dim = Y.shape num_data_Y, self.output_dim = Y.shape
@ -168,7 +159,7 @@ class StateSpace(Model):
def log_likelihood(self): def log_likelihood(self):
return self._log_marginal_likelihood return self._log_marginal_likelihood
def _raw_predict(self, Xnew=None, Ynew=None, filteronly=False): def _raw_predict(self, Xnew=None, Ynew=None, filteronly=False, **kw):
""" """
Performs the actual prediction for new X points. Performs the actual prediction for new X points.
Inner function. It is called only from inside this class. Inner function. It is called only from inside this class.
@ -270,22 +261,23 @@ class StateSpace(Model):
# Return the posterior of the state # Return the posterior of the state
return (m, V) return (m, V)
def predict(self, Xnew=None, filteronly=False): def predict(self, Xnew=None, filteronly=False, include_likelihood=True, **kw):
# Run the Kalman filter to get the state # Run the Kalman filter to get the state
(m, V) = self._raw_predict(Xnew,filteronly=filteronly) (m, V) = self._raw_predict(Xnew,filteronly=filteronly)
# Add the noise variance to the state variance # Add the noise variance to the state variance
V += float(self.Gaussian_noise.variance) if include_likelihood:
V += float(self.likelihood.variance)
# Lower and upper bounds # Lower and upper bounds
lower = m - 2*np.sqrt(V) #lower = m - 2*np.sqrt(V)
upper = m + 2*np.sqrt(V) #upper = m + 2*np.sqrt(V)
# Return mean and variance # Return mean and variance
return (m, V, lower, upper) return m, V
def predict_quantiles(self, Xnew=None, quantiles=(2.5, 97.5)): def predict_quantiles(self, Xnew=None, quantiles=(2.5, 97.5), **kw):
mu, var = self._raw_predict(Xnew) mu, var = self._raw_predict(Xnew)
#import pdb; pdb.set_trace() #import pdb; pdb.set_trace()
return [stats.norm.ppf(q/100.)*np.sqrt(var + float(self.Gaussian_noise.variance)) + mu for q in quantiles] return [stats.norm.ppf(q/100.)*np.sqrt(var + float(self.Gaussian_noise.variance)) + mu for q in quantiles]

View file

@ -52,6 +52,17 @@ def inject_plotting():
GP.plot_f = gpy_plot.gp_plots.plot_f GP.plot_f = gpy_plot.gp_plots.plot_f
GP.plot_magnification = gpy_plot.latent_plots.plot_magnification GP.plot_magnification = gpy_plot.latent_plots.plot_magnification
from ..models import StateSpace
StateSpace.plot_data = gpy_plot.data_plots.plot_data
StateSpace.plot_data_error = gpy_plot.data_plots.plot_data_error
StateSpace.plot_errorbars_trainset = gpy_plot.data_plots.plot_errorbars_trainset
StateSpace.plot_mean = gpy_plot.gp_plots.plot_mean
StateSpace.plot_confidence = gpy_plot.gp_plots.plot_confidence
StateSpace.plot_density = gpy_plot.gp_plots.plot_density
StateSpace.plot_samples = gpy_plot.gp_plots.plot_samples
StateSpace.plot = gpy_plot.gp_plots.plot
StateSpace.plot_f = gpy_plot.gp_plots.plot_f
from ..core import SparseGP from ..core import SparseGP
SparseGP.plot_inducing = gpy_plot.data_plots.plot_inducing SparseGP.plot_inducing = gpy_plot.data_plots.plot_inducing

View file

@ -190,6 +190,7 @@ def scatter_label_generator(labels, X, visible_dims, marker=None):
x = X[index, input_1] x = X[index, input_1]
y = X[index, input_2] y = X[index, input_2]
z = X[index, input_3] z = X[index, input_3]
yield x, y, z, this_label, index, m yield x, y, z, this_label, index, m
def subsample_X(X, labels, num_samples=1000): def subsample_X(X, labels, num_samples=1000):

View file

@ -131,14 +131,15 @@ class PlotlyPlots(AbstractPlottingLibrary):
#not matplotlib marker #not matplotlib marker
pass pass
marker_kwargs = marker_kwargs or {} marker_kwargs = marker_kwargs or {}
marker_kwargs.setdefault('symbol', marker) if 'symbol' not in marker_kwargs:
marker_kwargs['symbol'] = marker
if Z is not None: if Z is not None:
return Scatter3d(x=X, y=Y, z=Z, mode='markers', return Scatter3d(x=X, y=Y, z=Z, mode='markers',
showlegend=label is not None, showlegend=label is not None,
marker=Marker(color=color, colorscale=cmap, **marker_kwargs), marker=Marker(color=color, colorscale=cmap, **marker_kwargs),
name=label, **kwargs) name=label, **kwargs)
return Scatter(x=X, y=Y, mode='markers', showlegend=label is not None, return Scatter(x=X, y=Y, mode='markers', showlegend=label is not None,
marker=Marker(color=color, colorscale=cmap, **marker_kwargs or {}), marker=Marker(color=color, colorscale=cmap, **marker_kwargs),
name=label, **kwargs) name=label, **kwargs)
def plot(self, ax, X, Y, Z=None, color=None, label=None, line_kwargs=None, **kwargs): def plot(self, ax, X, Y, Z=None, color=None, label=None, line_kwargs=None, **kwargs):

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 191 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Before After
Before After

View file

@ -730,6 +730,7 @@ class GradientTests(np.testing.TestCase):
self.assertTrue( np.allclose(var1, var2) ) self.assertTrue( np.allclose(var1, var2) )
def test_gp_VGPC(self): def test_gp_VGPC(self):
np.random.seed(10)
num_obs = 25 num_obs = 25
X = np.random.randint(0, 140, num_obs) X = np.random.randint(0, 140, num_obs)
X = X[:, None] X = X[:, None]
@ -737,6 +738,7 @@ class GradientTests(np.testing.TestCase):
kern = GPy.kern.Bias(1) + GPy.kern.RBF(1) kern = GPy.kern.Bias(1) + GPy.kern.RBF(1)
lik = GPy.likelihoods.Gaussian() lik = GPy.likelihoods.Gaussian()
m = GPy.models.GPVariationalGaussianApproximation(X, Y, kernel=kern, likelihood=lik) m = GPy.models.GPVariationalGaussianApproximation(X, Y, kernel=kern, likelihood=lik)
m.randomize()
self.assertTrue(m.checkgrad()) self.assertTrue(m.checkgrad())
def test_ssgplvm(self): def test_ssgplvm(self):
@ -744,12 +746,14 @@ class GradientTests(np.testing.TestCase):
from GPy.models import SSGPLVM from GPy.models import SSGPLVM
from GPy.examples.dimensionality_reduction import _simulate_matern from GPy.examples.dimensionality_reduction import _simulate_matern
np.random.seed(10)
D1, D2, D3, N, num_inducing, Q = 13, 5, 8, 45, 3, 9 D1, D2, D3, N, num_inducing, Q = 13, 5, 8, 45, 3, 9
_, _, Ylist = _simulate_matern(D1, D2, D3, N, num_inducing, False) _, _, Ylist = _simulate_matern(D1, D2, D3, N, num_inducing, False)
Y = Ylist[0] Y = Ylist[0]
k = kern.Linear(Q, ARD=True) # + kern.white(Q, _np.exp(-2)) # + kern.bias(Q) k = kern.Linear(Q, ARD=True) # + kern.white(Q, _np.exp(-2)) # + kern.bias(Q)
# k = kern.RBF(Q, ARD=True, lengthscale=10.) # k = kern.RBF(Q, ARD=True, lengthscale=10.)
m = SSGPLVM(Y, Q, init="rand", num_inducing=num_inducing, kernel=k, group_spike=True) m = SSGPLVM(Y, Q, init="rand", num_inducing=num_inducing, kernel=k, group_spike=True)
m.randomize()
self.assertTrue(m.checkgrad()) self.assertTrue(m.checkgrad())
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -89,6 +89,9 @@ def _image_directories():
cbook.mkdirs(result_dir) cbook.mkdirs(result_dir)
return baseline_dir, result_dir return baseline_dir, result_dir
baseline_dir, result_dir = _image_directories()
if not os.path.exists(baseline_dir):
raise SkipTest("Not installed from source, baseline not available. Install from source to test plotting")
def _sequenceEqual(a, b): def _sequenceEqual(a, b):
assert len(a) == len(b), "Sequences not same length" assert len(a) == len(b), "Sequences not same length"
@ -99,7 +102,6 @@ def _notFound(path):
raise IOError('File {} not in baseline') raise IOError('File {} not in baseline')
def _image_comparison(baseline_images, extensions=['pdf','svg','png'], tol=11): def _image_comparison(baseline_images, extensions=['pdf','svg','png'], tol=11):
baseline_dir, result_dir = _image_directories()
for num, base in zip(plt.get_fignums(), baseline_images): for num, base in zip(plt.get_fignums(), baseline_images):
for ext in extensions: for ext in extensions:
fig = plt.figure(num) fig = plt.figure(num)

View file

@ -17,5 +17,5 @@ recursive-include GPy *.h
recursive-include GPy *.pyx recursive-include GPy *.pyx
# Testing # Testing
include GPy/testing/baseline/*.png #include GPy/testing/baseline/*.png
#include GPy/testing/pickle_test.pickle #include GPy/testing/pickle_test.pickle

View file

@ -9,6 +9,8 @@ The Gaussian processes framework in Python.
* Travis-CI [unit-tests](https://travis-ci.org/SheffieldML/GPy) * Travis-CI [unit-tests](https://travis-ci.org/SheffieldML/GPy)
* [![licence](https://img.shields.io/badge/licence-BSD-blue.svg)](http://opensource.org/licenses/BSD-3-Clause) * [![licence](https://img.shields.io/badge/licence-BSD-blue.svg)](http://opensource.org/licenses/BSD-3-Clause)
[![develstat](https://travis-ci.org/SheffieldML/GPy.svg?branch=devel)](https://travis-ci.org/SheffieldML/GPy) [![covdevel](http://codecov.io/github/SheffieldML/GPy/coverage.svg?branch=devel)](http://codecov.io/github/SheffieldML/GPy?branch=devel) [![docdevel](https://readthedocs.org/projects/gpy/badge/?version=devel)](http://gpy.readthedocs.org/en/devel/) [![Research software impact](http://depsy.org/api/package/pypi/GPy/badge.svg)](http://depsy.org/package/python/GPy)
## Updated Structure ## Updated Structure
We have pulled the core parameterization out of GPy. It is a package called [paramz](https://github.com/sods/paramz) and is the pure gradient based model optimization. We have pulled the core parameterization out of GPy. It is a package called [paramz](https://github.com/sods/paramz) and is the pure gradient based model optimization.
@ -27,12 +29,6 @@ A warning: This usually works, but sometimes `distutils/setuptools` opens a
whole can of worms here, specially when compiled extensions are involved. whole can of worms here, specially when compiled extensions are involved.
If that is the case, it is best to clean the repo and reinstall. If that is the case, it is best to clean the repo and reinstall.
## Continuous integration
| | Travis-CI | Codecov | RTFD |
| ---: | :--: | :---: | :---: |
| **devel:** | [![develstat](https://travis-ci.org/SheffieldML/GPy.svg?branch=devel)](https://travis-ci.org/SheffieldML/GPy) | [![covdevel](http://codecov.io/github/SheffieldML/GPy/coverage.svg?branch=devel)](http://codecov.io/github/SheffieldML/GPy?branch=devel) | [![docdevel](https://readthedocs.org/projects/gpy/badge/?version=devel)](http://gpy.readthedocs.org/en/devel/) |
## Supported Platforms: ## Supported Platforms:
[<img src="https://www.python.org/static/community_logos/python-logo-generic.svg" height=40px>](https://www.python.org/) [<img src="https://www.python.org/static/community_logos/python-logo-generic.svg" height=40px>](https://www.python.org/)
@ -40,7 +36,7 @@ If that is the case, it is best to clean the repo and reinstall.
[<img src="https://upload.wikimedia.org/wikipedia/commons/8/8e/OS_X-Logo.svg" height=40px>](http://www.apple.com/osx/) [<img src="https://upload.wikimedia.org/wikipedia/commons/8/8e/OS_X-Logo.svg" height=40px>](http://www.apple.com/osx/)
[<img src="https://upload.wikimedia.org/wikipedia/commons/3/35/Tux.svg" height=40px>](https://en.wikipedia.org/wiki/List_of_Linux_distributions) [<img src="https://upload.wikimedia.org/wikipedia/commons/3/35/Tux.svg" height=40px>](https://en.wikipedia.org/wiki/List_of_Linux_distributions)
Python 2.7, 3.3 and higher Python 2.7, 3.4 and higher
## Citation ## Citation

View file

@ -1,5 +1,5 @@
[bumpversion] [bumpversion]
current_version = 1.0.1 current_version = 1.0.2
tag = False tag = False
commit = True commit = True
@ -11,3 +11,6 @@ universal = 1
[upload_docs] [upload_docs]
upload-dir = doc/build/html upload-dir = doc/build/html
[metadata]
description-file = README.rst

View file

@ -182,6 +182,8 @@ if not os.path.exists(user_file):
if os.path.exists(old_user_file): if os.path.exists(old_user_file):
# Move it to new location: # Move it to new location:
print("GPy: Found old config file, moving to new location {}".format(user_file)) print("GPy: Found old config file, moving to new location {}".format(user_file))
if not os.path.exists(os.path.dirname(user_file)):
os.makedirs(os.path.dirname(user_file))
os.rename(old_user_file, user_file) os.rename(old_user_file, user_file)
else: else:
# No config file exists, save informative stub to user config folder: # No config file exists, save informative stub to user config folder: