[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:
Full documentation can be accessed here: Documentation
import numpy as np
import mogptk
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
# 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.
# 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')
)
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.
# 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
.
dataset.plot();
And we can plot the spectrum with mogptk.Data.plot_spectrum
using the Lomb-Scargle method.
dataset.plot_spectrum(maxfreq=2);
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:
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.
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.
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.
# 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)
model.print_parameters()
Name | Range | Value |
---|---|---|
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.
# plot the prediction with the untrained model
model.plot_prediction(title='Untrained model');
The model can be trained using PyTorch optimizers, such as LBFGS, Adam, or SGD. For more information see 04 Model Training.
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
model.print_parameters()
Name | Range | Value |
---|---|---|
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] |
model.plot_prediction();
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.
# 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.
model.plot_prediction(title='Prediction outside training range');
Currently the toolkit admits the following transformations on channels:
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.
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)
dataset.plot(title='Dataset before transformation', transformed=False);
dataset.plot(title='Dataset after transformation', transformed=True);
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
model.plot_prediction(title='Training with log transformation');
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.
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.
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.
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.
model.plot_prediction();
Models can be saved with model.save
and loaded with mogptk.LoadModel
# save model
model.save('mosm_example')
# load model
loaded_model = mogptk.LoadModel('mosm_example')
loaded_model.plot_prediction(title='Loaded model');