00 Basic example using MOGPTK¶

[Estimated time of execution: 5 min]

This notebook shows the basics of MOGPTK: how to quickly load data and train a model.

The fundamental pillars of MOGPTK are the mogptk.Data and mogptk.Model classes, where the former stores the data for each channel and the latter defines the model to use. In this tutorial we will show how to use them in a toy dataset.

This tutorial shows examples for the following covariance kernels:

  • MOSM MultiOutput Spectral Mixture
  • CONV Convolutional Gaussian
  • CSM Cross Spectral Mixture
  • SM-LMC Spectral Mixture - Linear Model of Corregionalization

Full documentation can be accessed here: Documentation

In [1]:
import numpy as np
import mogptk

Generating a toy dataset¶

As a toy example we generate four noisy sinusoidal signals, each of which is of the same frequency but they differ in phase and delay as follows

In [2]:
# create time array
n_points = 100
t = np.linspace(0.0, 6.0, n_points)

# channel 1
y1 = np.sin(6.0*t) + 0.2*np.random.normal(size=len(t))

# channel 2, phased version
y2 = np.sin(6.0*t + 2.0) + 0.2*np.random.normal(size=len(t))

# channel 3, added sinosoidal
y3 = np.sin(6.0*t) - np.sin(4.0*t) + 0.2*np.random.normal(size=len(t))

# channel 4, delayed and amplified
y4 = 3.0*np.sin(6.0 * (t-2.0)) + 0.3*np.random.normal(size=len(t))

Then for each time series (channels) we will instantiate a mogptk.Data class object, which will be used to create a dataset instance mogptk.DataSet to be passed to the model.

More examples of data loading are in 01 Data Loading.

In [3]:
# create dataset
dataset = mogptk.DataSet(
    mogptk.Data(t, y1, name='First channel'),
    mogptk.Data(t, y2, name='Second channel'),
    mogptk.Data(t, y3, name='Third channel'),
    mogptk.Data(t, y4, name='Fourth channel')
)

Removing data to generate observations¶

Then we can remove the second half of the first channel with mogptk.Data.remove_range. Then we randomly remove 40% for all channels using the method mogptk.Data.remove_randomly.

More examples are in 02 Data Preparation.

In [4]:
# remove 40% randomly
for data in dataset:
    data.remove_randomly(pct=0.4)

# remove second half of the first channel
dataset[0].remove_range(start=2.0)

We can plot the signal in the time domain with mogptk.DataSet.plot.

In [5]:
dataset.plot();

And we can plot the spectrum with mogptk.Data.plot_spectrum using the Lomb-Scargle method.

In [6]:
dataset.plot_spectrum(maxfreq=2);

Models¶

To use a model we first create an mogptk.Model object, then we can initialize the parameters with sound heuristics and to assist optimization.

When creating the mogptk.Model object, we pass the dataset and the number of components (or model order). Initially, the kernel parameters are drawn from a Unif(0, 1), but we can optionally re-initialize them to help the optimization by:

  1. BNSE: Estimate the PSD for each channel via BNSE (Bayesian nonparametric spectral estimation, Tobar 2019), then utilize the position, magnitude and width of the estimated spectrum peaks as spectral means, weights and variance respectively.

  2. SM: For each channel fit a single output Gaussian process with aspectral mixture kernel (Gaussian process kernels for pattern discovery and extrapolation, Wilson and Adams 2013), and use said hyperparameters as initial parameters for the kernel.

  3. LS: Estimate the PSD for each channel via Lomb-Scargle, then utilize the position, magnitude and width of the estimated spectrum peaks as spectral means, weights and variance respectively.

This is done using the model.init_parameters() function. See the documentation of each model or 03 Parameter initialization where each method is covered in more detail.

In [7]:
# create model, uncomment for different kernels 
model = mogptk.MOSM(dataset, Q=2)
# model = mogptk.CSM(dataset, Q=2)
# model = mogptk.SM_LMC(dataset, Q=2)
# model = mogptk.CONV(dataset, Q=2)

