def test_multivariate_gaussian() -> None: num_samples = 2000 dim = 2 mu = np.arange(0, dim) / float(dim) L_diag = np.ones((dim, )) L_low = 0.1 * np.ones((dim, dim)) * np.tri(dim, k=-1) L = np.diag(L_diag) + L_low Sigma = L.dot(L.transpose()) distr = MultivariateGaussian(mu=mx.nd.array(mu), L=mx.nd.array(L)) samples = distr.sample(num_samples) mu_hat, L_hat = maximum_likelihood_estimate_sgd( MultivariateGaussianOutput(dim=dim), samples, init_biases= None, # todo we would need to rework biases a bit to use it in the multivariate case hybridize=False, learning_rate=PositiveFloat(0.01), num_epochs=PositiveInt(10), ) distr = MultivariateGaussian(mu=mx.nd.array([mu_hat]), L=mx.nd.array([L_hat])) Sigma_hat = distr.variance[0].asnumpy() assert np.allclose( mu_hat, mu, atol=0.1, rtol=0.1), f"mu did not match: mu = {mu}, mu_hat = {mu_hat}" assert np.allclose( Sigma_hat, Sigma, atol=0.1, rtol=0.1 ), f"Sigma did not match: sigma = {Sigma}, sigma_hat = {Sigma_hat}"
( StudentTOutput(), mx.nd.random.normal(shape=(3, 4, 5, 6)), [None, mx.nd.ones(shape=(3, 4, 5))], (3, 4, 5), (), ), ( GammaOutput(), mx.nd.random.gamma(shape=(3, 4, 5, 6)), [None, mx.nd.ones(shape=(3, 4, 5))], (3, 4, 5), (), ), ( MultivariateGaussianOutput(dim=5), mx.nd.random.normal(shape=(3, 4, 10)), [None, mx.nd.ones(shape=(3, 4, 5))], (3, 4), (5, ), ), ( LowrankMultivariateGaussianOutput(dim=5, rank=4), mx.nd.random.normal(shape=(3, 4, 10)), [None, mx.nd.ones(shape=(3, 4, 5))], (3, 4), (5, ), ), ( DirichletOutput(dim=5), mx.nd.random.gamma(shape=(3, 4, 5)),
< 0.05 ) # can only calculated cdf for gaussians currently if isinstance(distr1, Gaussian) and isinstance(distr2, Gaussian): emp_cdf, edges = empirical_cdf(samples_mix.asnumpy()) calc_cdf = mixture.cdf(mx.nd.array(edges)).asnumpy() assert np.allclose(calc_cdf[1:, :], emp_cdf, atol=1e-2) @pytest.mark.parametrize( "distribution_outputs", [ ((GaussianOutput(), GaussianOutput()),), ((GaussianOutput(), StudentTOutput(), LaplaceOutput()),), ((MultivariateGaussianOutput(3), MultivariateGaussianOutput(3)),), ], ) def test_mixture_output(distribution_outputs) -> None: mdo = MixtureDistributionOutput(*distribution_outputs) args_proj = mdo.get_args_proj() args_proj.initialize() input = mx.nd.ones(shape=(512, 30)) distr_args = args_proj(input) d = mdo.distribution(distr_args) samples = d.sample(num_samples=NUM_SAMPLES)
LowrankMultivariateGaussianOutput(dim=target_dim, rank=2), 10, estimator, False, False, ), ( LowrankMultivariateGaussianOutput(dim=target_dim, rank=2), 10, estimator, True, False, ), (None, 10, estimator, True, True), ( MultivariateGaussianOutput(dim=target_dim), 10, estimator, False, True, ), ( MultivariateGaussianOutput(dim=target_dim), 10, estimator, True, True, ), ], ) def test_deepvar(
plt.plot(custom_datasetx[0]) plt.show() start = pd.Timestamp("01-01-2019", freq=freq) train_ds = [{ 'target': x, 'start': start } for x in custom_datasetx[:, :, :-prediction_length]] test_ds = [{'target': x, 'start': start} for x in custom_datasetx[:, :, :]] # Trainer parameters epochs = 1 learning_rate = 1E-3 batch_size = 1 num_batches_per_epoch = 2 # create estimator estimator = DeepAREstimator( prediction_length=prediction_length, context_length=prediction_length, freq=freq, # trainer=Trainer(ctx="gpu", epochs=epochs, learning_rate=learning_rate, hybridize=True, # batch_size=batch_size, num_batches_per_epoch=num_batches_per_epoch,), distr_output=MultivariateGaussianOutput(dim=2), ) predictor = estimator.train(train_ds)