diff --git a/data/2Dletters/A.mat b/data/2Dletters/A.mat new file mode 100644 index 0000000..7482172 Binary files /dev/null and b/data/2Dletters/A.mat differ diff --git a/data/2Dletters/B.mat b/data/2Dletters/B.mat new file mode 100644 index 0000000..0f6d468 Binary files /dev/null and b/data/2Dletters/B.mat differ diff --git a/data/2Dletters/C.mat b/data/2Dletters/C.mat new file mode 100644 index 0000000..9143fbd Binary files /dev/null and b/data/2Dletters/C.mat differ diff --git a/data/2Dletters/D.mat b/data/2Dletters/D.mat new file mode 100644 index 0000000..3452d5c Binary files /dev/null and b/data/2Dletters/D.mat differ diff --git a/data/2Dletters/E.mat b/data/2Dletters/E.mat new file mode 100644 index 0000000..bfc6e7a Binary files /dev/null and b/data/2Dletters/E.mat differ diff --git a/data/2Dletters/F.mat b/data/2Dletters/F.mat new file mode 100644 index 0000000..8c3c25a Binary files /dev/null and b/data/2Dletters/F.mat differ diff --git a/data/2Dletters/G.mat b/data/2Dletters/G.mat new file mode 100644 index 0000000..1e51e9d Binary files /dev/null and b/data/2Dletters/G.mat differ diff --git a/data/2Dletters/H.mat b/data/2Dletters/H.mat new file mode 100644 index 0000000..e047508 Binary files /dev/null and b/data/2Dletters/H.mat differ diff --git a/data/2Dletters/I.mat b/data/2Dletters/I.mat new file mode 100644 index 0000000..7a7baca Binary files /dev/null and b/data/2Dletters/I.mat differ diff --git a/data/2Dletters/J.mat b/data/2Dletters/J.mat new file mode 100644 index 0000000..c16ae8f Binary files /dev/null and b/data/2Dletters/J.mat differ diff --git a/data/2Dletters/K.mat b/data/2Dletters/K.mat new file mode 100644 index 0000000..899db07 Binary files /dev/null and b/data/2Dletters/K.mat differ diff --git a/data/2Dletters/L.mat b/data/2Dletters/L.mat new file mode 100644 index 0000000..fd43124 Binary files /dev/null and b/data/2Dletters/L.mat differ diff --git a/data/2Dletters/M.mat b/data/2Dletters/M.mat new file mode 100644 index 0000000..a474594 Binary files /dev/null and b/data/2Dletters/M.mat differ diff --git a/data/2Dletters/N.mat b/data/2Dletters/N.mat new file mode 100644 index 0000000..71c12c5 Binary files /dev/null and b/data/2Dletters/N.mat differ diff --git a/data/2Dletters/O.mat b/data/2Dletters/O.mat new file mode 100644 index 0000000..f148559 Binary files /dev/null and b/data/2Dletters/O.mat differ diff --git a/data/2Dletters/P.mat b/data/2Dletters/P.mat new file mode 100644 index 0000000..2b049d1 Binary files /dev/null and b/data/2Dletters/P.mat differ diff --git a/data/2Dletters/Q.mat b/data/2Dletters/Q.mat new file mode 100644 index 0000000..cabd291 Binary files /dev/null and b/data/2Dletters/Q.mat differ diff --git a/data/2Dletters/R.mat b/data/2Dletters/R.mat new file mode 100644 index 0000000..71cc378 Binary files /dev/null and b/data/2Dletters/R.mat differ diff --git a/data/2Dletters/README.md b/data/2Dletters/README.md new file mode 100644 index 0000000..94efc57 --- /dev/null +++ b/data/2Dletters/README.md @@ -0,0 +1,2 @@ + +This document contains the data (trajectories) to draw 2D letters. The data is provided by Sylvain Calinon. diff --git a/data/2Dletters/S.mat b/data/2Dletters/S.mat new file mode 100644 index 0000000..040d5aa Binary files /dev/null and b/data/2Dletters/S.mat differ diff --git a/data/2Dletters/T.mat b/data/2Dletters/T.mat new file mode 100644 index 0000000..3d05525 Binary files /dev/null and b/data/2Dletters/T.mat differ diff --git a/data/2Dletters/U.mat b/data/2Dletters/U.mat new file mode 100644 index 0000000..9dc1b51 Binary files /dev/null and b/data/2Dletters/U.mat differ diff --git a/data/2Dletters/V.mat b/data/2Dletters/V.mat new file mode 100644 index 0000000..78c880b Binary files /dev/null and b/data/2Dletters/V.mat differ diff --git a/data/2Dletters/W.mat b/data/2Dletters/W.mat new file mode 100644 index 0000000..1ffdadb Binary files /dev/null and b/data/2Dletters/W.mat differ diff --git a/data/2Dletters/X.mat b/data/2Dletters/X.mat new file mode 100644 index 0000000..bb1de76 Binary files /dev/null and b/data/2Dletters/X.mat differ diff --git a/data/2Dletters/Y.mat b/data/2Dletters/Y.mat new file mode 100644 index 0000000..21f6c9a Binary files /dev/null and b/data/2Dletters/Y.mat differ diff --git a/data/2Dletters/Z.mat b/data/2Dletters/Z.mat new file mode 100644 index 0000000..af4a88b Binary files /dev/null and b/data/2Dletters/Z.mat differ diff --git a/examples/models/gmr.py b/examples/models/gmr.py new file mode 100644 index 0000000..a9508a4 --- /dev/null +++ b/examples/models/gmr.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +"""Provide some examples using GMR. + +See also the `gmm.py` example beforehand. In this example, we delve a bit deeper into GMR using 2D letters as training +data. +""" + +import numpy as np +from scipy.io import loadmat +import matplotlib.pyplot as plt + +from pyrobolearn.models.gmm import Gaussian, GMM, plot_gmm, plot_gmr + + +# load the training data +G = loadmat('../../data/2Dletters/G.mat') # dict +demos = G['demos'] # shape (1,N) +n_demos = demos.shape[1] +dim = demos[0, 0][0, 0][0].shape[0] +length = demos[0, 0][0, 0][0].shape[1] + +# plot the training data (x,y) +X = [] +xlim, ylim = [-10, 10], [-10, 10] +plt.xlim(xlim) +plt.ylim(ylim) +for i in range(0, n_demos, 2): + demo = demos[0, i][0, 0][0] # shape (2, 200) + plt.plot(demo[0], demo[1]) + X.append(demo.T) +plt.show() + +# reshape training data (add time in addition to (x,y), thus we now have (t,x,y)) +time_linspace = np.linspace(0, 2., length) +times = np.asarray([time_linspace for _ in range(len(X))]).reshape(-1, 1) +X = np.vstack(X) # shape (N*200, 2) +X = np.hstack((times, X)) # shape (N*200, 3) +print(X.shape) + +# create GMM +dim, num_components = X.shape[1], 7 +gmm = GMM(gaussians=[Gaussian(mean=np.concatenate((np.random.uniform(0, 2., size=1), + np.random.uniform(-8., 8., size=dim-1))), + covariance=0.1*np.identity(dim)) for _ in range(num_components)]) + +# init GMM +init_method = 'k-means' # 'random', 'k-means', 'uniform', 'sklearn', 'curvature' +gmm.init(X, method=init_method) +fig, ax = plt.subplots(1, 1) +plot_gmm(gmm, dims=[1, 2], X=X, ax=ax, title='GMM after ' + init_method.capitalize(), xlim=xlim, ylim=ylim) +plt.show() + +# fit a GMM on it +result = gmm.fit(X, init=None, num_iters=200) + +# plot EM optimization +plt.plot(result['losses']) +plt.title('EM per iteration') +plt.show() + +# plot trained GMM +fig, ax = plt.subplots(1, 1) +plot_gmm(gmm, dims=[1, 2], X=X, label=True, ax=ax, title='Our Trained GMM', option=1, xlim=xlim, ylim=ylim) +plt.show() + +# GMR: condition on the input variable and plot +gaussians = [] +for t in time_linspace: + g = gmm.condition(np.array([t]), idx_out=[1, 2], idx_in=[0]).approximate_by_single_gaussian() + gaussians.append(g) + +# plot figures for GMR +plot_gmr(time_linspace, gaussians=gaussians, xlim=xlim, ylim=ylim) +plt.show()