# initialize parameters of kernel using LombScargle
model.init_parameters(method='LS', iters=500)
In [8]:
model.print_parameters()
NameRangeValue
MOSM.weight[1e-08, ∞)[[0.83443949 0.41940351] [0.60888554 0.18543165] [0.46857472 0.41174819] [0.6176511 0.20237856]]
MOSM.mean[1e-08, [[[8.250000000000007], [8.250000000000007]], [[8.250000000000007], [8.250000000000007]], [[8.250000000000007], [8.250000000000007]], [[8.250000000000007], [8.250000000000007]]]][[[0.967725] [1.11375 ]] [[0.954525] [7.01745 ]] [[0.669075] [0.926475]] [[0.95535 ] [0.731775]]]
MOSM.variance[1e-08, ∞)[[[0.08546875] [0.01071949]] [[0.02535868] [0.03078423]] [[0.02599687] [0.02416076]] [[0.02411544] [0.01677649]]]
MOSM.delay(-∞, ∞)[[[0.] [0.]] [[0.] [0.]] [[0.] [0.]] [[0.] [0.]]]
MOSM.phase(-∞, ∞)[[0. 0.] [0. 0.] [0. 0.] [0. 0.]]
Gaussian.scale[1e-08, ∞)[1. 1. 1. 1.]

We can obtain a preliminary prediction before training, just by using the pretrained (init) parameters.

Predictions are done with mogptk.Model.predict which either receives or uses an input set with mogptk.DataSet.set_prediction_range and returns the posterior mean and confidence intervals.

In [9]:
# plot the prediction with the untrained model
model.plot_prediction(title='Untrained model');

Training¶

The model can be trained using PyTorch optimizers, such as LBFGS, Adam, or SGD. For more information see 04 Model Training.

In [10]:
model.train(method='Adam', lr=0.1, iters=500,
            plot=True, error='MAE', verbose=True);
Starting optimization using Adam
‣ Model: MOSM
‣ Channels: 4
‣ Parameters: 44
‣ Training points: 201
‣ Initial loss: 286.988
‣ Initial error: 0.880404

