Spaces:
Sleeping
Sleeping
| """ | |
| Модуль вычисления признака аномальной важности | |
| """ | |
| 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) |