Semantic core extraction on graphs using Ant Colony Optimization
Project description
Intelliant: графовый алгоритм поиска семантических ядер
Intelliant - специализированный алгоритм кластеризации, основанный на метаэвристике муравьиной колонии (Ant Colony Optimization, ACO).
В отличие от классических методов, алгоритм не очерчивает математические границы кластеров в гиперпространстве. Он переводит многомерные данные (например, эмбеддинги языковых моделей) в граф ближайших соседей (KNN) и использует роевой интеллект для поиска самых плотных семантических центров (ядер).
Алгоритм оптимизирован через Numba и разреженные матрицы (Sparse CSR), что позволяет обрабатывать сотни тысяч объектов за секунды на обычных CPU, обходя ограничения памяти, свойственные индустриальным стандартам вроде HDBSCAN.
Статус и пакеты
Альфа. Пакет в стадии активной разработки (исследовательская фаза). Публичный API еще меняется между версиями. Это инструмент собственного исследования, а не готовое решение для внешних пользователей. Что сделано и что впереди - в ROADMAP.md; долгосрочные исследовательские идеи - в RESEARCH_NOTES.md.
- Актуальный пакет:
intelliant(текущая архитектура из трех классов). - Старый пакет (old, не поддерживается):
intelliant-core- одноклассовая архитектураIntelliantCoreExtractor. Ссылка оставлена для тех, кто пришел по старому имени; устанавливать не нужно, развитие перенесено вintelliant.
Основные возможности
- Независимость от размерности. Работает с графом связей (cosine, euclidean), а не с сырыми координатами. Подходит и для 2D/3D, и для 384D+ эмбеддингов.
- Min-Max Ant System (MMAS). Защита от стагнации феромонов, предотвращающая коллапс графа в "черную дыру" одного хаба.
- Элитные муравьи. Ускоренное формирование ядер за счет жадного поведения выделенной группы агентов, с настраиваемой стартовой итерацией (разделение фаз exploration / exploitation).
- Гравитация узлов (node density). Опциональная эвристика: муравьи оценивают локальную плотность целевой точки, ускоряя сходимость.
- Двухэтапная абсорбция шума. Распространение меток по феромонным волнам, затем центроидный фоллбэк для изолированных точек. Доступна и как единый вызов, и по этапам (для покадровой визуализации и кэширования промежуточного состояния).
- Диагностика гиганта. Сигнализация о подозрении на склейку/раздувание кластеров по разрыву размеров (без вмешательства в данные).
- Прозрачное состояние. Все промежуточные артефакты (граф, феромонное поле, сырые ядра, метки) доступны через атрибуты для визуализации, отладки и кэширования между сессиями.
Архитектура
Кластеризация разделена на три концептуально независимых класса, каждый в своем модуле:
| Класс | Модуль | Вход | Выход |
|---|---|---|---|
GraphBuilder |
intelliant.graph_builder |
эмбеддинги X |
граф похожестей (CSR) |
PheromoneExtractor |
intelliant.pheromone_extractor |
граф | феромонный граф |
CoreClusterer |
intelliant.core_clusterer |
феромонный граф + порог | метки кластеров |
Единого вызова "все в одном" нет: три части решают разные задачи (работа с данными, производство феромонов, истолкование феромонов в кластеры), и разделение сделано осознанно, чтобы каждый этап настраивался и инспектировался отдельно. Порог отсечения феромонов и извлечение эмбеддингов на текущем этапе пользователь готовит сам, вне библиотеки.
Требования
- Python:
>= 3.14 - Пакетный менеджер:
uv - Зависимости (ставятся автоматически): numpy, scipy, numba, scikit-learn, pynndescent, tqdm.
- Аппаратное ускорение (для генерации эмбеддингов отдельной моделью): CUDA / MPS через PyTorch - в группе зависимостей
embeddings.
Установка
Из PyPI (альфа):
pip install intelliant
# или явно альфа-версию:
pip install intelliant==0.1.0a1
Из исходников (для разработки):
git clone https://github.com/yourdisenchantment/intelliant.git
cd intelliant
uv sync # только библиотека
uv sync --all-groups # + ноутбуки, эмбеддинги, инструменты разработки
Группы зависимостей: notebooks (jupyter, визуализация, polars, umap), embeddings (torch, sentence-transformers, datasets), dev (pre-commit, ruff, pyright, scipy-stubs).
Для загрузки тестовых датасетов создайте .env в корне с токеном Hugging Face:
HF_TOKEN=hf_ваша_строка_токена
Пример использования
Пайплайн состоит из трех шагов: построение графа, прогон муравьев, извлечение кластеров. Порог отсечения феромонов задает пользователь (ниже - простой пример через перцентиль).
import numpy as np
from intelliant import GraphBuilder, PheromoneExtractor, CoreClusterer
# X - матрица эмбеддингов (N, D), подготовленная пользователем
# 1. Граф похожестей из эмбеддингов
graph = GraphBuilder(
n_neighbors=15,
metric="cosine",
mutual=True, # взаимный KNN (AND-симметризация)
min_connections=5, # донабор связности изолированным точкам
knn_method="auto", # exact для малых датасетов, approx для больших
random_state=42, # для воспроизводимого approx-поиска
).build(X)
# 2. Прогон муравьиного роя (граф -> феромонный граф)
aco = PheromoneExtractor(
n_ants=len(X), # явное число муравьев (критичный параметр)
n_iterations=20,
use_elite_ants=True,
elite_start_iteration=10, # элита включается с середины прогона
random_state=42, # сид роя (независим от сида графа)
)
aco.fit(graph)
pheromones = aco.pheromone_matrix_
# 3. Порог отсечения (пользователь считает сам; здесь - перцентиль)
threshold = np.percentile(pheromones.data, 90)
# 4. Извлечение ядер и абсорбция шума
clusterer = CoreClusterer(min_cluster_size=50, batch_size=200_000)
cores = clusterer.extract_cores(pheromones, threshold) # ядра 0..k-1, шум -1
labels = clusterer.absorb(pheromones, X) # достройка шума
# Промежуточное состояние доступно для диагностики и визуализации:
# clusterer.cores_ - сырые ядра до абсорбции
# clusterer.labels_pheromone_ - после феромонных волн (этап 1)
# clusterer.labels_ - финальные метки
Этапы абсорбции можно вызывать раздельно (absorb_pheromone, затем absorb_centroid) - это дает три снимка состояния (сырые ядра -> после волн -> финал) и позволяет сохранять промежуточный результат между сессиями.
Каждый класс хранит результат в атрибуте с трейлинг-подчеркиванием (graph_, pheromone_matrix_, cores_, labels_pheromone_, labels_) по sklearn-конвенции и одновременно возвращает его из метода.
Развитие
- Что впереди (текущие и ближайшие работы) - ROADMAP.md.
- Долгосрочные исследовательские идеи (многоуровневая иерархическая кластеризация и др.) - RESEARCH_NOTES.md. Это заметки на будущее, не обязательства текущего проекта.
Лицензия
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file intelliant-0.1.0a1.tar.gz.
File metadata
- Download URL: intelliant-0.1.0a1.tar.gz
- Upload date:
- Size: 21.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99880422612143775f8d2bd29203ce28b31485ce7ff692f4a2e426662a14ebd6
|
|
| MD5 |
1d2dc8b0ba199d38fb8a9709eff55ed1
|
|
| BLAKE2b-256 |
e20d08e9f2628b745c726fefb00cad8cb06705817c34123caf2e32405da18945
|
File details
Details for the file intelliant-0.1.0a1-py3-none-any.whl.
File metadata
- Download URL: intelliant-0.1.0a1-py3-none-any.whl
- Upload date:
- Size: 23.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e885ebffa2bf7821f4f02db62a1c53d0e8cdcb9bbf5a9836b95b8f66adffee58
|
|
| MD5 |
dcfdc082e6d45d8276eb599172554fb1
|
|
| BLAKE2b-256 |
dae709314beaa7e52071e50c39f9b45e158e57ba9bf1c15b727e1509c5f2edd4
|