Start Adam:
    0/500   0:00:00  loss=     286.988  error=    0.880404
    5/500   0:00:00  loss=     266.578  error=    0.646432
   10/500   0:00:00  loss=     243.831  error=    0.513807
   15/500   0:00:00  loss=     227.816  error=    0.375713
   20/500   0:00:00  loss=     219.543  error=     0.35118
   25/500   0:00:01  loss=     208.093  error=    0.324236
   30/500   0:00:01  loss=     189.601  error=    0.351707
   35/500   0:00:01  loss=     171.894  error=    0.256344
   40/500   0:00:01  loss=     162.855  error=    0.270838
   45/500   0:00:01  loss=     155.251  error=    0.333754
   50/500   0:00:02  loss=     144.334  error=    0.428871
   55/500   0:00:02  loss=     133.193  error=    0.329156
   60/500   0:00:02  loss=     122.604  error=    0.325594
   65/500   0:00:02  loss=     112.554  error=    0.188049
   70/500   0:00:02  loss=     102.541  error=    0.258697
   75/500   0:00:03  loss=     96.4466  error=    0.210797
   80/500   0:00:03  loss=     88.9197  error=    0.240794
   85/500   0:00:03  loss=     78.3374  error=    0.207596
   90/500   0:00:03  loss=     70.8626  error=    0.196253
   95/500   0:00:03  loss=     65.0796  error=    0.218476
  100/500   0:00:04  loss=     57.9483  error=    0.200224
  105/500   0:00:04  loss=      64.404  error=    0.225252
  110/500   0:00:04  loss=     54.9973  error=    0.219312
  115/500   0:00:04  loss=     44.2902  error=    0.194495
  120/500   0:00:04  loss=     37.9659  error=    0.198765
  125/500   0:00:04  loss=     33.4137  error=    0.197416
  130/500   0:00:05  loss=     30.6678  error=    0.188919
  135/500   0:00:05  loss=     25.7715  error=    0.187258
  140/500   0:00:05  loss=     22.4857  error=    0.189645
  145/500   0:00:05  loss=     20.5284  error=    0.187152
  150/500   0:00:05  loss=     17.7533  error=    0.193709
  155/500   0:00:05  loss=     52.0364  error=    0.241038
  160/500   0:00:06  loss=     16.4314  error=    0.187868
  165/500   0:00:06  loss=     13.5515  error=    0.185272
  170/500   0:00:06  loss=     13.0566  error=     0.20151
  175/500   0:00:06  loss=     11.5516  error=    0.185517
  180/500   0:00:06  loss=      10.597  error=    0.187273
  185/500   0:00:07  loss=     9.56733  error=    0.190877
  190/500   0:00:07  loss=     8.42059  error=    0.187001
  195/500   0:00:07  loss=     7.93836  error=    0.186676
  200/500   0:00:07  loss=     6.99103  error=    0.188711
  205/500   0:00:07  loss=     6.54421  error=    0.192616
  210/500   0:00:07  loss=     5.97645  error=    0.189968
  215/500   0:00:08  loss=     5.92715  error=    0.186697
  220/500   0:00:08  loss=     9.40029  error=    0.200035
  225/500   0:00:08  loss=     41.4737  error=     0.20296
  230/500   0:00:08  loss=      93.487  error=    0.503502
  235/500   0:00:08  loss=     88.1112  error=    0.472133
  240/500   0:00:08  loss=     128.283  error=    0.412006
  245/500   0:00:09  loss=     36.0967  error=    0.419357
  250/500   0:00:09  loss=     43.3976  error=    0.429102
  255/500   0:00:09  loss=     34.1106  error=    0.438199
  260/500   0:00:09  loss=     30.3829  error=    0.437988
  265/500   0:00:09  loss=     28.6807  error=    0.437534
  270/500   0:00:09  loss=     27.7199  error=    0.419175
  275/500   0:00:10  loss=     25.8928  error=    0.424973
  280/500   0:00:10  loss=     24.5578  error=    0.428308
  285/500   0:00:10  loss=     23.0979  error=    0.425377
  290/500   0:00:10  loss=      22.226  error=    0.425281
  295/500   0:00:10  loss=     21.5699  error=    0.427921
  300/500   0:00:10  loss=     21.0469  error=    0.424878
  305/500   0:00:11  loss=     20.6668  error=    0.430094
  310/500   0:00:11  loss=     21.5955  error=    0.425776
  315/500   0:00:11  loss=     20.3739  error=    0.429992
  320/500   0:00:11  loss=     19.6589  error=     0.42885
  325/500   0:00:11  loss=     19.5304  error=    0.430812
  330/500   0:00:11  loss=     19.1597  error=    0.430832
  335/500   0:00:12  loss=     18.5399  error=    0.436347
  340/500   0:00:12  loss=     18.6097  error=    0.426107
  345/500   0:00:12  loss=     17.8849  error=    0.442343
  350/500   0:00:12  loss=     17.6991  error=    0.432303
  355/500   0:00:13  loss=     17.5082  error=    0.437083
  360/500   0:00:13  loss=     16.8771  error=    0.431845
  365/500   0:00:13  loss=      17.074  error=    0.430123
  370/500   0:00:13  loss=     17.1066  error=     0.43112
  375/500   0:00:13  loss=     17.3087  error=    0.432358
  380/500   0:00:13  loss=     16.4156  error=    0.430698
  385/500   0:00:14  loss=     16.3187  error=    0.432889
  390/500   0:00:14  loss=     16.2041  error=    0.431864
  395/500   0:00:14  loss=     16.0413  error=    0.431638
  400/500   0:00:14  loss=     15.8076  error=    0.432602
  405/500   0:00:14  loss=     15.7179  error=    0.434201
  410/500   0:00:14  loss=     15.6108  error=    0.434033
  415/500   0:00:15  loss=     15.5117  error=    0.434274
  420/500   0:00:15  loss=      15.418  error=    0.434797
  425/500   0:00:15  loss=     16.2069  error=    0.433949
  430/500   0:00:15  loss=     16.7952  error=    0.436866
  435/500   0:00:15  loss=     15.1617  error=     0.43506
  440/500   0:00:15  loss=     15.6071  error=    0.433623
  445/500   0:00:16  loss=     15.2491  error=    0.434283
  450/500   0:00:16  loss=     14.9305  error=    0.435023
  455/500   0:00:16  loss=     14.9312  error=    0.435226
  460/500   0:00:16  loss=     14.7913  error=    0.434284
  465/500   0:00:16  loss=      14.652  error=    0.435948
  470/500   0:00:17  loss=      14.525  error=    0.434524
  475/500   0:00:17  loss=     14.4872  error=    0.436138
  480/500   0:00:17  loss=     14.3239  error=    0.434063
  485/500   0:00:17  loss=     14.2659  error=    0.435695
  490/500   0:00:17  loss=     14.3313  error=    0.434294
  495/500   0:00:18  loss=     19.6914  error=    0.435034
  500/500   0:00:18  loss=     15.3489  error=    0.432663
Finished

Optimization finished in 18.293 seconds
‣ Iterations: 500
‣ Final loss: 15.3489
‣ Final error: 0.432663
In [11]:
model.print_parameters()
NameRangeValue
MOSM.weight[1e-08, ∞)[[0.55338231 0.64450814] [0.75626404 0.11006062] [2.16007158 1.7755823 ] [1.93288591 0.1866039 ]]
MOSM.mean[1e-08, [[[8.250000000000007], [8.250000000000007]], [[8.250000000000007], [8.250000000000007]], [[8.250000000000007], [8.250000000000007]], [[8.250000000000007], [8.250000000000007]]]][[[0.78186162] [1.13901441]] [[0.95363676] [7.2338825 ]] [[0.63158155] [0.96255365]] [[0.95543377] [1.13255288]]]
MOSM.variance[1e-08, ∞)[[[0.04998783] [0.01255937]] [[0.01674546] [0.00450936]] [[0.00092303] [0.00196332]] [[0.0409018 ] [0.01240035]]]
MOSM.delay(-∞, ∞)[[[-0.80181196] [ 0.25812353]] [[ 0.28495792] [ 0. ]] [[ 0.16905944] [-0.18064657]] [[-0.2961951 ] [-2.24212651]]]
MOSM.phase(-∞, ∞)[[-0.80339413 0.33688732] [ 0.33267265 0. ] [ 0.2300818 -0.11988101] [-0.33766023 -2.39050045]]
Gaussian.scale[1e-08, ∞)[0.20316826 0.18319897 0.19316358 0.29692404]
In [12]:
model.plot_prediction();

Prediction outside training range¶

Prediction can be made outside the training range easily using the mogptk.Model.predict function. For this we construct a list of numpy arrays with the prediction inputs and then pass it as an argument to mogptk.Model.predict, so that we obtain the posterior mean and the upper and lower confidence intervals.

In [13]:
# we use the same time for all the channels
t_pred = np.linspace(6.0, 10.0, 100)
x_pred = [t_pred for i in range(len(dataset))]
dataset.set_prediction_data(x_pred)

The output of the function follows the same structure as the input, a list of length equal to the number of channels, where each element is a numpy array with the predictions on said channel.

In [14]:
model.plot_prediction(title='Prediction outside training range');

Data transformations¶

Currently the toolkit admits the following transformations on channels:

  • Linear
  • Normalize
  • Polynomial detrending
  • Logarithmic
  • Standard

These can be applied successively (i.e., as a function composition) as the toolkit keeps track of them. New transformations are straightforward to create by implementing the forward and backward transformations for the data.

As an example we'll apply the exponential function to the original data for the first three channels and fit the model with the log-transformation for those channels. For more information and an example of how to construct new transformations see 02 Data Preparation.

In [15]:
dataset = mogptk.DataSet()
dataset.append(mogptk.Data(t, np.exp(y1), name='Signal 1'))
dataset.append(mogptk.Data(t, np.exp(y2), name='Signal 2'))
dataset.append(mogptk.Data(t, np.exp(y3), name='Signal 3'))
dataset.append(mogptk.Data(t, y4, name='4'))

for data in dataset:
    data.remove_randomly(pct=0.3)
dataset[0].remove_range(start=2.0)

# apply transformation
for data in dataset[:-1]:
    data.transform(mogptk.TransformLog)
In [16]:
dataset.plot(title='Dataset before transformation', transformed=False);
In [17]:
dataset.plot(title='Dataset after transformation', transformed=True);
In [18]:
model = mogptk.MOSM(dataset, Q=2)
model.init_parameters('LS')
model.train(method='Adam', lr=0.1, iters=500, verbose=True, plot=True, error='MAE');
Starting optimization using Adam
‣ Model: MOSM
‣ Channels: 4
‣ Parameters: 44
‣ Training points: 235
‣ Initial loss: 320.514
‣ Initial error: 2.89519

