Привет, Хабр! Меня зовут Андрей Басов, я руководитель команды технической поддержки стрима корпоративных продуктов и сервисов в 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 и в реальном времени семантически отслеживать, кластеризовать, выводить, классифицировать логи наших систем. Наши инженеры с легкостью видят, какие логи и сколько раз повторялись, не тратят время на классификацию этих данных, видят аномалии, видят семантические именованные кластера, количества логов и прирост в каждом из них.

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