Розовое лентообразное облако на закате над холмом с деревьями и столбом.

Спектральное обнаружение сообществ в клинических графах знаний

Содержание

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

Делиться

996170a19fe63859de656a54b20873c6

Введение

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

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

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

В контексте анализа графов мы заменяем стандартные методы кластеризации (например, k-средних) алгоритмами выявления сообществ, которые определяют, как группы пациентов организуются на основе общих синдромов.

Исходя из этих наблюдений, мы приходим к нашему исследовательскому вопросу :

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

Для решения этого вопроса я разработал комплексный конвейер обработки клинических графов, который генерирует синтетические заметки, извлекает сущности заболеваний, строит граф знаний «пациент-заболевание» в Neo4j, выявляет сообщества с помощью Лейденского алгоритма и анализирует их структуру, используя алгебраическую связность и вектор Фидлера.

Лейденский алгоритм разбивает граф на кластеры, но не предоставляет информации о внутренней структуре этих сообществ.

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

В этом блоге читатели узнают, как:

  • Создаются синтетические клинические записи.
  • Болезнетворные нозологические единицы извлекаются и анализируются.
  • Сообщества Лейдена используются для получения информации о данной группе лиц.
  • Алгебраическая связность — это показатель силы сообщества.
  • Вектор Фидлера используется для дальнейшего разделения сообществ.

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

💡 Данные, код и изображения :

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

Исходный код: Весь код, синтетические данные, блокноты и файлы конфигурации доступны в сопутствующем репозитории GitHub. Граф знаний построен с использованием Neo4j Desktop с плагином GDS. Вы можете воспроизвести весь конвейер, от генерации синтетических заметок до анализа графа Neo4j и спектральных вычислений, в Google Colab и/или локальной среде Python.

Изображения: Все рисунки и визуализации в этой статье созданы автором.

Обзор методологии

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

809544f92080e5cd3b5c9cceb1e8a276

Рабочий процесс протекает следующим образом:

  • Создание синтетических данных. Разработка корпуса, содержащего около 740 синтетических клинических записей в стиле истории настоящего заболевания (ИСЗ) с указанием контролируемых заболеваний и четкими инструкциями по форматированию записей.
  • Извлечение и дедупликация сущностей. Извлечение сущностей заболеваний с использованием модели распознавания именованных сущностей OpenMed и применение слоя деидентификации на основе нечеткого сопоставления.
  • Построение графа знаний. Создайте двудольный граф со схемой Пациент — HAS_DISEASE -> Заболевание.
  • Выявление сообществ. Примените лейденский алгоритм выявления сообществ для идентификации групп пациентов, имеющих схожие заболевания.
  • Спектральный анализ. Вычислите алгебраическую связность для измерения внутренней однородности каждого сообщества и используйте вектор Фидлера для разделения сообществ на значимые подкластеры.

Этот краткий обзор описывает полный аналитический процесс. В следующем разделе подробно рассказывается о том, как были созданы синтетические клинические записи.

Генерация синтетических данных

Для этого проекта я создал корпус синтетических клинических записей, используя API OpenAI и работая в Google Colab для удобства. Полное описание задачи и подробности реализации доступны в репозитории.

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

  • Клиническое описание: связные повествования, сфокусированные на 1-2 доминирующих системах органов, с естественной причинно-следственной связью.
  • Контролируемая плотность сущностей: каждая заметка содержит 6-10 значимых состояний или симптомов, с ограничениями для предотвращения перегрузки сущностями.
  • Контроль разнообразия: образцы заболеваний отбираются в заданных пропорциях, охватывая весь спектр от распространенных до редких заболеваний, а основные системы органов выбираются равномерно из 12 категорий.
  • Ограничения по безопасности: никакая идентифицирующая информация не содержится.

Ключевая проблема при создании такого синтетического набора данных — предотвращение чрезмерно связанных графов, где многие пациенты имеют одно и то же небольшое количество заболеваний. Более простой запрос может создать относительно хорошие индивидуальные записи о пациентах, но плохое общее распределение заболеваний. Чтобы противодействовать этому, я специально попросил модель обдумывать свои решения и периодически сбрасывать шаблон выбора, предотвращая повторение. Эти инструкции увеличивают сложность принятия решений моделью и замедляют генерацию, но позволяют получить более разнообразный и реалистичный набор данных. Генерация 1000 образцов с помощью gpt-5-mini заняла около 4 часов.

Каждый сгенерированный образец включает две характеристики: клиническую заметку (сгенерированный текст) и идентификатор пациента (уникальный идентификатор, присвоенный во время генерации). Около 260 записей были пустыми и были удалены в процессе предварительной обработки, в результате чего осталось 740 заметок, чего достаточно для этого мини-проекта.

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

«50-летний мужчина обратился с жалобами на прогрессирующую одышку при физической нагрузке, продолжающуюся в течение шести недель, и постоянный непродуктивный кашель, начавшийся после самопроизвольно прошедшего бронхита. … Он жалуется на дневную усталость и громкий храп с наблюдаемыми паузами, что соответствует обструктивному апноэ сна; у него хорошо контролируемая гипертония и 25-летний стаж курения (в пачках сигарет за год), но он бросил курить пять лет назад. Он отрицает наличие лихорадки или ортопноэ».

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

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

Извлечение и дедупликация сущностей

Цель этого этапа — преобразовать неструктурированные клинические записи в структурированные данные. Используя биомедицинскую модель распознавания именованных сущностей (NER), мы извлекаем релевантные сущности, которые затем нормализуются и дедуплицируются перед построением пар связей.

Почему только NER (не распознавание нуклеотидов) при заболеваниях?

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

Выбор модели

Я выбрал специализированную модель NER из OpenMed (подробности см. в ссылке [1]), отличной коллекции моделей биомедицинской обработки естественного языка с открытым исходным кодом: OpenMed/OpenMed-NER-PathologyDetect-PubMed-109M, небольшую, но производительную модель, которая извлекает сущности заболеваний. Эта модель обеспечивает баланс между скоростью и качеством, что делает ее хорошо подходящей для быстрых экспериментов. С ускорением GPU (A100, 40 ГБ) извлечение сущностей из всех 740 заметок занимает менее минуты; в то время как на ЦП это может занять 3-5 минут.

Вывод : Использование параметра aggregation_strategy = «average» предотвращает появление фрагментов текста (например, «echin» и «##ococcosis»), обеспечивая чистоту блоков сущностей.

Дедупликация сущностей

Исходные данные NER по своей природе неаккуратны: часто встречаются орфографические вариации, морфологические варианты и почти идентичные варианты (например, fever, low grade fever, fevers).

Для решения этой проблемы я применил глобальный алгоритм нечеткого сопоставления для удаления дубликатов извлеченных сущностей путем кластеризации похожих строк с использованием нормализованного сходства Indel (fuzz.ratio) из RapidFuzz. В каждом кластере он выбирает каноническое имя, агрегирует оценки достоверности, подсчитывает объединенные упоминания и уникальных пациентов и возвращает чистый список уникальных сущностей заболеваний. Это позволяет получить чистый набор заболеваний, подходящий для построения графа знаний.

Краткое описание конвейера обработки естественного языка

Конвейер обработки данных состоит из следующих этапов:

  1. Загрузка данных: загрузите набор данных и удалите записи с пустыми примечаниями.
  2. Извлечение сущностей: применить модель распознавания именованных сущностей (NER) к каждой заметке и собрать упоминания заболеваний.
  3. Дедупликация: кластеризация похожих сущностей с использованием нечеткого сопоставления и выбор канонических форм.
  4. Каноническое сопоставление: каждому извлеченному объекту (тексту) присваивается наиболее часто встречающаяся форма в качестве канонического текста.
  5. Присвоение идентификаторов сущностям: генерация уникальных идентификаторов для каждой дедуплицированной сущности.
  6. Инструмент построения связей: создайте связи, соединяющие каждый patient_id с каноническими заболеваниями, извлеченными из его clinical_note.
  7. Экспорт в CSV: экспорт трех чистых файлов для импорта в Neo4j.

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

Граф знаний

Построение графов в Neo4j

Я построил двудольный граф знаний с двумя типами узлов: «Пациент» и «Заболевание», соединенными отношениями HAS_DISEASE. Эта простая схема достаточна для изучения сходства пациентов и извлечения информации о сообществах.

b371a442973c6a09c8c25a786d2c9f6f

Рисунок 1. Схема графа «Пациент-заболевание» (составлена автором).

Я использовал Neo4j Desktop (версия 2025.10.1), которая предоставляет полный доступ ко всем функциям Neo4j и идеально подходит для графов небольшого и среднего размера. Нам также потребуется установить плагин Graph Data Science (GDS), который предоставляет алгоритмы, используемые далее в этом анализе.

Чтобы этот раздел был более лаконичным, я перенёс схему построения графа в репозиторий проекта на GitHub. Этот процесс занимает менее 5 минут при использовании визуального импортера Neo4j Desktop.

Запросы к графу знаний

Все запросы к графам, используемые в этом проекте, можно выполнять непосредственно в Neo4j Desktop или из блокнота Jupyter. Для удобства в репозитории содержится готовый к запуску блокнот KG_Analysis.ipynb с вспомогательным классом Neo4jConnection, который упрощает отправку запросов Cypher в Neo4j и получение результатов в виде DataFrames.

Графовая аналитика и выводы

Граф знаний включает 739 узлов, относящихся к пациентам, и 1119 узлов, относящихся к заболеваниям, соединенных 6400 связями. Приведенный ниже снимок, иллюстрирующий структуру графа, показывает подмножество из 5 пациентов и некоторые из их заболеваний:

f1a99142c77d36850fa3f3219b96839a

Рисунок 2. Пример подграфа, показывающий пять пациентов и их заболевания (составлен автором).

Анализируя распределение степеней (рангов) (количество связей заболеваний на одного пациента), мы обнаруживаем в среднем почти 9 заболеваний на одного пациента, варьирующихся от 2 до 15. На левой панели показана заболеваемость, то есть распределение заболеваний на одного пациента. Для понимания клинической картины на правой панели выделены десять наиболее распространенных заболеваний. Наблюдается преобладание сердечно-легочных заболеваний, что указывает на наличие крупных кластеров, сосредоточенных на осложнениях со стороны сердца и легких.

3d72e36b73098079f88bbd2746478380

Рисунок 3. Базовый анализ графов (создан автором).

Эти базовые аналитические данные позволяют заглянуть в структуру графа. Далее мы углубимся в его топологию, выявив связанные компоненты и проанализировав сообщества пациентов и заболеваний.

Выявление сообществ

Подключенные компоненты

Начнем с анализа общей связности нашего графа с использованием алгоритма слабосвязанных компонентов (WCC) в Neo4j. Алгоритм WCC определяет, соединены ли два узла путем, независимо от направления ребер, составляющих этот путь.

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

project_graph = ''' CALL gds.graph.project( 'patient-disease-graph', ['Patient', 'Disease'], {HAS_DISEASE: {orientation: 'UNDIRECTED'}} ) YIELD graphName, nodeCount, relationshipCount RETURN graphName, nodeCount, relationshipCount ''' conn.query(project_graph) wcc_stats = ''' CALL gds.wcc.stats('patient-disease-graph') YIELD componentCount, componentDistribution RETURN componentCount, componentDistribution ''' conn.query_to_df(wcc_stats)

Используемый здесь синтетический набор данных создает связный граф. Несмотря на то, что наш граф содержит всего одну компоненту, мы все же присваиваем каждому узлу идентификатор компонента (componentId) для полноты картины и совместимости с общим случаем.

Выводы : Используя алгоритм allShortestPaths, мы обнаружили, что диаметр нашего связного графа равен 10. Поскольку это двудольный граф (пациенты связаны общими заболеваниями), максимальное расстояние между любыми двумя пациентами составляет 4 дополнительных пациента.

Алгоритмы обнаружения сообществ

Среди алгоритмов обнаружения сообществ, доступных в Neo4j и не требующих предварительной информации о сообществах, мы сужаем выбор до алгоритмов Лувена, Лейдена и распространения меток. Лейден (см. ссылку [3]), иерархический алгоритм обнаружения, решает проблемы разобщенности некоторых сообществ, обнаруженных Лувеном, и является лучшим выбором. Распространение меток, алгоритм, основанный на диффузии, также может быть разумным выбором; однако он, как правило, создает сообщества с меньшей модульностью, чем Лейден, и менее устойчив между различными запусками (см. ссылку [2]). По этим причинам мы используем Лейден.

Затем мы оцениваем качество обнаруженных сообществ, используя следующие методы:

  • Модульность — это метрика для оценки качества сообществ, сформированных алгоритмами обнаружения сообществ, обычно основанными на эвристиках. Ее значение варьируется от −0,5 до 1, причем более высокие значения указывают на более сильные структуры сообществ (см. ссылку [2]).
  • Проводимость — это отношение числа связей, указывающих за пределы сообщества, к общему числу связей в сообществе. Чем ниже проводимость, тем сильнее разобщенность сообщества.

Выявление сообществ с помощью Лейденского алгоритма

Перед применением алгоритма обнаружения сообществ мы создаём проекцию графа с неориентированными связями, обозначенную как largeComponentGraph.

Для выявления групп пациентов со схожими особенностями течения заболевания мы запускаем алгоритм Leiden в режиме записи, присваивая каждому узлу идентификатор сообщества (communityId). Это позволяет нам сохранять метки сообществ непосредственно в базе данных Neo4j для последующего анализа. Для обеспечения воспроизводимости мы устанавливаем фиксированное начальное значение генератора случайных чисел и собираем несколько ключевых статистических данных (более подробные статистические данные приведены в соответствующем блокноте). Однако даже при фиксированном начальном значении стохастическая природа алгоритма может приводить к небольшим колебаниям результатов при разных запусках.

leiden_write = ''' CALL gds.leiden.write('largeComponentGraph', { writeProperty: 'communityId', randomSeed: 16 }) YIELD communityCount, modularity, modularities RETURN communityCount, modularity, modularities ''' conn.query_to_df(leiden_write)

Результаты Лейдена

Лейденский алгоритм выявил 13 сообществ с модульностью 0,53. Изучив список значений модульности из логов алгоритма, мы видим, что Лейденский алгоритм выполнил четыре итерации оптимизации, начиная с начальной модульности 0,48 и постепенно улучшая её на каждом шаге (полный список значений можно найти в блокноте).

Выводы: Модульность 0,53 указывает на то, что сообщества сформированы достаточно хорошо, что ожидаемо в данном сценарии, где пациенты часто страдают одними и теми же заболеваниями.

Визуальное представление сообществ Лейдена представлено в следующей объединенной визуализации:

9be867d0e8b9c887363f2f0f9f7b803a

Рисунок 4. Обзор населенных пунктов Лейдена (составлено автором).

Оценка проводимости

Для оценки внутренней сплоченности сообществ Лейдена мы вычисляем проводимость, которая реализована в Neo4j GDS. Более низкая проводимость указывает на сообщества с меньшим количеством внешних связей.

Значения электропроводности в населенных пунктах Лейдена варьируются от 0,12 до 0,44:

  • Очень сплоченные группы: 0,12-0,20
  • Умеренно сплоченные группы: 0,24-0,29
  • Нечетко определенные сообщества: 0,35-0,44

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

Интерпретация ландшафта сообщества

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

724dd745203fc42c9c1bcce25665281e

Рисунок 5. Сообщество 19 в Лейдене: кластер, специализирующийся на логопедии и неврологии (составлено автором).

Например, сообщество с идентификатором communityId = 19 содержит всего 9 узлов (2 узла пациентов и 7 узлов заболеваний) и построено вокруг проблем с речью и эпизодических неврологических состояний. Показатель проводимости сообщества, равный 0,41, ставит его в число сообществ с наибольшей внешней связью.

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

Спектральный анализ

В теории графов алгебраическая связность говорит нам больше, чем просто о том, является ли граф связным; она показывает, насколько сложно его разорвать. Прежде чем перейти к результатам, давайте вспомним несколько ключевых математических понятий, которые помогают количественно оценить, насколько хорошо граф сохраняет целостность. Алгебраическая связность и ее свойства были подробно проанализированы в работах [4] и [5].

Алгебраическая связность и вектор Фидлера

Введение в основы математики и основы математики

Пусть G = (V, E) — конечный неориентированный граф без петель и кратных рёбер. При заданном порядке вершин w1, … wn оператор Лапласа графа — это матрица nxn L(G) = [Lij], определяемая следующим образом:

[displaystyle {rm L}_{ij} = begin{cases} -1 & {rm если } ; ({rm w}_i, {rm w}_j) in {rm E} ; {rm и} ; {rm i} ne {rm j}\ 0 & {rm если } ; ({rm w}_i, {rm w}_j) notin {rm E} ; {rm и} ; {rm i} ne {rm j} \ {rm deg}({rm w}_i) & {rm если} ; {rm i} = {rm j}end{cases}]

где deg(wi) обозначает степень вершины wi.

Графический лапласиан также можно выразить как разность L = D – A двух более простых матриц:

  • Матрица степеней D – диагональная матрица с Dii = deg(wi).
  • Матрица смежности A – где Aij = 1, если wi и wj соединены, и 0 в противном случае.

💡 Примечание : Два приведенных выше определения эквивалентны.

Собственные значения и алгебраическая связность

Для графа с n вершинами (где n не менее 2) собственные значения его оператора Лапласа L(G) упорядочены следующим образом:

[0 = lambda_1 le lambda_2 = {rm a(G)} le lambda_3 ldots le lambda_n]

Алгебраическая связность a(G) определяется как второе наименьшее собственное значение оператора Лапласа.

Спектр оператора Лапласа раскрывает ключевые структурные свойства графа:
– Нулевые собственные значения: Количество нулевых собственных значений равно количеству связных компонент графа.
– Тест на связность: a(G) > 0 означает, что граф связный, a(G) = 0 тогда и только тогда, когда граф несвязный.
– Устойчивость: Большие значения a(G) соответствуют более тесно связанным графам; для их разъединения требуется больше удалений ребер.
– Полный граф: Для полного графа Kn алгебраическая связность максимальна: a(Kn) = n.

Вектор Фидлера

Собственный вектор, связанный с алгебраической связностью a(G), известен как вектор Фидлера . Он имеет одну компоненту для каждой вершины в графе. Знаки этих компонент, положительные или отрицательные, естественным образом делят вершины на две группы, создавая деление, которое минимизирует количество ребер, соединяющих их. По сути, вектор Фидлера показывает, как бы разделился граф, если бы его разделили на две связные компоненты, удалив наименьшее количество ребер (см. ссылку [8], гл. 22). Назовем это разделение сокращенно бипартицией Фидлера.

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

Далее мы вычисляем как алгебраическую связность, так и вектор Фидлера непосредственно из данных нашего графа в Neo4j с помощью Python.

Вычисление алгебраической связности

В настоящее время Neo4j не предоставляет встроенной функции для вычисления алгебраической связности, поэтому мы используем Python и утилиты разреженной линейной алгебры SciPy для вычисления алгебраической связности и вектора Фидлера. Это делается с помощью класса FiedlerComputer, описание которого приведено ниже:

Класс FiedlerComputer 1. Извлечение ребер из Neo4j 2. Сопоставление идентификаторов узлов с целочисленными индексами — Построение отображений узел-индекс и индекс-узел 3. Построение лапласиана разреженного графа — Построение симметричной матрицы смежности — Вычисление матрицы степеней из сумм строк матрицы A — Формирование лапласиана L = D – A 4. Вычисление спектральных величин — Глобальный режим: использование всех ребер пациент-заболевание — Режим сообщества: ребра внутри одного сообщества Лейдена — Использование `eigsh()` для вычисления k наименьших собственных значений L — Алгебраическая связность = второе наименьшее собственное значение — Вектор Фидлера = собственный вектор, соответствующий алгебраической связности 5. Дополнительно: запись результатов обратно в Neo4j — Сохранение `node.fiedlerValue` — Добавление меток FiedlerPositive / FiedlerNegative

Полная реализация включена в блокнот KG_Analysis.ipynb на GitHub.

Вычисление алгебраической связности для примера сообщества в Лейдене

Мы проиллюстрируем этот процесс на примере сообщества Лейдена = 14 , состоящего из 34 узлов и 38 ребер.

Извлечение и проверка ребер . Конструктор принимает объект соединения Neo4j conn, который выполняет Cypher и возвращает DataFrames Pandas.

fc = FiedlerComputer(conn) comm_id = 14 edges_data = fc.extract_edges(fc.query_extract_edges, parameters={'comm_id': comm_id})

Создайте сопоставления узел <–> индекс . Мы перечисляем все уникальные идентификаторы узлов и создаем два словаря: node_to_idx (для построения матриц) и idx_to_node (для записи результатов обратно).

прямой, обратный, n_узлов = fc.create_mappings(edges_data) >>выборка узла_к_IDX: [('DIS_0276045d', 0), ('DIS_038a3ace', 1)] >>выборка IDX_к_узлу: [(0, 'DIS_0276045d'), (1, 'DIS_038a3ace')] >>количество узлов: 34

Построение матрицы Лапласа графа . Мы строим матрицу Лапласа на основе данных графа. Для каждого неориентированного ребра мы вставляем два элемента, по одному для каждого направления, так что матрица смежности A становится симметричной. Затем мы создаем разреженное матричное представление (csr_matrix), которое эффективно с точки зрения использования памяти для больших разреженных графов. Матрица степеней D является диагональной и вычисляется с помощью сумм по строкам матрицы смежности.

laplacian_matrix = fc.build_matrices(edges_data, direct, n_nodes) >> Форма матрицы Лапласа: (34, 34)

Вычисляем алгебраическую связность и вектор Фидлера . Для вычисления нескольких наименьших пар собственных значений и собственных векторов оператора Лапласа (до k=4 для повышения эффективности) используем библиотеку scipy.sparse.linalg.eigsh.

lambda_global, vector_global = fc.compute(mode=»global») >>Глобальное значение λ₂ = 0.1102 >>Диапазон вектора Фидлера: [-0.4431, 0.0081]

Для вычисления алгебраической связности и соответствующего вектора Фидлера для всех сообществ Лейдена:

results = fc.compute_all_communities().sort_values('lambda_2', ascending=False)

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

7dc00f0fb7adca9caad9e9b7b7818a96

Рисунок 6. Значения алгебраической связности и проводимости для всех населенных пунктов Лейдена (составлено автором).

Значения алгебраической связности варьируются от 0,03 до 1,00 в сообществах Лейдена. Немногие сообщества с a(G) = 1 соответствуют небольшим, тесно связанным структурам, как правило, одному пациенту, связанному с несколькими заболеваниями.

На другом конце спектра находятся сообщества с очень низким значением a(G) (0,03–0,07), которые слабо связаны между собой и часто представляют собой смесь множественных заболеваний или гетерогенных состояний.

Вывод: Алгебраическая связность — это мера внутренней согласованности.

Разметка спектрального бипартийного разделения в Neo4j

Наконец, мы можем записать результаты обратно в Neo4j, присвоив каждому узлу метку в соответствии со знаком его компоненты вектора Фидлера.

fc.label_bipartition(vector_comm, inverse) >>Добавлены метки Фидлера к 34 узлам >>Положительные узлы: 22 >>Отрицательные узлы: 12

Мы можем визуализировать это двойное разбиение непосредственно в Neo4j Explorer/Bloom.

727ece19337b34e40c71630708f18c38

Рисунок 7. Двустороннее разбиение сообщества 14 по Фидлеру (составлено автором).

На визуализации 12 узлов с отрицательными компонентами Фидлера отображаются более светлыми цветами, а остальные узлы с положительными компонентами Фидлера — более темными тонами.

Интерпретация сообщества 14 с использованием вектора Фидлера.

Сообщество 14 содержит 34 узла (6 пациентов, 28 заболеваний), соединенных 38 ребрами. Его проводимость, равная 0,27, предполагает достаточно хорошо сформированную группу, но алгебраическая связность a(G) = 0,05 указывает на то, что сообщество легко разделить.

Вычислив вектор Фидлера (34-мерный вектор с одной компонентой на узел) и изучив бинарное разбиение Фидлера, мы наблюдаем две связанные подгруппы (как показано на предыдущем изображении), содержащие 2 пациентов с отрицательными значениями Фидлера и 4 пациента с положительными значениями Фидлера.

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

Заключительные комментарии

Обсуждение и выводы

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

Например, сообщества с очень высокой алгебраической связностью (a(G) близко к 1) часто сводятся к простым звездообразным структурам, где один пациент связан с несколькими заболеваниями. Они структурно просты, но клинически согласованы. Сообщества со средней связностью, как правило, ведут себя как стабильные, хорошо сформированные группы с общими симптомами. Наконец, сообщества с самой низкой связностью выявляют гетерогенные группы, состоящие из кластеров множественных заболеваний или пациентов, чьи заболевания лишь частично перекрываются.

Самое важное, что эта работа дает однозначный ответ на главный исследовательский вопрос: можем ли мы, используя алгоритмы обработки графов в сочетании со спектральными методами, выявить клинически значимую структуру, недоступную для традиционной кластеризации?

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

Перспективы развития и масштабируемость

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

Ключевые проблемы в масштабах предприятия включают в себя:

  • Обработка разреженности и размера: для анализа в реальном масштабе потребуются эффективные вычисления оператора Лапласа или методы аппроксимации (например, рандомизированные решатели собственных значений).
  • Вопросы сложности: Вычисления собственных значений обходятся дороже, чем алгоритмы обнаружения сообществ. Применение нескольких слоев алгоритмов обнаружения сообществ для уменьшения размеров графов, для которых вычисляется оператор Лапласа, является одним из практических подходов, который может помочь.

К перспективным направлениям расширения относятся:

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

Заключение

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

Если вы хотите поэкспериментировать с этим рабочим процессом:

  • Попробуйте разные модели распознавания именованных сущностей (NER).
  • изменить тип сущности (например, использовать симптомы вместо болезней).
  • эксперимент с параметром разрешения Лейдена.
  • Изучите другие алгоритмы обнаружения сообществ; хорошей альтернативой является алгоритм распространения меток.
  • Применить конвейер обработки данных для открытия клинических корпусов.
  • или же просто использовать совершенно другую область или отрасль.

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

Ссылки

  1. М. Панахи, OpenMed NER: Современные трансформеры с открытым исходным кодом, адаптированные к предметной области, для распознавания именованных сущностей в биомедицинской сфере на 12 общедоступных наборах данных (2025), https://arxiv.org/abs/2508.01630.
  2. С. Саху, Эффективное с точки зрения памяти обнаружение сообществ на больших графах с использованием взвешенных эскизов (2025), https://arxiv.org/abs/2411.02268.
  3. В. А. Трааг, Л. Вальтман, Н. Дж. ван Эк, От Лувена до Лейдена: обеспечение хорошо связанных сообществ (2019), https://arxiv.org/pdf/1810.08473.
  4. М. Фидлер, Алгебраическая связность графов (1973), Чехословацкий математический журнал (23) 298–305. https://snap.stanford.edu/class/cs224w-readings/fiedler73connectivity.pdf
  5. М. Фидлер, Свойство собственных векторов неотрицательных симметричных матриц и его применение к теории графов (1975), Чехословацкий математический журнал (25) 607–618. https://eudml.org/doc/12900
  6. NMM de Abreu, Старые и новые результаты по алгебраической связности графов (2007), Linear Algebra Appl. (423) 53–73. https://www.math.ucdavis.edu/~saito/data/graphlap/deabreu-algconn.pdf
  7. JC Urschel, LT Zikatanov, Спектральное бисекционирование графов и связность (2014), Прикладная линейная алгебра (449) 1–16. https://math.mit.edu/~urschel/publications/p2014.pdf
  8. С. Р. Беннетт, Линейная алгебра для науки о данных (2021) Веб-сайт книги

Источник: towardsdatascience.com

✅ Найденные теги: Графы, Клинические, новости, Обнаружение, Сообщества, Спектральное

ОСТАВЬТЕ СВОЙ КОММЕНТАРИЙ

Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

Молот перед логотипом технологической компании с цветными квадратами.
Четыре символа: золото, стилизованная эмблема, каменное кольцо и змей, кусающий свой хвост.
Человек играет на скрипке на улице перед кирпичной стеной.
Протест против дата-центров, плакаты: "Вы не можете пить данные", "Вода — это жизнь".
dummy-img
Силуэт лица с диаграммой связи на голове, символизирующий думы и идеи.
ideipro logotyp
Руки режут свежий хлеб на деревянной доске.
Женщина с красными волосами смотрит через металлическую сферу на фоне кирпичной стены.
Image Not Found
Молот перед логотипом технологической компании с цветными квадратами.

Microsoft заблокировала слово «Микрослоп» на своём Discord-сервере и ввела ограничения

Изображение, созданное нейросетью Похоже, Microsoft не очень нравится, когда её инвестиции в искусственный интеллект и активное использование нейросетей называют «слопом» — это стало понятно из-за одного запрета, введённого в официальном Discord-сервере сервиса Copilot. Участники указанного сервера обратили…

Мар 5, 2026
Четыре символа: золото, стилизованная эмблема, каменное кольцо и змей, кусающий свой хвост.

Есть здесь люди, которые искренне считают, что установив макс, они увеличили суверенитет страны?

«В виртуальных дискуссиях уже давно затрагивают тему мессенджера MAX, представляя его как просто еще одну платформу для коммуникации. Однако, как нам кажется, мало кто уделил должное внимание его корням, уровню безопасности и непонятным причинам, по которым он…

Мар 5, 2026
dummy-img

Спрос на хранилища для ИИ привёл к 24% росту прибыли производителей памяти NAND

Умные люди из аналитического агентства TrendForce провели анализ текущей ситуации производителей микросхем памяти NAND и пришли к выводу, что за последний квартал 2025 года их выручка прилично увеличилась, а показатели некоторых компаний прилично выделяются на фоне остальных.…

Мар 5, 2026
ideipro logotyp

Bitget Wallet интегрирует DT One для пополнения мобильной связи в более чем 170 странах

Bitget Wallet, приложение для повседневных финансов, объявил о партнерстве с DT One, которое позволит осуществлять пополнение мобильной связи напрямую внутри кошелька с использованием стейблкоинов, связывая ончейн-балансы с повседневными телеком-сервисами. Благодаря инфраструктуре DT One пользователи Bitget Wallet получают…

Мар 5, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых