Алгоритм Гиллеспи

редактировать

В теории вероятностей используется алгоритм Гиллеспи (или иногда Дуб -Алгоритм Гиллеспи ) генерирует статистически правильную траекторию (возможное решение) системы стохастических уравнений, для которой известны скорости реакции. Он был создан Джозефом Л. Дубом и другими (около 1945 г.), представлен Дэном Гиллеспи в 1976 г. и популяризирован в 1977 г. в статье, где он использует его для моделирования химических или биохимических системы реакций эффективно и точно с использованием ограниченной вычислительной мощности (см. стохастическое моделирование ). По мере того, как компьютеры становились быстрее, алгоритм использовался для моделирования все более сложных систем. Алгоритм особенно полезен для моделирования реакций внутри клеток, где количество реагентов невелико и отслеживание положения и поведения отдельных молекул возможно с вычислительной точки зрения. Математически это вариант динамического метода Монте-Карло и аналогичен кинетическим методам Монте-Карло. Он широко используется в биологии вычислительных систем.

Содержание
  • 1 История
  • 2 Идея алгоритма
  • 3 Алгоритм
  • 4 Примеры
    • 4.1 Обратимое связывание A и B с образованием Димеры AB
    • 4.2 Эпидемия SIR без жизненной динамики
  • 5 Дополнительная литература
История

Процесс, который привел к созданию алгоритма, включает несколько важных шагов. В 1931 году Андрей Колмогоров ввел дифференциальные уравнения, соответствующие эволюции во времени случайных скачкообразных процессов, которые сегодня известны как уравнения Колмогорова (процесс марковского скачка) (упрощенная версия известное как основное уравнение в естествознании). Именно Уильям Феллер в 1940 году нашел условия, при которых уравнения Колмогорова допускали (собственные) вероятности в качестве решений. В своей теореме I (работа 1940 г.) он устанавливает, что время до следующего скачка было экспоненциально распределено, и вероятность следующего события пропорциональна скорости. Таким образом, он установил связь уравнений Колмогорова со случайными процессами . Позднее Дуб (1942, 1945) распространил решения Феллера за пределы случая чисто скачкообразных процессов. Этот метод был реализован в компьютерах Дэвидом Джорджем Кендаллом (1950) с использованием компьютера Manchester Mark 1, а затем использован Морисом С. Бартлеттом (1953) в его исследования вспышек эпидемий. Гиллеспи (1977) получает алгоритм другим способом, используя физический аргумент.

Идея, лежащая в основе алгоритма

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

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

Алгоритм

Гиллеспи разработал две разные, но эквивалентные формулировки; прямой метод и метод первой реакции. Ниже приводится краткое описание шагов для запуска алгоритма (математические данные опущены):

  1. Инициализация : инициализация количества молекул в системе, констант реакций и генераторов случайных чисел.
  2. Шаг Монте-Карло : Генерировать случайные числа для определения следующей реакции, а также временного интервала. Вероятность выбора данной реакции пропорциональна количеству молекул субстрата, временной интервал экспоненциально распределен со средним значением 1 / RTOT {\ displaystyle 1 / R _ {\ mathrm {TOT}}}{\ displaystyle 1 / R _ {\ mathrm {TOT}}} .
  3. Обновить : увеличьте время на случайно сгенерированное время на шаге 2. Обновите количество молекул на основе произошедшей реакции.
  4. Итерация : вернитесь к шагу 2, если количество реагентов не равно нулю или моделирование время превышено.

Алгоритм требует больших вычислительных ресурсов, поэтому существует множество модификаций и адаптаций, в том числе метод следующей реакции (Гибсон и Брук), тау-прыжок, а также гибридные методы, в которых много реагентов моделируются с детерминированным поведением. Адаптированные методы, как правило, ставят под угрозу точность теории, лежащей в основе алгоритма, поскольку он связан с Основным уравнением, но предлагают разумные реализации для значительно улучшенных временных масштабов. Вычислительная стоимость точных версий алгоритма определяется классом связи реакционной сети. В слабосвязанных сетях количество реакций, на которые влияет любая другая реакция, ограничено небольшой константой. В сильно связанных сетях однократное срабатывание реакции в принципе может повлиять на все остальные реакции. Была разработана точная версия алгоритма с постоянным масштабированием для слабосвязанных сетей, позволяющая эффективно моделировать системы с очень большим количеством каналов реакции (Slepoy Thompson Plimpton 2008). Обобщенный алгоритм Гиллеспи, который учитывает немарковские свойства случайных биохимических событий с задержкой, был разработан Bratsun et al. 2005 и независимо Barrio et al. 2006 г., а также (Cai 2007). Подробности см. В цитируемых ниже статьях.

Составы с частичной предрасположенностью, независимо разработанные Рамасвами и соавт. (2009, 2010) и Indurkhya and Beal (2010) доступны для построения семейства точных версий алгоритма, вычислительные затраты которых пропорциональны количеству химических соединений в сети, а не (большему) количеству реакций. Эти формулировки могут снизить вычислительные затраты до масштабирования с постоянным временем для слабосвязанных сетей и масштабирования не более чем линейно с количеством видов для сильно связанных сетей. Также был предложен вариант частичной склонности обобщенного алгоритма Гиллеспи для реакций с задержками (Ramaswamy Sbalzarini 2011). Использование методов частичной склонности ограничивается элементарными химическими реакциями, то есть реакциями максимум с двумя различными реагентами. Каждую неэлементарную химическую реакцию можно эквивалентно разложить на набор элементарных за счет линейного (в порядке реакции) увеличения размера сети.

Примеры

Обратимое связывание A и B с образованием димеров AB

Простой пример может помочь объяснить, как работает алгоритм Гиллеспи. Рассмотрим систему молекул двух типов, A и B. В этой системе A и B обратимо связываются вместе с образованием димеров AB, так что возможны две реакции: либо A и B реагируют обратимо с образованием димера AB, либо димера AB диссоциирует на A и B. Константа скорости реакции для данной единственной молекулы A, реагирующей с данной единственной молекулой B, равна k D {\ displaystyle k _ {\ mathrm {D}}}{\ displaystyle k _ {\ mathrm {D}}} , а скорость реакции разрушения димера AB составляет k B {\ displaystyle k _ {\ mathrm {B}}}к _ {\ mathrm {B}} .

Если в момент времени t существует одна молекула каждого типа, то скорость образования димера составляет k D {\ displaystyle k _ {\ mathrm {D}}}{\ displaystyle k _ {\ mathrm {D}}} , а если есть n A {\ displaystyle n _ {\ mathrm {A}}}{\ displaystyle n _ {\ mathrm {A}}} молекул типа A и n B {\ displaystyle n _ {\ mathrm {B}}}{\ displaystyle n _ {\ mathrm {B}}} молекул типа B, скорость образования димера k D n A n B {\ displaystyle k_ {\ mathrm {D}} n _ {\ mathrm {A}} n _ {\ mathrm {B}}}{\ displaystyle k _ {\ mathrm {D}} n _ {\ mathrm {A}} n _ {\ mathrm {B}} } . Если есть n AB {\ displaystyle n _ {\ mathrm {AB}}}{\ displaystyle n_ { \ mathrm {AB}}} димеры, то скорость диссоциации димера составляет k B n AB {\ displaystyle k _ {\ mathrm {B }} n _ {\ mathrm {AB}}}{\ displaystyle k _ {\ mathrm {B}} n _ {\ mathrm {AB}}} .

Общая скорость реакции, RTOT {\ displaystyle R _ {\ mathrm {TOT}}}{\ displaystyle R _ {\ mathrm {TOT}}} , в момент времени t тогда определяется как

RTOT = К D N A N B + К B N AB {\ Displaystyle R _ {\ mathrm {TOT}} = k _ {\ mathrm {D}} n _ {\ mathrm {A}} n _ {\ mathrm {B} } + k _ {\ mathrm {B}} n _ {\ mathrm {AB}}}{\ displaystyle R _ {\ mathrm {TOT}} = k _ {\ mathrm {D}} n _ {\ mathrm {A}} n _ {\ mathrm {B}} + k _ {\ mathrm {B}} n _ {\ mathrm {AB}}}

Итак, мы теперь описали простую модель с двумя реакциями. Это определение не зависит от алгоритма Гиллеспи. Теперь мы опишем, как применить алгоритм Гиллеспи к этой системе.

В алгоритме мы продвигаемся вперед во времени в два этапа: вычисляем время до следующей реакции и определяем, какая из возможных реакций будет следующей. Предполагается, что реакции являются полностью случайными, поэтому, если скорость реакции в момент времени t равна RTOT {\ displaystyle R _ {\ mathrm {TOT}}}{\ displaystyle R _ {\ mathrm {TOT}}} , то время δt до следующего реакция происходит - случайное число, полученное из функции экспоненциального распределения со средним значением 1 / RTOT {\ displaystyle 1 / R _ {\ mathrm {TOT}}}{\ displaystyle 1 / R _ {\ mathrm {TOT}}} . Таким образом, мы продвигаем время от t к t + δt.

График зависимости количества молекул A (черная кривая) и димеров AB от времени. Поскольку мы начали с 10 молекул A и B в момент времени t = 0, количество молекул B всегда равно количеству молекул A, поэтому оно не отображается.

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

вероятность того, что реакция P (A + B ⟶ AB) = k D n A n B / R ТОТ {\ displaystyle P ({\ ce {{A} + B ->AB}}) = k_ {D} n_ {A} n_ {B} / R _ {{\ ce {TOT}}}}{\displaystyle P({\ce {{A}+ B ->AB}}) = k_ {D} n_ {A} n_ {B} / R _ {{\ ce {TOT}}}}

Вероятность того, что следующей реакцией будет диссоциация димера AB, составляет всего 1 минус эта вероятность. мы либо формируем димер, уменьшая n A {\ displaystyle n _ {\ mathrm {A}}}{\ displaystyle n _ {\ mathrm {A}}} и n B {\ displaystyle n _ {\ mathrm {B}}}{\ displaystyle n _ {\ mathrm {B}}} на единицу и увеличьте n AB {\ displaystyle n _ {\ mathrm {AB}}}{\ displaystyle n_ { \ mathrm {AB}}} на единицу, или мы разделим димер и увеличим n A {\ displaystyle n _ {\ mathrm {A}}}{\ displaystyle n _ {\ mathrm {A}}} и n B {\ displaystyle n _ {\ mathrm {B}} }{\ displaystyle n _ {\ mathrm {B}}} на единицу и уменьшите n AB {\ displaystyle n _ {\ mathrm {AB}}}{\ displaystyle n_ { \ mathrm {AB}}} на единицу.

Теперь у нас есть время опережения до t + δt, и мы провели одну реакцию. Алгоритм Гиллеспи просто повторяет эти два шага столько раз, сколько необходимо, чтобы моделировать систему, сколько мы хотим (то есть столько реакций). Результат моделирования Гиллеспи, который начинается с n A = n B = 10 {\ displaystyle n _ {\ mathrm {A}} = n _ {\ mathrm {B}} = 10}{\ displaystyle n _ {\ mathrm {A}} = n _ {\ mathrm {B}} = 10} и n AB = 0 {\ displaystyle n _ {\ mathrm {AB}} = 0}{\ displaystyle n _ {\ mathrm {AB}} = 0} при t = 0, и где k D = 2 {\ displaystyle k _ {\ mathrm {D} } = 2}{\ displaystyle k _ {\ mathrm {D}} = 2} и k B = 1 {\ displaystyle k _ {\ mathrm {B}} = 1}{\ displaystyle k _ {\ mathrm {B}} = 1} , показано справа. Для этих значений параметров в среднем имеется 8 n AB {\ displaystyle n _ {\ mathrm {AB}}}{\ displaystyle n_ { \ mathrm {AB}}} димеров и 2 димера A и B, но из-за небольшого количества колебаний молекул вокруг эти значения большие. Алгоритм Гиллеспи часто используется для изучения систем, в которых эти колебания важны.

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

Эпидемия SIR без динамики жизнедеятельности

Модель SIR - это классическое биологическое описание того, как определенные болезни проникают в популяцию фиксированного размера. В простейшей форме существует N {\ displaystyle N}N членов совокупности, при этом каждый член может находиться в одном из трех состояний - восприимчивый, инфицированный или выздоровевший - в любой момент в время, и каждый такой член необратимо переходит через эти состояния в соответствии с ориентированным графом ниже. Мы можем обозначить количество уязвимых членов как n S {\ displaystyle n_ {S}}{\ displaystyle n_ {S}} , количество зараженных членов как n I {\ displaystyle n_ {I}}{\ displaystyle n_ {I}} , а количество восстановленных элементов - как n R {\ displaystyle n_ {R}}{\ displaystyle n_ {R}} . Следовательно, мы также можем заключить, что N = n S + n I + n R {\ displaystyle N = n_ {S} + n_ {I} + n_ {R}}{\ displaystyle N = n_ {S} + n_ {I} + n_ {R}} для любого момента времени.

S IR graph.png

Далее, данный восприимчивый член перейдет в зараженное состояние, войдя в контакт с любым из n I {\ displaystyle n_ {I}}{\ displaystyle n_ {I}} зараженных членов, и таким образом заражение происходит с коэффициент α n I {\ displaystyle \ alpha n_ {I}}{\ displaystyle \ alpha n_ {I}} (размерность обратного времени). Данный член зараженного состояния выздоравливает вне зависимости от любого из трех состояний, что определяется показателем β (также с размерностями обратного времени). По этой базовой схеме можно построить следующую нелинейную систему.

Единственная реализация эпидемии SIR, полученная с помощью реализации алгоритма Гиллеспи и численного решения системы обыкновенных дифференциальных уравнений (пунктирная линия).
dn S dt = - α n SV n I {\ displaystyle { \ frac {dn_ {S}} {dt}} = - {\ frac {\ alpha n_ {S}} {V}} n_ {I}}{\ displaystyle {\ frac {dn_ {S}} {dt}} = - {\ frac {\ alpha n_ {S} } {V}} n_ {I}} ,
dn I dt = (α n SV - β) n I {\ displaystyle {\ frac {dn_ {I}} {dt}} = \ left ({\ frac {\ alpha n_ {S}} {V}} - \ beta \ right) n_ {I}}{\ displaystyle {\ frac {dn_ {I}} {dt}} = \ left ({\ frac {\ alpha n_ {S}} {V}} - \ beta \ right) n_ { I}} ,
dn R dt = β n I {\ displaystyle {\ frac {dn_ {R}} {dt}} = \ beta n_ {I}}{\ displaystyle {\ frac {dn_ {R}} {dt}} = \ beta n_ {I}} .

Эта система не имеет явного аналитического решения. Один из подходов может заключаться в использовании алгоритма Гиллеспи, многократном моделировании системы и использовании метода регрессии, такого как метод наименьших квадратов, для подбора полинома по всем траекториям. По мере увеличения количества траекторий такая полиномиальная регрессия будет асимптотически вести себя как численное решение (пунктирные линии). В дополнение к оценке решения трудноразрешимой проблемы, такой как эпидемия SIR, стохастический характер каждой траектории позволяет вычислять статистику, отличную от E [n | т] {\ Displaystyle \ mathrm {E} [п | т]}{\ displaystyle \ mathrm {E} [n | t]} . При запуске сценария, приведенного ниже, иногда получаются реализации эпидемии SIR, которые резко отличаются от численного решения. Например, когда все люди излечиваются (случайно) в начале эпидемии.

Смоделированная траектория, представленная на рисунке выше, получена с помощью следующей реализации Python алгоритма Гиллеспи. Кроме того, для получения численного решения системы дифференциальных уравнений вызывается решатель ODE из SciPy.

.

import math import random # Входные параметры ################### # int; общая численность населения N = 350 # float; максимальное прошедшее время T = 100.0 # float; время начала t = 0.0 # float; пространственный параметр V = 100.0 # float; скорость заражения после контакта _alpha = 10.0 # float; скорость лечения _beta = 10.0 # int; исходная инфицированная популяция n_I = 1 ###################################### # Вычислительная чувствительность Население, установить восстановленное равным нулю n_S = N - n_I n_R = 0 # Инициализировать список результатов SIR_data = SIR_data.append ((t, n_S, n_I, n_R)) # Основной цикл while t < T: if n_I == 0: break w1 = _alpha * n_S * n_I / V w2 = _beta * n_I W = w1 + w2 # generate exponentially distributed random variable dt # using inverse transform sampling dt = -math.log(1 - random.uniform(0.0, 1.0)) / W t = t + dt if random.uniform(0.0, 1.0) < w1 / W: n_S = n_S - 1 n_I = n_I + 1 else: n_I = n_I - 1 n_R = n_R + 1 SIR_data.append((t, n_S, n_I, n_R)) with open("SIR_data.txt", "w+") as fp: fp.write("\n".join("%f %i %i %i" % x for x in SIR_data)) from scipy.integrate import odeint import numpy as np # Numerical solution using an ordinary differential equation solver ts = np.linspace(0, 2, num=200) initial_S_I_R = (N - 1, 1, 0) def differential_SIR(initial_S_I_R, t, _alpha, _beta, V): n_S, n_I, n_R = initial_S_I_R dS_dt = -_alpha * n_S / V * n_I dI_dt = (_alpha * n_S / V - _beta) * n_I dR_dt = _beta * n_I return dS_dt, dI_dt, dR_dt solution = odeint(differential_SIR, initial_S_I_R, ts, args=(_alpha, _beta, V))
Дополнительная литература
Последняя правка сделана 2021-05-21 08:38:32
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте