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

Два алгоритма, которые неоднократно показывали стабильные результаты (AUC около 0,7–0,8), следующие:

Однако относительно недавний алгоритм, вдохновленный Теорией случайных матриц, был описан пару лет назад в статье PNAS талантливого Альфа Ли. У него намного лучшие показатели AUC - ~ 0,9!

Это сообщение блога Medium направлено на объяснение алгоритма, а также предоставляет пакет Python высокого уровня для его реализации.

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

1. Получение данных и их очистка (пропустите этот раздел, если знаете, как это сделать)

Нам понадобится 2 набора данных, а именно:

  • набор препаратов, которые связываются с определенной целью (в нашем случае ADR B1) (это составляет набор обучение и проверка)
  • набор лекарств, которые не связываются с конкретной целью (он составляет набор приманок)

Чтобы получить эти наборы данных, мы направляемся в базу данных ChEMBL и загружаем все лиганды для рецептора ADR1B. В качестве альтернативы набор данных находится на моем GitHub. Для набора приманки мы будем использовать лиганды от другого произвольного рецептора (хотя рецептор не имеет гомологии с ADRB1). Мы выберем лиганды из рецептора 5HT1A, поскольку он очень мало гомологичен ADRB1. В качестве альтернативы мы могли бы использовать набор случайных лигандов из ChEMBL, и это то, что сделано в статье PNAS.

После того, как мы получили CSV-файлы для нашего набора для обучения и проверки, а также набора приманок, мы загружаем его в Python и очищаем. Вот код для этого - не стесняйтесь копировать его, поскольку детали относительно неинтересны. Наиболее важно отметить, что для набора train_validation мы выбираем только молекулы, которые имеют сродство связывания менее 1000 нМ, т.е. эти молекулы являются связующими. Для набора-приманки аффинность связывания (с 5HT1A) не имеет значения, поскольку мы предполагаем, что аффинность связывания с ADR1B очень низкая (разумное предположение).

Давайте посмотрим на набор данных:

Если вы прокрутите вправо, вы увидите столбец, содержащий строку SMILES молекулы.

Наконец, выбираем соответствующие столбцы. На самом деле нам не нужны столбцы привязки, поскольку мы уже знаем, что весь набор train_test содержит только привязки, а набор приманок содержит только не привязки. Мы включаем аффинити-переменные просто для завершения (также мы можем использовать функцию sklearn train_test_split для удобного разделения набора train_test на наборы для обучения и тестирования / проверки).

Мы будем использовать столбец SMILES, чтобы создать молекулярный отпечаток каждой молекулы.

2. Создание молекулярного отпечатка пальца (при необходимости пропустите этот раздел)

По сути, мы хотим преобразовать молекулярную структуру в математический объект, чтобы провести на нем машинное обучение. Для этого мы можем использовать библиотеку хемоинформатики RDKit, преобразовав строку SMILES в структуру молекулы в битовый вектор Моргана длиной 2048. Мы можем думать о каждой записи, соответствующей отсутствие или наличие определенной химической субструктуры.

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

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

Наконец, мы разделяем наш набор train_test на набор подшивок train и набор подшивок test / validation.

3. Алгоритм RMT

3.1 Краткое напоминание о нашем формате данных

Это немного отличается от вашей канонической задачи машинного обучения, поэтому примите это к сведению. У нас есть:

  1. Набор поезд - он состоит из только переплетов (не содержит не переплетов)
  2. Набор тест / проверка - он также содержит только подшивки.
  3. Набор приманки - он содержит только молекулы, которые, как предполагается, не связывают.

3.2 Поиск корреляций между функциями в обучающей выборке

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

3.2.1 Масштабирование данных

Перед тем как это сделать, мы должны не забыть масштабировать все столбцы набора поездов так, чтобы они имели нулевое среднее значение и стандартное отклонение единицы. Дополнительным требованием является сохранение средних значений столбца и стандартного отклонения, так как мы будем использовать их также для масштабирования набора тестов / проверки и ложных ошибок. Функция StandardScaler в Sklearn сделает это. Затем мы используем средние значения столбца и стандартные значения для масштабирования обучающей матрицы, чтобы масштабировать тестирующие и ложные лиганды. Это тоже легко сделать. Наконец, мы удаляем столбцы во всех матрицах, которые соответствуют столбцам со стандартным отклонением 0 в обучающей матрице. Этот код сделает это:

3.2.2 Формирование корреляционной матрицы и ее диагонализация

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

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

Гамма = p / N описывает, насколько хорошо выбран набор данных. Напомним, что обучающая матрица имела размерность N x p. Положительный нижний индекс указывает, что мы рассматриваем эту скобку только в том случае, если она положительна. Это означает, что собственные значения, превышающие пороговое значение MP (показанное ниже), очень маловероятны в матрице случайной корреляции.

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

4. Классификация неизвестных лигандов как связывающих или не связывающих.

Теперь у нас есть связывающее векторное пространство нашего рецептора. Мы можем использовать это векторное пространство для классификации неизвестных лигандов. Метод прост.

4.1 Масштабирование неизвестных лигандов

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

4.2. Спроецируйте масштабированные неизвестные лиганды на пространство химических признаков и сравните расстояние от лиганда до его проекции.

Сделать это достаточно просто. См. ниже.

Для этого мы можем сделать простую функцию в коде:

Здесь dim_V - размерность векторного пространства V, определяемая пороговым значением MP. p - это количество функций нашего отпечатка пальца, а feature_vecs - это матрица, в которой столбцы являются собственными векторами корреляционной матрицы. Все довольно стандартно.

Самый важный вопрос: как выбрать эпсилон? Это произвольно, и на самом деле эпсилон может использоваться для настройки отношения ложноположительных / истинно положительных результатов и построения кривой ROC.

В качестве значения эпсилон по умолчанию мы выберем его так, чтобы 95% обучающей матрицы классифицировалось как связующие (что требует 5% -ного коэффициента ошибок в обучающем наборе).

На этом алгоритм RMT завершен, а ниже представлена ​​его реализация в сокращенном виде на Python.

5. Реализация алгоритма RMT на Python.

Мы сделаем реализацию ООП типа классификатора sklearn.

Параметр threshold_multiple предназначен для расширения или сжатия нашего векторного пространства путем изменения порога MP. Однако я не рекомендую изменять это значение, так как порог MP примерно оптимален.

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

6. Прогнозирование

Обратите внимание, что функция прогнозирования возвращает массив из 1 и 0, указывающий на прогноз привязки или отсутствия привязки. Поскольку мы знаем, что набор тестов / валидаций состоит только из связывателей, мы можем взять среднее значение test_preds, чтобы получить истинно положительный результат.

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

7. Постройте кривую ROC.

Кривая ROC отображает частоту ложных срабатываний по сравнению со скоростью истинных положительных результатов. У лучшего классификатора очень большая площадь под кривой (AUC). В модели должен быть какой-то параметр, который настраивает скорость fp / tp, и в нашем случае это параметр epsilon.

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

8. Улучшения для следующего раза (алгоритм RMD)

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

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

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

Этот алгоритм, получивший название Random Matrix Discriminant, превосходит RMT и все другие широко используемые методы, как показано ниже.

9. Следующие шаги

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

Не стесняйтесь связаться со мной в LinkedIn и сообщить, будете ли вы использовать этот код в своих исследованиях / работе.

А пока хорошего дня.

Лакш