feat: slider sensibilité + z-score standardization pour clustering plus précis
Sensibilité (0.5x–3.0x) : - Multiplie k : sensibilité=2x avec k=14 → 28 clusters effectifs - Labels UI : Grossière / Normale / Fine / Très fine / Maximum - Paramètres avancés (k, fenêtre) masqués dans un <details> - Cache invalidé si sensibilité change Z-score standardisation (Bishop 2006 PRML §9.1) : - Normalise par variance de chaque feature avant K-means - Features discriminantes (forte std) pèsent plus - Résultat : risque 0→1.00 sur clusters bots vs 0→0.27 avant - Bots détectés : 4 337 IPs vs 1 604 (2.7x plus) - Nouveaux clusters : Bot agressif, Tunnel réseau, UA-CH Mismatch distincts Fix TextLayer deck.gl : - Translittération des accents (é→e, à→a, ç→c…) + strip emojis - Évite les warnings 'Missing character' sur caractères non-ASCII Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@ -87,6 +87,23 @@ def build_feature_vector(row: dict) -> list[float]:
|
||||
return [norm(row.get(key, 0)) for key, _, norm in FEATURES]
|
||||
|
||||
|
||||
# ─── Standardisation z-score ──────────────────────────────────────────────────
|
||||
|
||||
def standardize(X: np.ndarray) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
|
||||
"""
|
||||
Z-score standardisation : chaque feature est centrée et mise à l'échelle
|
||||
par sa déviation standard.
|
||||
|
||||
Ref: Bishop (2006) PRML §9.1 — preprocessing recommandé pour K-means.
|
||||
|
||||
Retourne (X_std, mean, std) pour pouvoir projeter de nouveaux points.
|
||||
"""
|
||||
mean = X.mean(axis=0)
|
||||
std = X.std(axis=0)
|
||||
std[std < 1e-8] = 1.0 # évite la division par zéro pour features constantes
|
||||
return (X - mean) / std, mean, std
|
||||
|
||||
|
||||
# ─── K-means++ vectorisé (numpy) ─────────────────────────────────────────────
|
||||
|
||||
@dataclass
|
||||
|
||||
Reference in New Issue
Block a user