惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Cloudflare Blog
博客园 - 【当耐特】
博客园 - 叶小钗
量子位
博客园 - 聂微东
S
SegmentFault 最新的问题
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
宝玉的分享
宝玉的分享
小众软件
小众软件
罗磊的独立博客
有赞技术团队
有赞技术团队
Stack Overflow Blog
Stack Overflow Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания
Математика кластеров: разбираемся в умной кластеризации д...
clapton (МТС · 2026-05-22 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение14 мин

Охват и читатели7

Привет, Хабр! Меня зовут Андрей Басов, я руководитель команды технической поддержки стрима корпоративных продуктов и сервисов в MWS, занимаюсь технической поддержкой и сопровождением продуктов линейки Partner Experience Platform.

В прошлом материале я рассказал о том, как мы с коллегами попробовали искать аномалии в логах наших систем с помощью методов машинного обучения. Сейчас мы провели работу над ошибками, все переработали (архитектуру, математический аппарат), внедрили генеративную LLM и Principal Component Analysis — и в итоге создали новую систему анализа жизни продуктов, которая самостоятельно балансирует, обучается, выявляет аномалии, паттерны и даже заглядывает в будущее.

Но не только сама разработка этой «живой» системы стала для меня в проекте вызовом. Мы столкнулись с тем, что некоторые коллеги из разных подразделений не всегда понимают, чем конкретно мы занимаемся и как это все работает. Не всегда разделяют границы ИИ между машинным обучением и генеративным интеллектом.

Поэтому я открываю серию материалов о том, как математика способна превратить пассивную кластеризацию в активную и самосознающую систему: от основ байесовской адаптации, динамических границ и топологического анализа до внедрения в практику. Разбираться будем на примере нашей новой архитектуры.

Наша архитектура

Какой архитектурный концепт для проверки концепции мы применяли ранее и как мы разработали систему автоматического выявления аномалий в логах, я подробно рассказал в посте. Теперь покажу, какая архитектура у нас сейчас.

Наша новая архитектура — это микросервисная система, построенная по принципу event-driven и incremental processing. Она состоит из нескольких независимых, но благодаря cluster-manager все же единых и согласованных компонентов:

  • ml‑log‑anomaly‑cluster‑manager‑detector — основной микросервис, отвечающий за прием новых логов, их векторизацию, кластеризацию и обновление состояния кластеров;

  • ml‑log‑anomaly‑cluster‑manager‑retrain — фоновый сервис, который периодически перестраивает кластеры, выявляет новые паттерны и оптимизирует структуру;

  • ml‑log‑anomaly‑cluster‑manager‑cleaner — отвечает за архивацию и удаление устаревших данных;

  • ml‑log‑anomaly‑cluster‑manager‑exporter — экспортирует результаты в системы мониторинга (Grafana, OpenSearch) и уведомления.

Все сервисы работают независимо, но обмениваются состоянием через общие хранилища данных — Qdrant и PostgreSQL

Роли хранилищ данных

Мы используем два хранилища — Qdrant и PostgreSQL. И каждое — для своих целей.

Qdrant выполняет две ключевые роли:

  • Хранилище векторов логов — в нем каждый нормированный лог представлен как 768-мерный эмбеддинг (BGEM3), сохраненный как вектор с payload (ID, message, дата, cluster_id).

  • Хранилище метаданных кластеров — в нем каждый кластер представлен как отдельная точка в Qdrant, с вектором-центроидом и payload, содержащим всю его внутреннюю статистику:

    • центроид, суммарный вектор, количество точек;

    • границы (статические и адаптивные);

    • скорость и ускорение центра тяжести;

    • параметры байесовской адаптации;

    • MST-метрики;

    • флаги аномальности;

    • ветвление кластера;

    • прочая статистика.

Кластеры находятся в отдельной коллекции clusters, что позволяет быстро искать ближайший для нового вектора через векторный поиск.

PostgreSQL — это управляющая база данных. Она содержит:

  • конфигурацию задач;

  • состояние процессов;

  • историчность данных и статистику.

Это позволяет:

  • контролировать жизненный цикл кластеров;

  • строить прогнозы на основе временных рядов;

  • выявлять глобальные события (например, массовый дрейф кластеров);

  • собирать и агрегировать статистику для obs.

Поток данных от лога до кластера будет выглядеть так:

  • Источник — OpenSearch, из которого по расписанию забираются логи за последний интервал.

  • Предобработка — нормализация: удаление персональных данных, обработка stack trace, выделение контекста.

  • Дедупликация — по хешу нормализованного сообщения.

  • Векторизация — через LLM (BGEM3), получение 768-мерного эмбеддинга или результирующая групп эмбеддингов в случае stack trace.

  • Кеширование в памяти.

  • Понижение размерности — адаптивный PCA (если размерность > 128), сохраненная в S3 и кешированная локально.

  • Кластеризация — поиск ближайшего кластера по косинусному расстоянию.

  • Принадлежность — если расстояние до центроида ≤ адаптивной границы — точка добавляется в кластер, при этом идет инкрементальная легкая коррекция его границ и статистики.

  • Аномалии — если не подошел ни один кластер, точка помечается как аномалия и временно хранится для последующей кластеризации в ночное время.

  • Ночной ребилд и построение с созданием новых кластеров из текущих аномалий в зависимости от стратегий отслеживания конкретных сервисов.

На текущем этапе мы сосредоточились использовать HDBSCAN только для построения новых кластеров из аномальных точек. Это происходит в сервисе retrain в ночное время:

  • Собираются все точки с cluster_id = −1.

  • Применяется PCA по обученной модели.

  • Запускается HDBSCAN с заданными параметрами.

  • Создается новый кластер, из которого равномерно по квантилям выносятся информация и исходя из контекста формируется имя кластера. Так же анализируются уже созданные кластеры, перемапливаются по связке master_cluster и сохраняются в Qdrant.

Почему мы оставили HDBSCAN на небольшом участке системы? Он устойчив к шуму и хорошо работает на начальных данных.
В итоге мы построили собственную кластеризацию на основе динамических границ, MST и байесовской логики, с детекцией аномальных событий, происходящих внутри кластеров.

Математика как часть архитектуры

В отличие от классических ML-систем, где математика «прячется» внутри модели, у нас математика — это архитектура. Она позволяет не только кластеризовать и классифицировать данные, но и поддерживать и отслеживать состояние этих кластеров данных в реальном времени, а также выстраивать прогнозы по их статистике, выявлять аномалии, автоматически мерджить и разделять кластера в случаи их деградации.

Вот основные понятия, благодаря которым работает наша система:

  • Косинусное расстояние — основа для сравнения смысла логов.

  • Инкрементальные агрегаты — позволяют обновлять центроид и дисперсию за O(1).

  • Байесовская адаптация — динамически корректирует пороги на основе новых данных.

  • MST — оценивает плотность и выявляет «мостики» между фрагментами.

  • Скорость и ускорение центроида — превращают статистику в сигнал тревоги.

  • Реализованы алгоритмы определения потребности разделения и объединения кластеров, а также алгоритмы определения потребности пересборки кластера.

Все это не отдельные алгоритмы, а методы, встроенные в объектную модель кластера. Каждый кластер — это самонастраивающийся агент с внутренним состоянием, статистикой, именем и поведением.

Чтобы понять, как работает эта базовая часть архитектуры «под капотом», предлагаю последовательно разобраться в следующем:

  • Динамические границы кластера — как мы определяем принадлежность точки и почему граница зависит от статистики и байесовской логики.

  • Байесовская адаптация порогов — как система учитывает новую информацию, не теряя стабильности.

  • Скорость и ускорение центроида — как превратить движение вектора в метрику аномальности.

  • MST как оценка плотности — как мы используем графовую структуру для анализа внутренней связности кластера.

  • Инкрементальные агрегаты — как обновлять статистику без хранения всех точек.

  • Интеграция с LLM — как мы используем генеративный ИИ для сравнения кластеров, генерации имен, ветвления master-кластеров.

  • Система самодиагностики — как из истории кластеров строится прогноз поведения всей системы.

Как кластер «чувствует себя»

Представим ситуацию, что нам необходимо найти аномальные события в логах. Мы строим систему на основе эмбеддингов, где каждый лог — вектор в n-мерном пространстве. Затем применяем кластеризацию. Сначала все работает, но на следующий день:

  • в данных появляется новая ошибка: SSL handshake failed;

  • старый кластер, отвечающий за «подключения к БД», вдруг стал включать disk full;

  • граница кластера больше не работает;

  • наш алгоритмы не информируют нас об этом.

В этот момент мы еще не умеем определять и находить аномалии в самих кластерах, отслеживать изменения кластеров. Программа просто работает, даже если не выполняет корректно возложенные на на нее обязанности.

А что, если кластер мог бы:

  • предупредить, что его структура нарушается;

  • сам адаптироваться к изменениям;

  • сообщить нам, что он «дрейфует» в многомерном пространстве;

  • попросить пересобрать себя;

  • предсказывать свое поведение в будущем.

Самодостаточная система кластеризации работает благодаря базовым математическим механизмам, которые заставляют кластеры откликаться на внешний раздражитель.

При этом очень важным является определение схожести объектов: во многом все в итоге упирается в то, как мы измеряем длину вектора и расстояние между точками. Так что дальше вас ждет небольшой и быстрый курс линейной алгебры. В нашем случае это действительно важно. Для большего понимания ниже мы вспомним основы линейной алгебры и немного погрузимся в математику ml.

Вектор

Математика машинного обучения начинается с понятия вектора. Вектор — это не просто список чисел. Это точка в многомерном пространстве.  
Представьте, что есть карта, на которой отмечены города. Каждый город — точка.  
Теперь представьте, что у каждого слова или предложения есть своя «точка» в пространстве.
Вектор записывается как

\mathbf{x} = (x_1, x_2, \ldots, x_d), \quad \text{где } d \text{ — размерность.}

Например, в эмбеддингах d = 768, то есть каждое слово — точка в 768-мерном пространстве. Такое пространство называется R^d — вещественное d-мерное пространство.

В этом пространстве можно выполнять следующие операции:


Сложение векторов: если у вас есть два вектора a и b, вы можете сложить их по координатам:  

a+ b= (a_1+ b_1,a_2+ b_2,…,a_d+ b_d )

Это как если сложить два смещения: сначала пройти три шага вперед, потом два влево — в итоге переместиться на вектор (3, –2).  

Умножение на число (скаляр):  

\alpha \mathbf{A} = (\alpha A_1, \alpha A_2, \ldots, \alpha A_d)

  • Если , вектор становится в два раза длиннее.

  • Если , он разворачивается в противоположную сторону.

Эти линейные операция, лежащая в основе всех преобразований в машинном обучении.

Скалярное произведение двух векторов — это число, которое показывает, насколько два вектора похожи по направлению:  

\mathbf{a} \cdot \mathbf{b} = a_1 b_1 + a_2 b_2 + \ldots + a_d b_d = \sum_{i=0}^{d} a_i b_i

  • Если векторы смотрят в одну сторону — положительное.

  • Если в разные — отрицательное.

  • Если перпендикулярны — ноль.

Скалярное произведение ввел в XIX веке Герман Грассман как часть своей теории внешних произведений. Позже Джозайя Уиллард Гиббс формализовал его в современном виде.

Норма — это понятие длины. Когда мы говорим о норме вектора, мы имеем в виду способы измерить размер или величину объекта.

Понятие нормы пришло из геометрии Евклида, но строго формализовано было только в XX веке в рамках функционального анализа.

В линейной алгебре нормой называют функцию, которая измеряет размер объекта (матрицы или вектора). Как мы говорили ранее, основной компонентой кластеризации является расчет расстояний между векторами и, следовательно, от выбора нормы зависит, как мы интерпретируем расстояние и угол между объектами. Это критически важно, например, в метрических алгоритмах.

Тут загляну вперед и поясню, что методов расчета норм множество и выбор норм зависит от конкретной задачи.

Начнем с евклидовой нормы поскольку она наиболее интуитивно понятная, соответствует «обычному» расстоянию по Пифагору. Иначе в ML она обозначается как l₂

Все мы, наверное, из школы помним такую фразу, что квадрат гипотенузы в прямоугольном треугольнике равен сумме квадратов катетов.

c^2 = a^2 + b^2

В изначальном варианте евклидово пространство и вытекающее из него евклидово расстояние — это пространство, свойства которого описываются аксиомами евклидовой геометрии. В этом случае предполагается, что пространство имеет размерность 3, то есть является трехмерным.

Из скалярного произведения выводится норма вектора — это его длина:  

\| \mathbf{x} \| = \sqrt{\mathbf{x} \cdot \mathbf{x}} = \sqrt{x_1^2 + x_2^2 + \cdots + x_d^2} = \sqrt{\sum_{i=1}^{d} x_i^2}

Это и есть евклидова норма.

Представь прямоугольный треугольник: катеты x₁, x₂, гипотенуза — это и есть ‖x‖.

Пример:[1] 

\mathbf{A} = (6, -5), \quad \| \mathbf{A} \| = \sqrt{6^2 + (-5)^2} = \sqrt{61}

В многомерном пространстве — все остается то же самое, только появляется больше измерений.

Норма помогает вычислить расстояние между двумя точками:  

  • евклидово расстояние — длина прямой между точками.

d_{\text{euclid}}(a, b) = \| \mathbf{a} - \mathbf{b} \| = \sqrt{(a_1 - b_1)^2 + (a_2 - b_2)^2 + \cdots + (a_d - b_d)^2}

Евклидово расстояние обычно используется в l₂ — регуляризации, известная как Ridge-регрессия. Путем добавления штрафного члена к функции потерь, приводя ее коэффициенты к равномерному распределению. Такая регуляризация помогает улучшать способность модели к обобщению.

В NLP евклидово расстояние нам не всегда подходит, потому что вводит для нас зависимость от длины вектора.  

Сравните два предложения: одно короткое, другое длинное, но оба они отражают одну суть вещей и описывают одно и тоже действие. Их векторы будут разной длины, но смысл — одинаковый.

Если применять семантическую векторизацию, норма больше при большей смысловой нагрузки объекта. Поэтому для сравнения векторов чаще используется косинусная мера угла.

Чтобы убрать влияние длины, нужно нормализовать вектор — то есть поделить его на его же длину:  

\hat{\mathbf{x}} = \frac{\mathbf{x}}{\| \mathbf{x} \|}

Только после этого ‖x̂‖ = 1 — он стал единичной длины, то есть нормализован.

Все такие векторы лежат на поверхности сферы, называемой гиперсферой (поверхности нашей d-мерного сферы). Теперь расстояние между векторами зависит только от угла между ними.

Косинус угла как мера расчета расстояния между двумя векторами была предложена в 1960-х годах в информационном поиске для сравнения документов и на текущий момент все еще является основой для семантического поиска.

Если векторы нормализованы, это просто cos(a,b) = (a∙b)/(‖a‖‖b‖).

  • Чем ближе к 1 — тем похожее направление.

  • Чем ближе к 0 — тем ортогональнее.

  • Чем ближе к –1 — тем противоположнее.

Косинусное расстояние — это 1 минус косинус:  

d_{\cos}(a, b) = 1 - \cos(a, b)

Теперь:

  • 0 — идентичны;

  • 2 — противоположны;

Как мы помним, максимальное значение косинуса от –1 до 1. Учитывая это в формуле, мы понимаем, что максимальное косинусное расстояние будет иметь пределы от 0 до 2.

И если вектора сонаправлены, то есть идентичны, косинусное расстояние примет значение 0.

Это и есть мера, которую в ml используют для сравнения наших семантический точек, полученных путем векторизации текста.

Кластеризация

Кластеризация — это группировка похожих точек. Целью кластеризации является выделение близких по параметрам объектов и объединение их в кластеры.

Какие же методы мы используем для построения «умных самоадаптирующихся кластеров» ?

Основные методы:

1.Метод ближайших соседей (kNN) — если точка окружена точками одного класса, она, скорее всего, того же класса.  Алгоритм введен в 1950-х годах. Берем точку и ищем ее ближайших соседей. Определяем, к какому кластеру она относится путем определения к какому кластеру относится ближайший из ее соседей. Этот метод хоть часто и используется, но не является универсальным методом чисто кластеризации. Так же часто применяется в классификации и регрессии.

Стоит отметить, что в кластеризации он чувствителен к шуму. Формально кластера им не строятся, а определяются ближайшие соседи и их параметры.

K-Means — один из самых известных методов. Он итерационный — на первой стадии наносятся случайным образом сформированный центры кластеров и определяются точки, которые к ним относятся. Алгоритм останавливается только тогда, когда центры кластеров прекращают дрейфовать.

Алгоритм сходится, но не гарантирует глобального минимума. Он разбивает точки на k кластеров, минимизируя сумму квадратов расстояний до центров:  

\min \sum_{i=1}^{k} \sum_{x \in c_i} \| \mathbf{x} - \mathbf{c}_i \|^2\mathbf{c} = \frac{1}{n} \sum_{i=1}^{n} \mathbf{x}_i

Где:

  • cᵢ — центроид i-го кластера. Центроид — это среднее всех точек кластера.

Алгоритм простой, нужно:  

  1. Выбрать k начальных центров.

  2. Отнести каждую точку к ближайшему центру.  

  3. Пересчитать центры как средние.

  4. Повторять, пока центры не перестанут двигаться. 

У K-Means есть недостатки:  

  • Нужно заранее знать параметр k.  

  • Предполагает шарообразные кластеры. В реальности кластеры чаще всего были бы вытянутыми, изогнутыми, разорванными. 

  • Не работает с шумом и аномалиями.


2.DBSCAN — плотностной алгоритм пространственной кластеризации с присутствием шума основан на определении плотности точек с их объединением в кластера. DBSCAN разработан в 1996 году Мартином Эстером и другими.  

Один из первых методов, устойчивых к шуму.

Если вокруг точки много других точек — значит, она принадлежит кластеру. А если нет других точек, то это, скорее всего, шум. 

3.HDBSCAN — улучшенная версия DBSCAN, разработан в 2015 году. Он не требует задаваться радиусом окрестности вокруг точек, алгоритм строит иерархию кластеров и выбирает оптимальный срез. Использует взаимную достижимость и позволяет находить кластеры разной плотности.

4.Минимальное остовное дерево или Minimum Spanning Tree (MST) — это дерево, соединяющее все точки с минимальной суммой длин ребер.

Строится как алгоритмом Крускала (и относится к жадным: решение о следующем шаге принимается на основании наилучшего локального решения из всех возможных вариантов без учета всей структуры графа):  

  1. Сортируем ребра по длине.

  2. Добавляем по одному, если не образуется цикл.

  3. Повторяем, пока не соединим все точки.

Крускал изначально помещает каждую вершину в свое дерево, а затем постепенно объединяет на каждой итерации два некоторых дерева некоторым ребром.

Историческая справка

Сам подход MST впервые описан Борувкой еще в 1926 году для построения электросети. Позже Крускал и Прим представлял собою граф как лес поддеревьев MST: на первом этапе каждая вершина принадлежит отдельному дереву, далее каждое дерево выбирает минимальное ребро, соединяющее текущее дерево с другим. Если минимальных ребер несколько, выбирается ребро с наименьшим порядковым номером.

MST используется в HDBSCAN для анализа плотности.

Иерархическая кластеризация — строит дерево вложенных кластеров. Агломеративная — снизу вверх: начинаем с отдельных точек, объединяем ближайшие.

Расстояние между кластерами можно считать по-разному:  

  • Минимум — ближайшие точки (одиночная связь). 

  • Максимум — самые далекие (полная связь). 

  • Среднее — среднее всех пар.

  • Центроид — между центрами.

Основные параметры нашего кластера:

Центроид кластера — это среднее или сумма всех векторов нашего кластера или иначе это его «центр тяжести»:

\mathbf{c} = \frac{1}{n} \sum_{i=1}^{n} \mathbf{x}_i

А теперь представьте себе, что в кластере по мере его развития может формироваться миллионы векторов. Но если хранить все векторы — память быстро станет O(n).

Чтобы не хранить все векторы, логично необходимо использовать агрегаты:  

  • s = ∑xᵢ — суммарный вектор.

  • n — количество точек. 

Тогда:

\mathbf{c} = \frac{\mathbf{s}}{n}

И при добавлении новой точки/вектора в кластер x:

\mathbf{s} \leftarrow \mathbf{s} + \mathbf{x}, \quad n \leftarrow n + 1

Итого сложность инкрементального вычисление этого агрегата всего O(1). То есть все операции допустимо делать в режиме реального времени.

Сумма квадратов норм:

\| \mathbf{x} \|^2 = \sum \| \mathbf{x}_i \|^2

Используется для дисперсии.

Среднее расстояние до центроида (средняя длина):

d_{\cos}(a, c) = 1 - \cos(a, c)S_d = \sum d_iS_{d^2} = \sum d_i^2\mu = \frac{S_d}{n}

Где:

  • dᵢ — косинусное расстояние до центроида;

  • S_(d²) — сумма квадратов косинусного расстояния;

  • μ — среднее расстояние до центроида.

Дисперсия отклонения — мера разброса, понятие введено Карлом Фридрихом Гауссом и Пьером-Симоном Лапласом в XVIII–XIX веках:

\sigma_{\text{disp}} = \frac{S_{d^2}}{n} - \mu^2

 Дисперсия — это средний квадрат отклонения от среднего. Чем больше дисперсия, тем сильнее точки разбросаны.  

Дисперсия всегда неотрицательна. Для выборки иногда делится на n-1, но в нашей задаче — на n, так как мы оцениваем распределение кластера.

Стандартное отклонение (среднеквадратичное отклонение):

\sigma = \sqrt{\frac{S_{d^2}}{n} - \mu^2}

 Оно имеет ту же размерность, что и исходные данные, показывает «среднее отклонение» от центра. В нормальном распределении 68% данных лежат в пределах μ ± σ, и 95% μ ± 2σ.

Граница кластера: чтобы понять, принадлежит ли новая точка/вектор к какому бы то ни было кластеру, нужно знать их границы.

Для этого нам поможет статистика:

  • μ  — среднее расстояние до центроида кластера (средняя длина);

  • σ  — стандартное отклонение (среднеквадратичное отклонение).

Зная эти величины, мы очень просто высчитаем границу кластера как:

r = \mu + k \cdot \sigma

Если расстояние до центроида > r — точка не принадлежит.

Сразу напомню, что в данном случае мы считаем, что каждый кластер является как бы сферой, а точки за ней — аномалии.

k — коэффициент. В нормальной модели k = 2 соответствует 95% доверительному интервалу,
k = 3 – 99,7%. Но в реальных данных распределение может отличаться, поэтому k адаптируется.

Байесовская адаптация k  

Историческая справка:

Скрытый текст

Метод байесовской адаптации основан на теореме Байеса, разработанной Томасом Байесом в XVIII веке в 1763 году. Теорема Байеса (или формула Байеса) — одна из основных теорем элементарной теории вероятностей. Позволяет определить вероятность события при условии, что произошло другое статистически взаимозависимое с ним событие.

Общее утверждение теоремы Байеса: «Условная вероятность события A при наступлении другого события B равна произведению вероятности B при A и вероятности A, разделенному на вероятность события B».

Главным выводом из теоремы является то, что новые данные не формируют убеждение с нуля, а уточняют те, которые уже имеются. Для нас это ключевой момент, так как теорема позволяет обновлять вероятности на основе новых данных.  

Оценка хвоста (k) в статистике — это процесс оценки параметров хвоста распределения, а апостериорная вероятность — это обновленная оценка вероятности гипотезы после учета новых данных.

Иначе k— это квантиль нормального распределения, соответствующая вероятности выброса.

Где:

  • P_tail — доля «дальних» точек;

  • φ⁻¹ — обратная функция нормального распределения.

Алгоритм работает так:

  • Найдём точки, которые лежат за median + 2σ

  • Зададимся P_tail = (кол-во точек) / n

  • Если n < 30 — используем априор P_tail = 0.02

  • k_old = k, k_new = φ⁻¹(1 − P_tail)

  • Сглаживаем: k = 0.8·k_old + 0.2·k_new

Теперь у нас не будет больше скачков, а также мы гарантируем, что граница будет автоматически рассчитывать стабильно как для малых, так и для больших кластеров.

Байесовская оценка kне единственная оценка, которой можно придерживаться. Это лишь экспоненциальное сглаживание.  

Хвост распределения — его крайняя часть, где редкие значения. В реальных данных хвосты часто «тяжелее», чем у нормального распределения. Например, в финансовых данных или в интернет-трафике.  

Квантиль — значение, ниже которого лежит заданная доля данных. Например, 95-й перцентиль — значение, ниже которого 95% точек. Квантили используются в статистике, начиная с работ Фишера и Пирсона в начале XX века.

MST в кластере 

Средняя длина ребер по аналогии:

\mu_{\text{mst}} = \frac{1}{m} \sum e_i

Стандартное отклонение (среднеквадратичное отклонение):

\sigma_{\text{mst}} = \sqrt{\frac{1}{m} \sum (e_i - \mu_{\text{mst}})^2}

Граница:

r_{\text{mst}} = \mu_{\text{mst}} + k \cdot \sigma_{\text{mst}}

MST помогает оценить плотность связности внутри кластера. Длинные ребра — это «мостики» между плотными областями. Если ребра длинные — кластер разряженный, если ребра короткие — кластер плотный. Используется как дополнительная метрика границы 

Динамика центроида

Центр кластера — вектор cₜ .

Определим скорость центроида:

v_t = c_t - c_{t-1}

Ускорение:

a_t = v_t - v_{t-1}, \quad u_t = \| a_t \|

Если скорость резко выросла — кластер встряхнуло.

Аномальный скоринг

Теперь мы можем в режиме реального времени высчитывать средние:

  • μₛ, σₛ — среднюю длину и среднеквадратичное отклонение по скорости;

  • μᵤ, σᵤ — среднюю длину и среднеквадратичное отклонение по ускорению.

Скоринг:

\text{score} = \left( \frac{s - \mu_s}{\sigma_s}, \frac{u - \mu_u}{\sigma_u} \right)

Получаем, что, например, если score > 2 — кластер взволнован.  

На этом все. В этом материале мы познакомились с ключевыми понятиями и методами необходимыми для задач кластеризации в машинном обучении. А также поняли, что необходимо кластеру, чтобы самостоятельно развиваться и отслеживать свою деградацию. Это основа для понимания того, как происходит кластеризация и базис того, как будет строится система основанная на этих механизмах.

Что мы получили

Теперь мы умеем строить оперативные дашборды в Grafana и в реальном времени семантически отслеживать, кластеризовать, выводить, классифицировать логи наших систем. Наши инженеры с легкостью видят, какие логи и сколько раз повторялись, не тратят время на классификацию этих данных, видят аномалии, видят семантические именованные кластера, количества логов и прирост в каждом из них.

А в следующих сериях я расскажу и покажу, как мы строим прогнозы аномальных событий на основе метрик аномалий поведения систем. Так что не переключайтесь.