Start Adam:
    0/500   0:00:00  loss=     320.514  error=     2.89519
    5/500   0:00:00  loss=     284.099  error=    0.732715
   10/500   0:00:00  loss=     259.566  error=    0.680079
   15/500   0:00:00  loss=      240.38  error=    0.652861
   20/500   0:00:00  loss=      225.15  error=    0.637245
   25/500   0:00:01  loss=     212.682  error=    0.618805
   30/500   0:00:01  loss=     201.787  error=    0.613979
   35/500   0:00:01  loss=     190.911  error=    0.604244
   40/500   0:00:01  loss=      179.58  error=    0.594661
   45/500   0:00:02  loss=     166.359  error=    0.415149
   50/500   0:00:02  loss=     155.303  error=    0.381348
   55/500   0:00:02  loss=     144.106  error=    0.344028
   60/500   0:00:02  loss=     133.338  error=    0.325767
   65/500   0:00:02  loss=     123.216  error=    0.298265
   70/500   0:00:03  loss=     112.849  error=    0.302176
   75/500   0:00:03  loss=     103.294  error=    0.281223
   80/500   0:00:03  loss=     93.7203  error=    0.302083
   85/500   0:00:03  loss=     84.5236  error=    0.281938
   90/500   0:00:03  loss=     75.6026  error=    0.281092
   95/500   0:00:04  loss=     67.0943  error=    0.279847
  100/500   0:00:04  loss=     59.3303  error=    0.273432
  105/500   0:00:04  loss=     51.4798  error=    0.276011
  110/500   0:00:04  loss=      44.074  error=    0.290543
  115/500   0:00:04  loss=      36.662  error=    0.273968
  120/500   0:00:05  loss=     30.1413  error=    0.283689
  125/500   0:00:05  loss=     24.8341  error=    0.274255
  130/500   0:00:05  loss=     18.9311  error=    0.293171
  135/500   0:00:05  loss=     42.8602  error=    0.534815
  140/500   0:00:05  loss=     31.4041  error=    0.579331
  145/500   0:00:05  loss=     21.5215  error=    0.576794
  150/500   0:00:06  loss=     20.2139  error=    0.627558
  155/500   0:00:06  loss=      26.915  error=    0.581598
  160/500   0:00:06  loss=     11.4963  error=    0.629601
  165/500   0:00:06  loss=     10.6693  error=    0.620995
  170/500   0:00:06  loss=     3.86189  error=    0.628838
  175/500   0:00:07  loss=     5.37022  error=    0.637665
  180/500   0:00:07  loss=    -2.64355  error=    0.629192
  185/500   0:00:07  loss=    -6.36532  error=    0.645348
  190/500   0:00:07  loss=    -8.17527  error=    0.639248
  195/500   0:00:07  loss=    -9.52949  error=    0.652895
  200/500   0:00:07  loss=    -7.37449  error=    0.672839
  205/500   0:00:08  loss=    -11.0897  error=    0.667356
  210/500   0:00:08  loss=    -11.3209  error=    0.673438
  215/500   0:00:08  loss=    -13.3857  error=    0.683352
  220/500   0:00:08  loss=     -14.962  error=    0.701271
  225/500   0:00:08  loss=    -14.4003  error=    0.714913
  230/500   0:00:09  loss=    -14.8493  error=    0.714589
  235/500   0:00:09  loss=    -17.4941  error=    0.741261
  240/500   0:00:09  loss=    -17.6922  error=     0.73808
  245/500   0:00:09  loss=    -18.8606  error=    0.720018
  250/500   0:00:09  loss=     -19.248  error=    0.741804
  255/500   0:00:09  loss=    -21.2175  error=    0.608264
  260/500   0:00:10  loss=    -28.1237  error=    0.287599
  265/500   0:00:10  loss=    -28.7751  error=    0.400497
  270/500   0:00:10  loss=    -15.2891  error=    0.557466
  275/500   0:00:10  loss=    -16.0481  error=    0.475529
  280/500   0:00:10  loss=      1.7269  error=    0.749593
  285/500   0:00:11  loss=    0.641551  error=     0.73093
  290/500   0:00:11  loss=     19.1978  error=    0.834357
  295/500   0:00:11  loss=     301.034  error=    0.659019
  300/500   0:00:11  loss=     110.461  error=    0.652869
  305/500   0:00:11  loss=     62.3077  error=    0.712309
  310/500   0:00:12  loss=     4.88049  error=    0.504657
  315/500   0:00:12  loss=    0.568148  error=    0.382917
  320/500   0:00:12  loss=    -8.70619  error=    0.513176
  325/500   0:00:12  loss=    -14.0254  error=    0.363736
  330/500   0:00:12  loss=    -18.7113  error=    0.259326
  335/500   0:00:12  loss=    -19.9818  error=    0.271212
  340/500   0:00:13  loss=    -24.2724  error=    0.347721
  345/500   0:00:13  loss=    -27.9687  error=    0.352536
  350/500   0:00:13  loss=     -29.613  error=    0.261393
  355/500   0:00:13  loss=    -31.5637  error=    0.274401
  360/500   0:00:13  loss=    -27.6039  error=    0.263288
  365/500   0:00:14  loss=    -27.0323  error=    0.294031
  370/500   0:00:14  loss=    -30.6761  error=     0.31428
  375/500   0:00:14  loss=    -33.4833  error=    0.264235
  380/500   0:00:14  loss=    -20.7006  error=    0.344279
  385/500   0:00:14  loss=     -30.593  error=    0.282845
  390/500   0:00:15  loss=    -26.0011  error=    0.307922
  395/500   0:00:15  loss=    -33.9461  error=     0.27705
  400/500   0:00:15  loss=    -32.1459  error=    0.281166
  405/500   0:00:15  loss=    -33.1837  error=    0.269729
  410/500   0:00:15  loss=    -36.1611  error=    0.266008
  415/500   0:00:16  loss=    -36.6991  error=    0.282462
  420/500   0:00:16  loss=    -37.6425  error=    0.267648
  425/500   0:00:16  loss=    -38.7867  error=    0.263279
  430/500   0:00:16  loss=    -39.2803  error=    0.262124
  435/500   0:00:16  loss=    -40.6766  error=    0.264533
  440/500   0:00:16  loss=    -40.8655  error=    0.273342
  445/500   0:00:17  loss=    -41.3802  error=    0.274405
  450/500   0:00:17  loss=    -40.5303  error=    0.271678
  455/500   0:00:17  loss=    -33.6402  error=    0.341478
  460/500   0:00:17  loss=    -33.9508  error=    0.385931
  465/500   0:00:17  loss=    -36.6548  error=    0.280373
  470/500   0:00:18  loss=    -36.5154  error=     0.28209
  475/500   0:00:18  loss=    -37.1256  error=    0.259129
  480/500   0:00:18  loss=    -41.1205  error=    0.267284
  485/500   0:00:18  loss=    -36.2757  error=    0.282749
  490/500   0:00:18  loss=    -38.7254  error=    0.253805
  495/500   0:00:19  loss=    -40.9387  error=     0.27092
  500/500   0:00:19  loss=    -42.6449  error=    0.267948
