Source code for pysad.models.median_absolute_deviation

from pysad.core.base_model import BaseModel
from pysad.statistics.median_meter import MedianMeter


[docs]class MedianAbsoluteDeviation(BaseModel): """Median Absolute Deviation method :cite:`hochenbaum2017automatic`. Args: absolute (bool): Whether to output score's absolute value (Default=True). b (float): The default value `1.4826` is used for normally distributed data. See :cite:`hochenbaum2017automatic` for details. (Default=1.4826). """ def __init__(self, absolute=True, b=1.4826): self.b = b self.absolute = absolute self.median_meter = MedianMeter() self.mad_meter = MedianMeter()
[docs] def fit_partial(self, X, y=None): """Fits the model to next instance. Args: X (float): The instance to fit. Note that this model is univariate. y (int): Ignored since the model is unsupervised (Default=None). Returns: object: Returns the self. """ assert len(X) == 1 # Only for time series self.median_meter.update(X) self.mad_meter.update(X) return self
[docs] def score_partial(self, X): """Scores the anomalousness of the next instance. Args: X (float): The instance to score. Higher scores represent more anomalous instances whereas lower scores correspond to more normal instances. Note that this model is univariate. Returns: float: The anomalousness score of the input instance. """ median = self.median_meter.get() mad = self.b * self.mad_meter.get() score = (X - median) / (mad + 1e-10) return abs(score) if self.absolute else score