espa_model / anomaly.py
kanslor821's picture
Upload 10 files
0f34acb verified
"""
Модуль вычисления признака аномальной важности
"""
import numpy as np
def compute_anomaly(features_matrix: np.ndarray, L: int = 2, eps: float = 1e-6) -> np.ndarray:
"""
Вычисление аномальной важности A(S_i) на основе отклонения от локального контекста.
Args:
features_matrix: матрица признаков N x 4
L: радиус локальной окрестности
eps: малая константа для избежания деления на ноль
Returns:
массив аномалий A(S_i) в диапазоне [0, 1)
"""
N = features_matrix.shape[0]
anomalies = []
for i in range(N):
neighbor_indices = []
for k in range(max(0, i - L), min(N, i + L + 1)):
if k != i:
neighbor_indices.append(k)
if len(neighbor_indices) < 2:
anomalies.append(0.0)
continue
a_j = []
for j in range(4):
values = features_matrix[neighbor_indices, j]
median_val = np.median(values)
mad = np.median(np.abs(values - median_val))
if mad < eps:
a_j.append(0.0)
else:
dev = abs(features_matrix[i, j] - median_val)
a_j.append(dev / (mad + eps))
raw_anomaly = np.mean(a_j)
compressed = np.tanh(raw_anomaly / 3.0)
anomalies.append(compressed)
return np.array(anomalies)