Source code for ruptures.datasets.pw_constant

"""
.. _sec-pw-constant:

Mean shift
====================================================================================================

Description
----------------------------------------------------------------------------------------------------

For a given number of samples :math:`T`, number of changepoints :math:`K` and noise variance :math:`\sigma^2`, this function generates change point indexes :math:`0<t_1<\dots<t_K<T` and a piecewise constant signal :math:`\{y_t\}_t` with additive Gaussian noise.


Usage
----------------------------------------------------------------------------------------------------

Start with the usual imports and create a signal.

.. code-block:: python

    import numpy as np
    import matplotlib.pylab as plt
    import ruptures as rpt
    # creation of data
    n, dim = 500, 3  # number of samples, dimension
    n_bkps, sigma = 3, 5  # number of change points, noise standart deviation
    signal, bkps = rpt.pw_constant(n, dim, n_bkps, noise_std=sigma)
    rpt.display(signal, bkps)

The mean shift amplitude is uniformly drawn from an interval that can be changed through the keyword ``'delta'``.

.. code-block:: python

    signal, bkps = rpt.pw_constant(n, dim, n_bkps, noise_std=sigma, delta=(1, 10))


Code explanation
----------------------------------------------------------------------------------------------------

.. autofunction:: ruptures.datasets.pw_constant.pw_constant

"""

import numpy as np
from numpy import random as rd

from ruptures.utils import draw_bkps


[docs]def pw_constant(n_samples=200, n_features=1, n_bkps=3, noise_std=None, delta=(1, 10)): """Return a piecewise constant signal and the associated changepoints. Args: n_samples (int): signal length n_features (int, optional): number of dimensions n_bkps (int, optional): number of changepoints noise_std (float, optional): noise std. If None, no noise is added delta (tuple, optional): (delta_min, delta_max) max and min jump values Returns: tuple: signal of shape (n_samples, n_features), list of breakpoints """ # breakpoints bkps = draw_bkps(n_samples, n_bkps) # we create the signal signal = np.empty((n_samples, n_features), dtype=float) tt_ = np.arange(n_samples) delta_min, delta_max = delta # mean value center = np.zeros(n_features) for ind in np.split(tt_, bkps): if ind.size > 0: # jump value jump = rd.uniform(delta_min, delta_max, size=n_features) spin = rd.choice([-1, 1], n_features) center += jump * spin signal[ind] = center if noise_std is not None: noise = rd.normal(size=signal.shape) * noise_std signal = signal + noise return signal, bkps