Информация
- В рейтинге
- 458-й
- Откуда
- Нижний Новгород, Нижегородская обл., Россия
- Дата рождения
- Зарегистрирован
- Активность
Специализация
Фулстек разработчик, Системный инженер
C#
Алгоритмы и структуры данных
Python
Bash
CI/CD
Базы данных
Powershell
Техническая поддержка
SRE
Мониторинг
Мы намеренно не приходим к такому предположению — и не делаем этого.
Мы не утверждаем, что распределение косинусных расстояний нормальное.
Наоборот — в реальных данных оно редко бывает нормальным: оно смещённое, с тяжёлыми хвостами, особенно при дрейфе кластера.
Однако мы максимально нормализуем данные/логи — убираем GUID, timestamp, IP, шаблонизируем stack trace итд — чтобы сжать семантическое пространство и снизить шум.
И принимаем что данные в виде логов априори не могут иметь множество вариантов.
Это помогает сделать кластеры плотными, а расстояния — близкими к нулю.
Но это не превращает распределение в нормальное — и мы это понимаем.
Мы не строим доверительные интервалы в статистическом смысле.
Поэтому используем
μиσ— не как параметры модели, а ближе к эмпирическим агрегатам, удобным для нас в расчёте границ:μ— среднее расстояние до центроида,σ— мера разброса,r = μ + k·σ— интерпретируемая эвристика, а не статистический порог.Это как Z-оценка. Не требует нормальности, но работает как фильтр.
Вы правы — спасибо большое, действительно, формулы не хватало. Добавил.
Мы используем её не как доказательство нормальности, а как удобную параметризацию:
отображение доли “дальних” точек в масштабный коэффициент k.
Это позволяет интуитивно интерпретировать k, даже если распределение не нормальное.
Вы правы: использование median + 2·σ — неконсистентно.
Median устойчива к выбросам, а σ — нет.
В версии статьи для упрощения мы действительно использовали эту эвристику, чтобы не вводить MAD и упростить понимание.
На практике:
median используется только для оценки доли “дальних” точек (P_tail),
Основная граница кластера r = μ + k·σ строится на mean и std — она не зависит от median.
Робастность важна, но в статье мы жертвовали ею ради простоты изложения — чтобы не перегружать читателя.
Спасибо — добавим пояснение.
Кстати, стоит уточнить, как устроена наша система:
В малых кластерах (< 10k точек) — используется MST со сглаживанием как основной метод оценки плотности.
Граница MST строится как с использованием дополнительно k_mst — адаптивный коэффициент, обновляемый на каждом ребилде.
Он не пересчитывается с нуля, а обновляется через байесовское сглаживание:
старое k_mst используется как prior, новое — оценивается по верхним квантилям рёбер MST, итоговое k_mst — взвешенное среднее. Это делает границу стабильной и не чувствительной к шуму.
В крупных кластерах (> 30k) или при медленном ребилде (всегда замеряется время пересбора для каждого кластера) — MST отключается (из-за O(n²)),
→ переходим на μ + k·σ,
→ вызываем estimate_threshold,
→ считаем MAD для робастной оценки P_tail,
→ уточняем k относительно накопленной истории агрегатов.
→ адаптируем k через экспоненциальное сглаживание.
То есть:
MAD — не замена MST,
а лёгкая компенсация за потерю топологической точности,
с сохранением робастности и стабильности адаптации.
Да, подход вдохновлён байесовским обновлением — «старое убеждение + новое наблюдение»,
но формально это экспоненциальное сглаживание, а не полноценный байесовский вывод.
При малом n мы не можем надёжно оценить хвост — поэтому используем prior_p_tail = 0.02 как априорное убеждение,
которое будет обновляться по мере поступления данных в кластер и его пересборкой.
Эта статья — первая часть серии.
Цель — показать базовую математику, идею “кластер как агент”, а не все детали production-логики.
Мы не могли в одну статью включить всё: MST, k_corr, MAD, динамику центроидов, все агрегаты, различные LLM-интеграции и все применяемые алгоритмы.
Обещаем — в следующих частях расскажем подробнее.
Спасибо большое за ваш комментарий — он помог нам лучше отразить некоторые моменты и сделать материал понятнее.