Finished

Optimization finished in 19.249 seconds
‣ Iterations: 500
‣ Final loss: -42.6449
‣ Final error: 0.267948
In [19]:
model.plot_prediction(title='Training with log transformation');

Load CSV¶

The toolkit also allows us to load datasets directly to the model from a CSV file with mogptk.LoadCSV, where we specify the filename and the name of the columns for input and output and it returns a Data class object. As an example, let us load the price of oil and gold.

For more information see 01 Data Loading.

In [20]:
oil = mogptk.LoadCSV(filename='data/gonu/brent-daily.csv',
                     x_col='Date', y_col='Price', name='Oil')

gold = mogptk.LoadCSV(filename='data/gonu/lmba-gold-usd-am-daily.csv',
                      x_col='Date', y_col='Price', name='Gold',
                      na_values='.')

dataset = mogptk.DataSet(oil, gold)

Once the data is loaded, the toolkit can: filter, agregate by days, remove ranges and set prediction ranges by specifying the date range rather than the internal values used as inputs.

In [21]:
for channel in dataset:
    # filter by date
    channel.filter('2015-01-01', '2018-12-31')
    
    # agregate from daily to weekly
    channel.aggregate('1W')
    
    # detrend the data set using a first-degree polynomial
    channel.transform(mogptk.TransformDetrend(degree=1))
    
    # remove by date range
    channel.remove_range('2016-11-15', '2017-01-01')
    channel.remove_randomly(pct=0.5)
    
    # set prediction range by date
    channel.set_prediction_range('2015-01-01', '2018-12-31', step='1D')
    
