Skip to content

Gaussian process change (CostNormal)#

Bases: BaseCost

Gaussian process change.

Source code in ruptures/costs/costnormal.py
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
class CostNormal(BaseCost):
    """Gaussian process change."""

    model = "normal"

    def __init__(self, add_small_diag=True):
        """Initialize the object.

        Args:
            add_small_diag (bool, optional): For signals with truly constant
                segments, the covariance matrix is badly conditioned, so we add
                a small diagonal matrix. Defaults to True.
        """
        self.signal = None
        self.min_size = 2
        self.add_small_diag = add_small_diag
        if add_small_diag:
            warnings.warn(
                "New behaviour in v1.1.5: "
                "a small bias is added to the covariance matrix to cope with truly "
                "constant segments (see PR#198).",
                UserWarning,
            )

    def fit(self, signal) -> "CostNormal":
        """Set parameters of the instance.

        Args:
            signal (array): signal of shape (n_samples,) or
                (n_samples, n_features)

        Returns:
            self
        """
        if signal.ndim == 1:
            self.signal = signal.reshape(-1, 1)
        else:
            self.signal = signal
        self.n_samples, self.n_dims = self.signal.shape
        return self

    def error(self, start, end) -> float:
        """Return the approximation cost on the segment [start:end].

        Args:
            start (int): start of the segment
            end (int): end of the segment

        Returns:
            segment cost

        Raises:
            NotEnoughPoints: when the segment is too short (less than `min_size`
                samples).
        """
        if end - start < self.min_size:
            raise NotEnoughPoints
        sub = self.signal[start:end]

        if self.signal.shape[1] > 1:
            cov = np.cov(sub.T)
        else:
            cov = np.array([[sub.var()]])
        if self.add_small_diag:  # adding small bias
            cov += 1e-6 * np.eye(self.n_dims)
        _, val = slogdet(cov)
        return val * (end - start)

__init__(add_small_diag=True) #

Initialize the object.

Parameters:

Name Type Description Default
add_small_diag bool

For signals with truly constant segments, the covariance matrix is badly conditioned, so we add a small diagonal matrix. Defaults to True.

True
Source code in ruptures/costs/costnormal.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def __init__(self, add_small_diag=True):
    """Initialize the object.

    Args:
        add_small_diag (bool, optional): For signals with truly constant
            segments, the covariance matrix is badly conditioned, so we add
            a small diagonal matrix. Defaults to True.
    """
    self.signal = None
    self.min_size = 2
    self.add_small_diag = add_small_diag
    if add_small_diag:
        warnings.warn(
            "New behaviour in v1.1.5: "
            "a small bias is added to the covariance matrix to cope with truly "
            "constant segments (see PR#198).",
            UserWarning,
        )

error(start, end) #

Return the approximation cost on the segment [start:end].

Parameters:

Name Type Description Default
start int

start of the segment

required
end int

end of the segment

required

Returns:

Type Description
float

segment cost

Raises:

Type Description
NotEnoughPoints

when the segment is too short (less than min_size samples).

Source code in ruptures/costs/costnormal.py
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
def error(self, start, end) -> float:
    """Return the approximation cost on the segment [start:end].

    Args:
        start (int): start of the segment
        end (int): end of the segment

    Returns:
        segment cost

    Raises:
        NotEnoughPoints: when the segment is too short (less than `min_size`
            samples).
    """
    if end - start < self.min_size:
        raise NotEnoughPoints
    sub = self.signal[start:end]

    if self.signal.shape[1] > 1:
        cov = np.cov(sub.T)
    else:
        cov = np.array([[sub.var()]])
    if self.add_small_diag:  # adding small bias
        cov += 1e-6 * np.eye(self.n_dims)
    _, val = slogdet(cov)
    return val * (end - start)

fit(signal) #

Set parameters of the instance.

Parameters:

Name Type Description Default
signal array

signal of shape (n_samples,) or (n_samples, n_features)

required

Returns:

Type Description
CostNormal

self

Source code in ruptures/costs/costnormal.py
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
def fit(self, signal) -> "CostNormal":
    """Set parameters of the instance.

    Args:
        signal (array): signal of shape (n_samples,) or
            (n_samples, n_features)

    Returns:
        self
    """
    if signal.ndim == 1:
        self.signal = signal.reshape(-1, 1)
    else:
        self.signal = signal
    self.n_samples, self.n_dims = self.signal.shape
    return self