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

推荐订阅源

P
Privacy & Cybersecurity Law Blog
Engineering at Meta
Engineering at Meta
Forbes - Security
Forbes - Security
MongoDB | Blog
MongoDB | Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
A
About on SuperTechFans
量子位
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
雷峰网
雷峰网
腾讯CDC
P
Proofpoint News Feed
S
Schneier on Security
S
Secure Thoughts
V
Visual Studio Blog
Help Net Security
Help Net Security
The Hacker News
The Hacker News
C
Cyber Attacks, Cyber Crime and Cyber Security
P
Privacy International News Feed
SecWiki News
SecWiki News
S
SegmentFault 最新的问题
T
Threatpost
小众软件
小众软件
MyScale Blog
MyScale Blog
F
Fortinet All Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Proofpoint News Feed
T
Tailwind CSS Blog
I
Intezer
C
CERT Recently Published Vulnerability Notes
U
Unit 42
V
V2EX
Cyberwarzone
Cyberwarzone
Recorded Future
Recorded Future
O
OpenAI News
Project Zero
Project Zero
有赞技术团队
有赞技术团队
Google DeepMind News
Google DeepMind News
Last Week in AI
Last Week in AI
Hugging Face - Blog
Hugging Face - Blog
Know Your Adversary
Know Your Adversary
C
Cybersecurity and Infrastructure Security Agency CISA
Scott Helme
Scott Helme
V2EX - 技术
V2EX - 技术
博客园 - 叶小钗
S
Securelist
A
Arctic Wolf
The Cloudflare Blog
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
博客园 - Franky

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

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет 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 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Математика кластеров: разбираемся в умной кластеризации данных на примере нашей системы поиска аномалий в логах. Часть 1
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 и в реальном времени семантически отслеживать, кластеризовать, выводить, классифицировать логи наших систем. Наши инженеры с легкостью видят, какие логи и сколько раз повторялись, не тратят время на классификацию этих данных, видят аномалии, видят семантические именованные кластера, количества логов и прирост в каждом из них.

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