mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-24 14:15:14 +02:00
commit
8d08da3348
15 changed files with 201 additions and 182 deletions
|
|
@ -1 +1 @@
|
||||||
__version__ = "1.0.1"
|
__version__ = "1.0.2"
|
||||||
|
|
|
||||||
|
|
@ -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]):
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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 |
Binary file not shown.
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 185 KiB |
|
|
@ -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__":
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
10
README.md
10
README.md
|
|
@ -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)
|
||||||
* [](http://opensource.org/licenses/BSD-3-Clause)
|
* [](http://opensource.org/licenses/BSD-3-Clause)
|
||||||
|
|
||||||
|
[](https://travis-ci.org/SheffieldML/GPy) [](http://codecov.io/github/SheffieldML/GPy?branch=devel) [](http://gpy.readthedocs.org/en/devel/) [](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:** | [](https://travis-ci.org/SheffieldML/GPy) | [](http://codecov.io/github/SheffieldML/GPy?branch=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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
2
setup.py
2
setup.py
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue