Skip to main content

Generate correlated random samples

Project description

Generate stationary correlated time-series

Summary

This Python function creates a time-series (discrete-time random process) with a specific autocorrelation function (ACF) and continuous probability distribution, e.g with predefined probability density function (PDF).

Usage:

from generate_corr_sequence import gen_corr_sequence
gen_corr_sequence(dist_obj=uniform,
                  target_acf=1 - np.minimum(np.arange(0, 100), 100) / 100,
                  L: int = 2 ** 20,
                  seed=None,
                  debug: bool = False,
                  plot_figures_name: str = None)

Arguments

  • dist_obj - A continuous distribution object from scipy.stats, default is uniform
  • target_acf - A required ACF function, default is a linear function
  • L - Number of required samples
  • seed - Seed of the random number generator
  • debug - Plots PDF and ACF graphs
  • plot_figures_name - Filename of the debug figure to be saved, only when debug is True. In no extension is provided, the default is png.

Returns:

  • A random sequence with pre-defined ACF and distribution with type numpy.ndarray.

Examples

Default settings with uniform distribution and linear ACF

The example below shows the default settings of the function from the examples/default_settings_example.ipynb file.

# Example usage of the function with default settings
sequence = generate_corr_sequence(debug=True)

Nakagami distribution with Bessel function ACF

The example below is from the examples/nakagami_example.ipynb file.

# Example usage of the function with Nakagami distribution and an autocorrelation function
from generate_corr_sequence import gen_corr_sequence
import numpy as np
from scipy.stats import nakagami
from scipy.special import j0
# %%
m = np.arange(0, 100)
signal = gen_corr_sequence(
    dist_obj=nakagami(nu=1),
    target_acf=np.array(j0(0.1 * np.pi * abs(m))),
    debug=True)

Notes

  1. There is no responsibility for the correctness of the results. It may work and it may not - use debug option to check the results.
  2. Examples for different distributions (uniform, exponential, Laplace, Rayleigh, triangle, gamma, lognormal, Nakagami) and four different ACFs are provided in the examples/evaluation/ folder. The evaluate_PDFs.ipynb file used for generation of all the ACF figures in the directory.
  3. It takes about 2-3 seconds to generate a single default-length sequence.
  4. The example of code repeatability is provided in the examples/nakagami_example.ipynb notebook as extension of Nakagami distribution example. The sequence is generated 20 times with ACFs as follows.

References

The algorithm is mainly based on the following papers:

  1. Filho, José Cândido Silveira Santos, and Michael Daoud Yacoub. "Coloring Non-Gaussian Sequences." IEEE Transactions on Signal Processing, vol. 56, no. 12, 2008, p. 6.
  2. Liu, Bede, et al. "Generation of a Random Sequence Having a Jointly Specified Marginal Distribution and Autocovariance." IEEE Transactions on Acoustics, Speech, and Signal Processing, vol. ASSP-30, no. 6, 1982, p. 11.

Contributors

Dima Bykhovsky, Netanel Tochilovsky, Alexander Rudyak

License

This project is licensed under the MIT license.

Todo

  • custom (non-scipy) distributions support
  • higher-speed algorithm for Gaussian distributions
  • fix lognormal distribution problem for oscillatory ACFs

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

generate_corr_sequence-0.1.1.tar.gz (10.0 kB view hashes)

Uploaded Source

Built Distribution

generate_corr_sequence-0.1.1-py3-none-any.whl (9.5 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page