Предисловие
Несмотря на использование биологических аналогий, предлагаемый метод не относится к quorum sensing clustering в классическом смысле.
В работах, вдохновлённых quorum sensing, сигнал напрямую связан с локальной плотностью и используется как механизм адаптивного выбора радиуса влияния или порога плотности. Фактически такие методы остаются плотностными моделями кластеризации с биологической мотивацией (см., например, arXiv:1303.3934).
В предлагаемом подходе сигнал имеет иную природу.
Он не отражает количество соседей и не служит индикатором принадлежности к кластеру, а представляет собой внутреннее бинарное состояние агента, определяющее режим его локального взаимодействия с окружением.
Кластеризация в этой модели не является результатом разбиения пространства по геометрическим признакам. Она возникает как побочный эффект динамики, в которой устойчивые коллективные режимы поведения формируются, стабилизируются и защищаются через локальные правила взаимодействия.
Бактерии, культуры и кластеризация данных
Как-то однажды перед сном я начал читать книгу известного нейробиолога Антонио Д’Амасио. В отличие от многих своих коллег он рассматривает влияние чувств на человеческие культуры. До чувств я так и не дошёл, а вот до культур — дочитал. И автор, опираясь на экспериментальные данные, довольно убедительно показывает: человечество культуру не изобрело. Более того, культуры существуют даже у бактерий.
Представим себе чашку Петри, в которой есть некая питательная среда — неважно какая, пусть для простоты это будет йогурт или другой кисломолочный продукт. И поместим туда всего четыре бактерии. Попав в питательную среду, они ведут себя примитивнейшим образом: поглощают пищу вокруг себя и делятся. Еды много, конкурентов мало — вокруг хаос. Впрочем, чего ещё ожидать от бактерий.
Но довольно быстро ситуация меняется. В какой-то локальной области питательное вещество оказывается съеденным, численность бактерий резко возрастает, а вместе с ней растёт и конкуренция за ресурсы. Как вести себя в такой ситуации? Чисто по-человечески: либо становиться злее и агрессивнее, либо отходить туда, где еды ещё достаточно, а конкурентов либо нет, либо мало. Допустим, миграция даёт лишь временное решение. Вокруг снова появляются конкуренты. И тут происходит первый, на удивление «умный» шаг: бактерии начинают делиться всё реже. А некоторые идут ещё дальше и ведут себя совсем по-хамски — выделяют вещества, отпугивающие соседей.
Конечно, до культуры здесь ещё далеко. Пока это война всех против всех. Но подождите немного.
И вот он — переход от дикого Запада к культуре. Когда плотность бактерий достигает критического порога, они начинают вырабатывать сигнальные молекулы. Чем больше бактерий рядом, тем выше концентрация сигнала в определённом радиусе. И это меняет всё: регуляторные механизмы включают одни гены и выключают другие, появляется специализация, а скорость деления радикально меняется. Отдельная бактерия не знает, сколько их — похожих на неё, — но она чувствует локальную концентрацию сигнала. Этого оказывается достаточно, чтобы возникла культура.
Всё это чудо жизни разворачивается, однако, на фоне довольно печальных событий — дефицита ресурсов. Деление сокращается, социализация появляется, но еды всё равно становится меньше. Что делать дальше? Нет, бактерии не просят у лаборанта ещё пачку йогурта. Они формируют границу. Внутри этой границы колония начинает вести себя иначе: активность сохраняется по краям, рост становится неравномерным, а в центре постепенно воцаряется покой. Форма колонии тоже меняется — это может быть ветвление, фрактал, круг или любая другая структура, позволяющая дотянуться до питательных веществ.
И вот последний штрих — колония. Здесь происходит почти невообразимое: бактерии начинают вести себя как единый организм. По-прежнему не представляя своего общего количества, они вместе реагируют на опасность, перестраивают форму и меняют стратегию развития. Одна бактерия остаётся всего лишь бактерией с сигнальной молекулой. Но миллиарды таких бактерий — это уже культура, сложнее и богаче, чем каждая из них по отдельности. И, как дополнительный бонус, бактериальные культуры не любят тунеядцев: такие бактерии постепенно оттесняются от источников питания, делятся всё реже и в итоге исчезают.
Хорошо, с биологией всё понятно. Но вообще-то я собирался писать про data science.
Почему это похоже на кластеризацию
И в описании того, как бактерии формируют колонии, я неожиданно узнал классическую задачу кластеризации. И бактерии, и точки данных находятся в одинаковом положении: каждая из них «знает» только себя. Она не знает, сколько таких же вокруг, не понимает, разделяет ли сосед её «взгляды», и не имеет представления о глобальной структуре системы.
В мире непомеченных данных у нас есть только одно — отношения между точками. Чаще всего это расстояние. Именно на этом предположении построено большинство алгоритмов кластеризации. Например, k-means: точки тянутся к ближайшему «центру» — математической фикции, придуманной нами для удобства, — не имея ни малейшего понятия, что именно они в итоге образуют: кластер, культуру или всего лишь локальную плотность.
DBSCAN идёт дальше и говорит: «кластер — это плотность». HDBSCAN добавляет иерархию плотностей. Но фундаментальная предпосылка остаётся прежней: структура данных задана геометрией.
И здесь становится ясно: бактерии способны кое-чему нас научить.
Кластер как режим поведения
В моём понимании точка ведёт себя совсем не так, как предполагают классические алгоритмы. Она не обязана доверять расстоянию: близкий сосед вполне может оказаться источником конфликта или шума. Единственное, что для неё действительно важно, — сигнал. Совпадает ли локальный режим ��оведения? Активирован ли тот же самый «информационный транскриптор»?
Кластер в этом смысле — это не геометрическая область, а группа точек с одним и тем же активным режимом.
Рассмотрим простой пример: логи пользователей. Каждая точка — это отдельное событие. В какой-то момент локальная согласованность поведения становится достаточно высокой, и сигнал включается. Например, несколько пользователей подряд совершают одинаковые скроллы с близким темпом. Точка не «обнаруживает кластер». Она фиксирует факт: в текущем локальном контексте коллективный режим поведения стал устойчивее индивидуального.
После включения сигнала точка меняет режим поведения. Она больше не ищет ближайшее событие по расстоянию признаков. Близкое событие может оказаться случайным. Вместо этого она начинает ориентироваться на события с тем же активным режимом. Найдя их, точки начинают вести себя согласованно: схожий темп действий, одинаковая реакция на изменения среды, устойчивый сценарий.
Важно: они сближаются не геометрически, а поведенчески. Пространство признаков остаётся тем же самым, но меняется способ его интерпретации. Влияние «своих» усиливается, влияние «чужих» подавляется. Расстояние никуда не исчезает, но перестаёт быть решающим фактором.
Границы и мембрана
На стыке различных режимов возникает граница — не линия, а зона нестабильности. В ней сигнал колеблется, точки чаще переключаются, и система тратит всё больше ресурсов на удержание согласованного поведения. Эта нестабильность и проявляет границу. Она не вычисляется заранее и не рисуется алгоритмом — она возникает сама.
Для сохранения устойчивости включается мембрана. Это не оболочка и не запрет, а локальное правило взаимодействия: вероятность принятия «чужих» снижается, порог включения сигнала повышается, пограничные состояния мягко отталкиваются. Мембрана существует не вокруг кластера, а между режимами поведения и активируется только там, где возникает конфликт.
Кластер стабилизируется как автономная структура. Он не обязан быть оптимальным, симметричным или компактным. Зато он устойчив, воспроизводим и объясним через локальные правила.
Почему здесь важна стохастичность
Стохастичность в этом алгоритме — не побочный эффект, а необходимый компонент. В биологических системах шум играет функциональную роль: он позволяет избегать преждевременной стабилизации и локальных минимумов. Аналогично здесь: включение и выключение сигнала не должно быть полностью детерминированным.
Контролируемая стохастичность — например, через температурный параметр с постепенным снижением — позволяет системе сначала исследовать пространство возможных режимов, а затем стабилизироваться. Без этого алгоритм быстро «замерзает» в случайном разбиении и теряет адаптивность.
Антифрод как следствие динамики
В этой логике антифрод, атаки, боты и «ленивые» точки данных естественным образом оказываются на границе. Они могут временно пользоваться выгодами устойчивой структуры, но не способны долго поддерживать сигнальный режим. Их «информационный транскриптор» не удерживается, сигнал гаснет, и такие точки автоматически изолируются — без явных флагов и жёсткой классификации.
Антифрод здесь — не отдельная задача, а следствие динамики системы.
Чем это отличается от kNN, DBSCAN и HDBSCAN
Свойство | Плотностные методы | Этот подход |
|---|---|---|
Основная величина | ρ(x) | s(t) |
Тип сигнала | детерминированный | стохастический |
Кластер | геометрическая область | аттрактор динамики |
Граница | заранее вычисляема | энтропийна |
Аномалии | редкие точки | нестабильные режимы |
kNN и плотностные методы отвечают на вопрос:
«Как разбить пространство точек?»
Предлагаемый подход отвечает на другой вопрос:
«Какие устойчивые формы коллективного поведения существуют в этих данных?»
Именно это различие делает его не альтернативой DBSCAN или HDBSCAN, а отдельным классом алгоритмов — ориентированных на динамику, состояние и самоорганизацию.
Математический формализм:
Тут надо оговориться, что я всегда воспринимал математику науку не как вещь в себе а как грубый инструмент. Так что я уверен что на Хабре найдутся тысячи людей которые смогут помочь преодолеть мне мое незнание и поправить математический формализм
1. Объекты и пространство
Каждая точка — агент, а не пассивный объект.
Бинарный сигнал
скрытый режим (можно неявно):
В простейшем варианте но дальше это можно обобщать.
2. Локальное взаимодействие (не плотность!)
Определим локальное окружение точки:
Важно:
не используется для подсчёта плотности. Оно лишь определяет, с кем точка может взаимодействовать.
3. Функция согласованности (ключевой элемент)
где
— вес взаимодействия (не обязательно расстояние, может быть:
сходство паттернов,
корреляция временных окон,
косинус логов и т.д.)
Это не плотность.
Это локальная согласованность режимов.
4. Сигнал как стохастическое внутреннее состояние
Сигнал не вычисляется напрямую, а активируется вероятностно:
где:
σ(·) — сигмоида (логистическая функция),
θ — порог согласованности,
T(t) — температура системы (уровень шума).
Интерпретация:
при высокой температуре → режим исследования (повышенная стохастичность),
при низкой температуре → режим стабилизации и закрепления устойчивых паттернов.
5.Изменение поведения при активном сигнале
Метрика взаимодействия становится режим-зависимой:
Или эквивалентно — веса влияния:
Пространство не меняется, меняется динамика взаимодействий в нём.
6. Кластер как аттрактор динамики
такое, что:
и состояние устойчиво к малым возмущениям.
То есть:
сигнал сохраняется,
локальные флуктуации не разрушают режим,
точки «узнают своих» без центра и плотности.
7.Граница и мембрана (формально)
Граница — это область с высокой энтропией сигналов:
Мембрана реализуется через адаптивный порог:
высокая нестабильность → выше порог,
проникновение «чужих» подавляется автоматически.
8. Антифрод и аномалии
Точка считается аномальной не потому, что далека, а потому что:
То есть:
она рядом,
но не способна поддерживать режим.
Антифрод = неспособность удерживать коллективное состояние.
9. Почему это не плотностный метод (коротко, но математично)
Свойство | Плотностные методы | Этот подход |
|---|---|---|
Основная величина | ρ(x) |
|
Т)ип сигнала | детерминированный | стохастический |
Кластер | геометрическая область | аттрактор динамики |
Граница | заранее вычисляема | энтропийна |
Аномалии | редкие точки | нестабильные режимы |
Код алгоритма
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from collections import defaultdict
#Базовые функции
def similarity(x, y):
# базовая функция близости (можно заменить)
return np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y) + 1e-8)
def annealed_temperature(t, T0=1.0, alpha=0.995):
return T0 * (alpha ** t)
#Основной класс
class BehavioralClustering:
def __init__(
self,
X,
k=10,
signal_threshold=0.6,
membrane_strength=0.5,
T0=1.0,
alpha=0.995,
max_iter=100
):
self.X = X
self.N = len(X)
self.k = k
self.signal_threshold = signal_threshold
self.membrane_strength = membrane_strength
self.T0 = T0
self.alpha = alpha
self.max_iter = max_iter
# внутренние состояния
self.signal = np.zeros(self.N) # s_i(t)
self.signal_history = []
# kNN граф (фиксируем один раз)
self.sim_matrix = cosine_similarity(X)
self.neighbors = np.argsort(-self.sim_matrix, axis=1)[:, 1:k+1]
#Локальная согласованность (ключ!)
def local_coherence(self, i):
neigh = self.neighbors[i]
weights = []
for j in neigh:
w = similarity(self.X[i], self.X[j])
# мембрана: подавление "чужих"
if self.signal[i] != self.signal[j]:
w *= (1 - self.membrane_strength)
weights.append(w * self.signal[j])
return np.mean(weights) if weights else 0.0
# Стохастическое обновление сигнала
def update_signal(self, i, Q_i, T):
# вероятность включения режима
p = 1 / (1 + np.exp(-(Q_i - self.signal_threshold) / (T + 1e-8)))
return 1 if np.random.rand() < p else 0
# Основной цикл динамики
def fit(self):
for t in range(self.max_iter):
T = annealed_temperature(t, self.T0, self.alpha)
new_signal = self.signal.copy()
for i in range(self.N):
Q_i = self.local_coherence(i)
new_signal[i] = self.update_signal(i, Q_i, T)
self.signal = new_signal
self.signal_history.append(self.signal.copy())
return self
#Извлечение кластеров
def extract_clusters(self):
visited = set()
clusters = []
for i in range(self.N):
if self.signal[i] == 1 and i not in visited:
stack = [i]
cluster = []
while stack:
v = stack.pop()
if v in visited:
continue
visited.add(v)
cluster.append(v)
for u in self.neighbors[v]:
if self.signal[u] == 1:
stack.append(u)
clusters.append(cluster)
return clusters
#Аномалии
def anomaly_score(self):
S = np.array(self.signal_history)
return S.mean(axis=0) # доля времени в коллективном режимеВместо заключения
Это не production-ready алгоритм и не серебряная пуля. Это исследовательская идея. Возможно, сырая. Но она позволяет посмотреть на кластеризацию под другим углом: не как на задачу геометрии, а как на задачу возникновения устойчивых форм поведения.
Если идея кажется вам интересной — буду рад обсуждению, критике и совместным экспериментам над данными и возможно так мы еще больше разовьем ml\ai
P.S. За форматирование формул, таблиц отвечал chatGpt
P.P.S. Моя фамилия в алгоритме будет стоять первой, моё тщеславие не позволит мне поступить по другому :D