dataset.plot();

We can now train the model and set a prediction range by date.

In [22]:
model = mogptk.MOSM(dataset, Q=3)
model.init_parameters('SM')
model.train(method='Adam', lr=0.5, iters=500,
             verbose=True, plot=True, error='MAE');
Starting optimization using Adam
‣ Model: MOSM
‣ Channels: 2
‣ Parameters: 32
‣ Training points: 203
‣ Initial loss: 1278.53
‣ Initial error: 11.2788

Start Adam:
    0/500   0:00:00  loss=     1278.53  error=     11.2788
    5/500   0:00:00  loss=     1169.49  error=     15.4667
   10/500   0:00:00  loss=     1131.11  error=     20.3183
   15/500   0:00:00  loss=     1117.79  error=     19.2051
   20/500   0:00:00  loss=     1100.56  error=      20.623
   25/500   0:00:00  loss=        1080  error=     18.8293
   30/500   0:00:00  loss=     1068.52  error=      19.461
   35/500   0:00:00  loss=     1054.47  error=     19.2476
   40/500   0:00:00  loss=     1041.03  error=     17.9657
   45/500   0:00:00  loss=     1027.32  error=     17.2466
   50/500   0:00:00  loss=      1013.1  error=     16.4353
   55/500   0:00:01  loss=     1009.97  error=     14.8593
   60/500   0:00:01  loss=     992.561  error=     13.0671
   65/500   0:00:01  loss=      969.67  error=     11.9061
   70/500   0:00:01  loss=     961.075  error=     11.5362
   75/500   0:00:01  loss=     941.144  error=     9.97896
   80/500   0:00:01  loss=      923.21  error=     10.4071
   85/500   0:00:01  loss=     903.864  error=     11.6908
   90/500   0:00:01  loss=     891.808  error=     11.8523
   95/500   0:00:01  loss=     886.034  error=     12.0732
  100/500   0:00:02  loss=     886.798  error=     12.7457
  105/500   0:00:02  loss=     881.837  error=     13.3771
  110/500   0:00:02  loss=     882.729  error=     13.8968
  115/500   0:00:02  loss=     881.492  error=     14.3262
  120/500   0:00:02  loss=     881.954  error=     14.5738
  125/500   0:00:02  loss=     886.626  error=     14.6789
  130/500   0:00:02  loss=     882.317  error=     14.7903
  135/500   0:00:02  loss=     882.627  error=     14.8439
  140/500   0:00:02  loss=     881.944  error=     14.9072
  145/500   0:00:03  loss=       882.5  error=     14.9724
  150/500   0:00:03  loss=     878.376  error=     15.0148
  155/500   0:00:03  loss=     882.727  error=     15.0889
  160/500   0:00:03  loss=     883.616  error=     15.1585
  165/500   0:00:03  loss=     879.475  error=     15.2353
  170/500   0:00:03  loss=     884.657  error=     15.2241
  175/500   0:00:03  loss=     883.879  error=     15.2909
  180/500   0:00:03  loss=     879.902  error=       15.42
  185/500   0:00:03  loss=     876.063  error=     15.6618
  190/500   0:00:04  loss=     879.249  error=     15.9467
  195/500   0:00:04  loss=     878.194  error=     16.2304
  200/500   0:00:04  loss=     874.233  error=     16.4731
  205/500   0:00:04  loss=     869.836  error=      16.591
  210/500   0:00:04  loss=     858.881  error=     16.6411
  215/500   0:00:04  loss=     851.926  error=     16.5974
  220/500   0:00:04  loss=     851.026  error=     16.3981
  225/500   0:00:04  loss=     851.126  error=     16.1906
  230/500   0:00:05  loss=     852.161  error=     16.1753
  235/500   0:00:05  loss=     849.376  error=     16.2905
  240/500   0:00:05  loss=     848.393  error=     16.3804
  245/500   0:00:05  loss=     850.749  error=     16.5284
  250/500   0:00:05  loss=     849.149  error=      16.456
  255/500   0:00:05  loss=     848.568  error=     16.4365
  260/500   0:00:05  loss=     846.991  error=      16.505
  265/500   0:00:05  loss=     846.938  error=     16.6578
  270/500   0:00:05  loss=     847.992  error=     16.3878
  275/500   0:00:05  loss=     846.804  error=     16.4431
  280/500   0:00:05  loss=     846.109  error=     16.3129
  285/500   0:00:06  loss=     845.118  error=     16.2262
  290/500   0:00:06  loss=     844.098  error=      16.358
  295/500   0:00:06  loss=     843.052  error=     16.2631
  300/500   0:00:06  loss=     842.681  error=     16.1065
  305/500   0:00:06  loss=     841.409  error=     16.2099
  310/500   0:00:06  loss=     848.689  error=     16.4378
  315/500   0:00:06  loss=     843.477  error=     16.2335
  320/500   0:00:06  loss=     845.539  error=     16.5631
  325/500   0:00:06  loss=     846.648  error=     16.4315
  330/500   0:00:07  loss=     846.374  error=      16.602
  335/500   0:00:07  loss=     843.251  error=     16.3504
  340/500   0:00:07  loss=     847.733  error=     16.4581
  345/500   0:00:07  loss=     845.088  error=     16.2011
  350/500   0:00:07  loss=     846.101  error=     16.1709
  355/500   0:00:07  loss=     842.359  error=     16.3172
  360/500   0:00:07  loss=     848.239  error=     16.7963
  365/500   0:00:07  loss=     848.105  error=     16.3332
  370/500   0:00:07  loss=     846.691  error=     16.2407
  375/500   0:00:07  loss=     844.442  error=     16.2828
  380/500   0:00:07  loss=     845.312  error=     16.3187
  385/500   0:00:08  loss=     846.557  error=     16.4491
  390/500   0:00:08  loss=     846.465  error=     16.4247
  395/500   0:00:08  loss=     847.549  error=     16.4018
  400/500   0:00:08  loss=     847.021  error=     16.4059
  405/500   0:00:08  loss=     845.458  error=     16.5625
  410/500   0:00:08  loss=       847.1  error=      16.512
  415/500   0:00:08  loss=     847.429  error=     16.4893
  420/500   0:00:08  loss=     847.233  error=     16.3061
  425/500   0:00:08  loss=       845.6  error=     16.2602
  430/500   0:00:08  loss=     845.408  error=     16.3061
  435/500   0:00:09  loss=     840.552  error=     16.2612
  440/500   0:00:09  loss=     846.369  error=     16.3551
  445/500   0:00:09  loss=     840.008  error=     16.2142
  450/500   0:00:09  loss=      847.04  error=     16.6075
  455/500   0:00:09  loss=     841.167  error=     16.1303
  460/500   0:00:09  loss=     838.825  error=     16.1084
  465/500   0:00:09  loss=     846.671  error=     16.2852
  470/500   0:00:09  loss=     843.623  error=     16.2042
  475/500   0:00:09  loss=     839.989  error=     16.1578
  480/500   0:00:09  loss=     839.865  error=     16.1542
  485/500   0:00:10  loss=     847.806  error=     16.6096
  490/500   0:00:10  loss=     846.944  error=     16.2639
  495/500   0:00:10  loss=     844.866  error=     16.2511
  500/500   0:00:10  loss=     846.925  error=     16.3944
Finished

Optimization finished in 10.351 seconds
‣ Iterations: 500
‣ Final loss: 846.925
‣ Final error: 16.3944

Next we can predict and plot our model.

In [23]:
model.plot_prediction();

Load/Save Models¶

Models can be saved with model.save and loaded with mogptk.LoadModel

In [24]:
# save model
model.save('mosm_example')
In [25]:
# load model
loaded_model = mogptk.LoadModel('mosm_example')
In [26]:
loaded_model.plot_prediction(title='Loaded model');
In [ ]: