Анализ и моделирование цепей Маркова с помощью Python

Вячеслав Федоров (гр. 20353)

Теория

Це́пь Ма́ркова — последовательность случайных событий с конечным или счётным числом исходов, где вероятность наступления каждого события зависит только от состояния, достигнутого в предыдущем событии. Характеризуется тем свойством, что, говоря нестрого, при фиксированном настоящем будущее независимо от прошлого. Названа в честь А. А. Маркова (старшего), который впервые ввёл это понятие в работе 1906 года.

Определение

Последовательность случайных величин $\{X_n\}_{n \geqslant 0}$ называется простой цепью Маркова (с дискретным временем), если:

$$\mathbb{P}(X_{n+1} = i_{n+1} \mid X_n = i_n, X_{n-1} = i_{n-1},\ldots, X_0 = i_0) = \mathbb{P}(X_{n+1} = i_{n+1} \mid X_n = i_n).$$

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

Область значений случайных величин $\{X_n\}$ называется простра́нством состоя́ний цепи, а номер $n$ — номером шага.

Переходная матрица и однородные цепи

Матрица $P{(n)}$, где: $P_{ij}{(n)} \equiv \mathbb{P}(X_{n+1} = j \mid X_n = i)$ называется ма́трицей перехо́дных вероя́тностей на $n$-м шаге, а вектор $\mathbf{p} = (p_1,p_2,\ldots)^{\top}$, где: $p_i \equiv \mathbb{P}(X_0 = i)$ — нача́льным распределе́нием цепи Маркова.

Очевидно, матрица переходных вероятностей является стохастической справа, то есть: $\sum\limits_{j} P_{ij}(n) = 1, \quad \forall n \in \mathbb{N}$.

Цепь Маркова называется одноро́дной, если матрица переходных вероятностей не зависит от номера шага, то есть: $P_{ij}{(n)} = P_{ij},\quad \forall n \in \mathbb{N}$. В противном случае цепь Маркова называется неоднородной. В дальнейшем будем предполагать, что имеем дело с однородными цепями Маркова.

Конечномерные распределения и матрица перехода за n шагов

Из свойств условной вероятности и определения однородной цепи Маркова получаем:

$$\mathbb{P}(X_{n} = i_{n} , \ldots, X_0 = i_0) = P_{i_{n-1},i_n} \cdots P_{i_0,i_1} P_{i_0},$$

откуда вытекает специальный случай уравнения Колмогорова — Чепмена:

$$\mathbb{P}(X_n = i_n \mid X_0 = i_0) = (P^n)_{i_0,i_n},$$

то есть матрица переходных вероятностей за $n$ шагов однородной цепи Маркова есть $n$ - я степень матрицы переходных вероятностей за 1 шаг. Наконец:

$$\mathbb{P}(X_n = i_n) = \left((P^T)^n \mathbf{p}\right)_{i_n}.$$

Практика

Генерация текста на основе данных - модель, основанная на Марковской цепи при помощи Python.

Цепи Маркова для автоматической генерации текста

Логика программы:

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

Опытные программисты абсолютно справедливо сделают нам замечание: не нужно писать новый алгоритм для обработки цепей Маркова, а использовать какую-нибудь готовую библиотеку типа Markovify.

Результат

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

Литература и статьи