diff --git a/lectures/_static/lecture_specific/finite_markov/figures.ipynb b/lectures/_static/lecture_specific/finite_markov/figures.ipynb new file mode 100644 index 0000000..7b50f28 --- /dev/null +++ b/lectures/_static/lecture_specific/finite_markov/figures.ipynb @@ -0,0 +1,193 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b5a640be-e2e4-4841-bcda-95f6660fd9fe", + "metadata": {}, + "source": [ + "# Figures for Markov Chain II" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f8a64d7b-2ffd-4974-a1dd-ec14d8e44102", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting graphviz\n", + " Obtaining dependency information for graphviz from https://files.pythonhosted.org/packages/00/be/d59db2d1d52697c6adc9eacaf50e8965b6345cc143f671e1ed068818d5cf/graphviz-0.20.3-py3-none-any.whl.metadata\n", + " Downloading graphviz-0.20.3-py3-none-any.whl.metadata (12 kB)\n", + "Downloading graphviz-0.20.3-py3-none-any.whl (47 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.1/47.1 kB\u001b[0m \u001b[31m1.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: graphviz\n", + "Successfully installed graphviz-0.20.3\n" + ] + } + ], + "source": [ + "!pip install graphviz" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "43d55bea-fd00-4583-8d89-830151b6c36c", + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Digraph" + ] + }, + { + "cell_type": "markdown", + "id": "4185ae75-3a1c-4f89-ad74-1950d344ba56", + "metadata": {}, + "source": [ + "## Irreducibility" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "53a8bb26-a6e8-421c-abcc-535031d5a69b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'mc_irreducibility1.png'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dot = Digraph(format='png')\n", + "dot.attr(rankdir='LR')\n", + "dot.node(\"贫穷\")\n", + "dot.node(\"中产\")\n", + "dot.node(\"富裕\")\n", + "\n", + "dot.edge(\"贫穷\", \"贫穷\", label=\"0.9\")\n", + "dot.edge(\"贫穷\", \"中产\", label=\"0.1\")\n", + "dot.edge(\"中产\", \"贫穷\", label=\"0.4\")\n", + "dot.edge(\"中产\", \"中产\", label=\"0.4\")\n", + "dot.edge(\"中产\", \"富裕\", label=\"0.2\")\n", + "dot.edge(\"富裕\", \"贫穷\", label=\"0.1\")\n", + "dot.edge(\"富裕\", \"中产\", label=\"0.1\")\n", + "dot.edge(\"富裕\", \"富裕\", label=\"0.8\")\n", + "\n", + "dot\n", + "dot.render(filename='mc_irreducibility1')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4e96fd64-a1ab-4a6e-a5d6-a64767f6181e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'mc_irreducibility2.png'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dot = Digraph(format='png')\n", + "dot.attr(rankdir='LR')\n", + "dot.node(\"贫穷\")\n", + "dot.node(\"中产\")\n", + "dot.node(\"富裕\")\n", + "\n", + "dot.edge(\"贫穷\", \"贫穷\", label=\"1.0\")\n", + "dot.edge(\"中产\", \"贫穷\", label=\"0.1\")\n", + "dot.edge(\"中产\", \"中产\", label=\"0.8\")\n", + "dot.edge(\"中产\", \"富裕\", label=\"0.1\")\n", + "dot.edge(\"富裕\", \"中产\", label=\"0.2\")\n", + "dot.edge(\"富裕\", \"富裕\", label=\"0.8\")\n", + "\n", + "dot\n", + "dot.render(filename='mc_irreducibility2')" + ] + }, + { + "cell_type": "markdown", + "id": "1d7441a9-7753-4922-8276-3d26a26798cf", + "metadata": {}, + "source": [ + "## Example 4" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5f9c4db0-812a-4131-803f-024ae5b61772", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'hamilton_graph.png'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dot = Digraph(format='png')\n", + "dot.attr(rankdir='LR')\n", + "dot.node(\"ng\")\n", + "dot.node(\"mr\")\n", + "dot.node(\"sr\")\n", + "\n", + "dot.edge(\"ng\", \"ng\", label=\"0.971\")\n", + "dot.edge(\"ng\", \"mr\", label=\"0.029\")\n", + "dot.edge(\"mr\", \"ng\", label=\"0.145\")\n", + "\n", + "dot.edge(\"mr\", \"mr\", label=\"0.778\")\n", + "dot.edge(\"mr\", \"sr\", label=\"0.077\")\n", + "dot.edge(\"sr\", \"mr\", label=\"0.508\")\n", + "\n", + "dot.edge(\"sr\", \"sr\", label=\"0.492\")\n", + "dot\n", + "\n", + "dot.render(filename='hamilton_graph')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "quantecon", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lectures/_static/lecture_specific/finite_markov/hamilton_grah b/lectures/_static/lecture_specific/finite_markov/hamilton_grah new file mode 100644 index 0000000..ca9ddc7 --- /dev/null +++ b/lectures/_static/lecture_specific/finite_markov/hamilton_grah @@ -0,0 +1,13 @@ +digraph { + rankdir=LR + ng + mr + sr + ng -> ng [label=0.971] + ng -> mr [label=0.029] + mr -> ng [label=0.145] + mr -> mr [label=0.778] + mr -> sr [label=0.077] + sr -> mr [label=0.508] + sr -> sr [label=0.492] +} diff --git a/lectures/_static/lecture_specific/finite_markov/hamilton_graph b/lectures/_static/lecture_specific/finite_markov/hamilton_graph new file mode 100644 index 0000000..ca9ddc7 --- /dev/null +++ b/lectures/_static/lecture_specific/finite_markov/hamilton_graph @@ -0,0 +1,13 @@ +digraph { + rankdir=LR + ng + mr + sr + ng -> ng [label=0.971] + ng -> mr [label=0.029] + mr -> ng [label=0.145] + mr -> mr [label=0.778] + mr -> sr [label=0.077] + sr -> mr [label=0.508] + sr -> sr [label=0.492] +} diff --git a/lectures/_static/lecture_specific/finite_markov/hamilton_graph.png b/lectures/_static/lecture_specific/finite_markov/hamilton_graph.png index 0086d44..189317e 100644 Binary files a/lectures/_static/lecture_specific/finite_markov/hamilton_graph.png and b/lectures/_static/lecture_specific/finite_markov/hamilton_graph.png differ diff --git a/lectures/_static/lecture_specific/finite_markov/mc_irreducibility1 b/lectures/_static/lecture_specific/finite_markov/mc_irreducibility1 new file mode 100644 index 0000000..d3b8f0d --- /dev/null +++ b/lectures/_static/lecture_specific/finite_markov/mc_irreducibility1 @@ -0,0 +1,14 @@ +digraph { + rankdir=LR + "贫穷" + "中产" + "富裕" + "贫穷" -> "贫穷" [label=0.9] + "贫穷" -> "中产" [label=0.1] + "中产" -> "贫穷" [label=0.4] + "中产" -> "中产" [label=0.4] + "中产" -> "富裕" [label=0.2] + "富裕" -> "贫穷" [label=0.1] + "富裕" -> "中产" [label=0.1] + "富裕" -> "富裕" [label=0.8] +} diff --git a/lectures/_static/lecture_specific/finite_markov/mc_irreducibility1.png b/lectures/_static/lecture_specific/finite_markov/mc_irreducibility1.png index 8bd9af3..a511472 100644 Binary files a/lectures/_static/lecture_specific/finite_markov/mc_irreducibility1.png and b/lectures/_static/lecture_specific/finite_markov/mc_irreducibility1.png differ diff --git a/lectures/_static/lecture_specific/finite_markov/mc_irreducibility2 b/lectures/_static/lecture_specific/finite_markov/mc_irreducibility2 new file mode 100644 index 0000000..19bd78c --- /dev/null +++ b/lectures/_static/lecture_specific/finite_markov/mc_irreducibility2 @@ -0,0 +1,12 @@ +digraph { + rankdir=LR + "贫穷" + "中产" + "富裕" + "贫穷" -> "贫穷" [label=1.0] + "中产" -> "贫穷" [label=0.1] + "中产" -> "中产" [label=0.8] + "中产" -> "富裕" [label=0.1] + "富裕" -> "中产" [label=0.2] + "富裕" -> "富裕" [label=0.8] +} diff --git a/lectures/_static/lecture_specific/finite_markov/mc_irreducibility2.png b/lectures/_static/lecture_specific/finite_markov/mc_irreducibility2.png index 1795981..78809f5 100644 Binary files a/lectures/_static/lecture_specific/finite_markov/mc_irreducibility2.png and b/lectures/_static/lecture_specific/finite_markov/mc_irreducibility2.png differ diff --git a/lectures/finite_markov.md b/lectures/finite_markov.md index d5f297e..ee4f31c 100644 --- a/lectures/finite_markov.md +++ b/lectures/finite_markov.md @@ -3,8 +3,10 @@ jupytext: text_representation: extension: .md format_name: myst + format_version: 0.13 + jupytext_version: 1.16.4 kernelspec: - display_name: Python 3 + display_name: Python 3 (ipykernel) language: python name: python3 --- @@ -26,32 +28,31 @@ kernelspec: 除了Anaconda中已有的库外,本讲座还需要以下库: -```{code-cell} ipython ---- -tags: [hide-output] ---- +```{code-cell} ipython3 +:tags: [hide-output] + !pip install quantecon ``` ## 概述 -马尔可夫链是最有用的随机过程类别之一,因为它们: +马尔可夫链是一类最实用的随机过程,它们之所以重要是因为: -* 简单、灵活,并且有许多优雅的理论支持 -* 对于建立随机动态模型的直观认识很有价值 -* 本身就是定量建模的核心 +* 它们结构简单且灵活,同时有着丰富而优雅的理论基础 +* 它们能帮助我们直观理解随机动态模型 +* 它们在定量建模中扮演着核心角色 -你会在经济学和金融学的许多基础模型中发现它们。 +在经济学和金融学领域,许多基础模型都采用了马尔可夫链。 -在本讲座中,我们将回顾马尔可夫链的一些理论。 +本讲座将回顾马尔可夫链的基本理论。 -我们还将介绍[QuantEcon.py](https://quantecon.org/quantecon-py/)中提供的一些用于处理马尔可夫链的高质量程序。 +我们还将介绍[QuantEcon.py](https://quantecon.org/quantecon-py/)库中提供的一些处理马尔可夫链的高效工具。 -所需的预备知识是基础概率论和线性代数。 +学习本讲座需要具备基本的概率论和线性代数知识。 -让我们从一些标准导入开始: +首先,让我们导入需要的库: -```{code-cell} ipython +```{code-cell} ipython3 import matplotlib.pyplot as plt import matplotlib as mpl FONTPATH = "fonts/SourceHanSerifSC-SemiBold.otf" @@ -66,7 +67,7 @@ from mpl_toolkits.mplot3d import Axes3D ## 定义 -以下概念是基础性的。 +让我们先介绍一些基本概念。 (finite_dp_stoch_mat)= ### {index}`随机矩阵 ` @@ -88,15 +89,15 @@ $P$ 的每一行都可以被视为在 $n$ 个可能结果上的概率质量函 ```{index} single: Finite Markov Chains ``` -随机矩阵和马尔可夫链之间有着密切的联系。 +随机矩阵与马尔可夫链有着紧密的关系。 -首先,令 $S$ 为具有 $n$ 个元素 $\{x_1, \ldots, x_n\}$ 的有限集。 +让我们考虑一个有限集 $S$,它包含 $n$ 个元素 $\{x_1, \ldots, x_n\}$。 -集合 $S$ 被称为**状态空间**,而 $x_1, \ldots, x_n$ 被称为**状态值**。 +我们称 $S$ 为**状态空间**,其中的元素 $x_1, \ldots, x_n$ 称为**状态**。 -**马尔可夫链** $\{X_t\}$ 是定义在状态空间 $S$ 上的一系列具有**马尔可夫性质**的随机变量。 +**马尔可夫链** $\{X_t\}$ 是一个在状态空间 $S$ 上取值的随机变量序列,它具有**马尔可夫性质**。 -这意味着,对于任意时刻 $t$ 和任意状态 $y \in S$, +马尔可夫性质表明,对于任意时间 $t$ 和任意状态 $y \in S$, ```{math} :label: fin_markov_mp @@ -105,9 +106,9 @@ $P$ 的每一行都可以被视为在 $n$ 个可能结果上的概率质量函 = \mathbb P \{ X_{t+1} = y \,|\, X_t, X_{t-1}, \ldots \} ``` -换句话说,知道当前状态就足以确定未来状态的概率。 +换句话说,只要知道当前状态,就足以预测未来状态的概率分布,而不需要知道过去的历史。 -特别地,马尔可夫链的动态完全由以下值集确定 +具体来说,马尔可夫链的整个动态行为完全由以下条件概率集合决定 ```{math} :label: mpp @@ -116,41 +117,41 @@ P(x, y) := \mathbb P \{ X_{t+1} = y \,|\, X_t = x \} \qquad (x, y \in S) ``` -根据构造, +根据定义, -* $P(x, y)$ 是在一个时间单位(一步)内从 $x$ 到 $y$ 的概率 -* $P(x, \cdot)$ 是在给定 $X_t = x$ 条件下 $X_{t+1}$ 的条件分布 +* $P(x, y)$ 表示系统在一个时间步内从状态 $x$ 转移到状态 $y$ 的概率 +* $P(x, \cdot)$ 表示当当前状态为 $X_t = x$ 时,下一状态 $X_{t+1}$ 的条件概率分布 -我们可以将 $P$ 视为一个随机矩阵,其中 +我们可以将这些转移概率组织成一个随机矩阵 $P$,其中 $$ P_{ij} = P(x_i, x_j) \qquad 1 \leq i, j \leq n $$ -反过来,如果我们有一个随机矩阵 $P$,我们可以生成一个马尔可夫链 $\{X_t\}$,方法如下: +反过来,给定一个随机矩阵 $P$,我们可以构造一个马尔可夫链 $\{X_t\}$,具体方法是: -* 从边际分布 $\psi$ 中抽取 $X_0$ -* 对每个 $t = 0, 1, \ldots$, 从 $P(X_t,\cdot)$ 中抽取 $X_{t+1}$ +* 从某个初始分布 $\psi$ 中抽取初始状态 $X_0$ +* 对于每个时间 $t = 0, 1, \ldots$,根据条件分布 $P(X_t,\cdot)$ 随机生成下一状态 $X_{t+1}$ -根据构造,所得到的过程满足 {eq}`mpp`。 +通过这种构造方式,我们得到的随机过程自然满足马尔可夫性质 {eq}`mpp`。 (mc_eg1)= ### 示例1 -考虑一个工人,在任何给定时间 $t$,要么失业(状态0)要么就业(状态1)。 +让我们考虑一个工人的就业状态,在任何给定时间 $t$,该工人要么处于失业状态(状态0)要么处于就业状态(状态1)。 -假设在一个月的时间段内, +假设在一个月的时间内: -1. 失业工人找到工作的概率为 $\alpha \in (0, 1)$。 -1. 就业工人失去工作并变成失业的概率为 $\beta \in (0, 1)$。 +1. 一个失业工人找到工作的概率是 $\alpha \in (0, 1)$。 +2. 一个就业工人失去工作的概率是 $\beta \in (0, 1)$。 -就马尔可夫模型而言,我们有 +在马尔可夫链模型中,我们有: -* $S = \{ 0, 1\}$ -* $P(0, 1) = \alpha$ 且 $P(1, 0) = \beta$ +* 状态空间 $S = \{ 0, 1\}$ +* 转移概率 $P(0, 1) = \alpha$ 和 $P(1, 0) = \beta$ -我们可以用矩阵形式写出转移概率: +我们可以将这些转移概率表示为一个矩阵: ```{math} :label: p_unempemp @@ -164,19 +165,18 @@ P \right) ``` -一旦我们有了 $\alpha$ 和 $\beta$ 的值,我们就可以解决一系列问题,比如 - -* 失业的平均持续时间是多少? +有了 $\alpha$ 和 $\beta$ 的值后,我们可以回答许多有趣的问题,例如: -* 从长期来看,一个工人处于失业状态的时间比例是多少? -* 在就业的条件下,未来12个月内至少失业一次的概率是多少? +* 一个人平均会失业多长时间? +* 长期来看,一个工人有多大比例的时间处于失业状态? +* 如果一个人现在有工作,那么在未来一年内他至少失业一次的概率是多少? -我们将在下面讨论这些应用。 +我们将在后续章节中详细探讨这些应用。 (mc_eg2)= ### 示例2 -根据美国失业数据,Hamilton {cite}`Hamilton2005` 估算出如下随机矩阵 +Hamilton {cite}`Hamilton2005` 基于美国失业数据估计了以下随机矩阵 $$ P = @@ -189,21 +189,20 @@ P = \right) $$ -其中 +在这个模型中: -* 频率为每月 -* 第一个状态代表"正常增长" -* 第二个状态代表"轻度衰退" -* 第三个状态代表"严重衰退" +* 数据频率是月度的 +* 状态1表示"正常增长"阶段 +* 状态2表示"轻度衰退"阶段 +* 状态3表示"严重衰退"阶段 -例如,该矩阵告诉我们,当状态为正常增长时,下个月仍然是正常增长的概率为0.97。 +从矩阵中我们可以看出,如果经济当前处于正常增长阶段,那么下个月仍然保持正常增长的概率高达0.971。 -一般来说,主对角线上的较大值表明过程 $\{ X_t \}$ 具有持续性。 +注意矩阵主对角线上的元素普遍较大,这表明经济状态往往具有一定的持续性——当经济处于某一特定状态时,它倾向于在该状态停留一段时间。 -这个马尔可夫过程也可以用一个有向图表示,边上标注着转移概率 +这个马尔可夫链也可以通过下面的有向图来直观表示,图中的箭头上标注了相应的转移概率: ```{figure} /_static/lecture_specific/finite_markov/hamilton_graph.png - ``` 这里"ng"表示正常增长,"mr"表示温和衰退,等等。 @@ -213,30 +212,30 @@ $$ ```{index} single: Markov Chains; Simulation ``` -回答关于马尔可夫链问题的一个自然方法是对其进行模拟。 +研究马尔可夫链问题的一种直观方法是通过模拟。 -(要近似事件 $E$ 发生的概率,我们可以进行多次模拟并统计 $E$ 发生的次数比例)。 +(如果我们想估计某个事件 $E$ 发生的概率,可以进行大量模拟,然后计算事件 $E$ 在这些模拟中出现的频率)。 -[QuantEcon.py](http://quantecon.org/quantecon-py)提供了模拟马尔可夫链的良好功能。 +[QuantEcon.py](http://quantecon.org/quantecon-py)库提供了强大的马尔可夫链模拟工具。 -* 高效,并捆绑了许多其他用于处理马尔可夫链的实用程序。 +* 这些工具不仅高效,还包含了许多处理马尔可夫链的实用函数。 -然而,编写我们自己的程序也是一个很好的练习 —— 让我们先来做这个,然后再回到[QuantEcon.py](http://quantecon.org/quantecon-py)中的方法。 +不过,自己动手编写模拟程序也是一个很好的学习过程——我们先尝试自己实现,然后再介绍[QuantEcon.py](http://quantecon.org/quantecon-py)的方法。 -在这些练习中,我们将状态空间设定为 $S = 0,\ldots, n-1$。 +在接下来的练习中,我们将状态空间定义为 $S = 0,\ldots, n-1$。 -### 自行编写程序 +### 自己编写模拟程序 -要模拟马尔可夫链,我们需要其随机矩阵 $P$ 和一个边际概率分布 $\psi$,用于抽取 $X_0$ 的一个实现值。 +要模拟马尔可夫链,我们需要两个基本要素:转移概率矩阵 $P$ 和一个初始概率分布 $\psi$,用来确定初始状态 $X_0$。 -马尔可夫链的构建过程如上所述。重复如下: +马尔可夫链的模拟过程可以概括为: -1. 在时间 $t=0$ 时,从 $\psi$ 中抽取 $X_0$ 的一个实现值。 -1. 在之后的每个时间 $t$,从 $P(X_t, \cdot)$ 中抽取新状态 $X_{t+1}$ 的一个实现值。 +1. 在初始时刻 $t=0$,根据分布 $\psi$ 随机生成初始状态 $X_0$。 +2. 对于每个后续时刻 $t$,根据当前状态 $X_t$ 对应的转移概率行 $P(X_t, \cdot)$ 随机生成下一个状态 $X_{t+1}$。 -为了实现这个模拟过程,我们需要一个从离散分布中生成抽样的方法。 +为了实现这个过程,我们需要一种从离散概率分布中抽样的方法。 -对于这个任务,我们将使用来自 [QuantEcon](http://quantecon.org/quantecon-py) 的 `random.draw`,其使用方法如下: +我们将使用 [QuantEcon](http://quantecon.org/quantecon-py) 库中的 `random.draw` 函数,它的用法如下: ```{code-cell} ipython3 ψ = (0.3, 0.7) # {0, 1}上的概率 @@ -244,11 +243,11 @@ cdf = np.cumsum(ψ) # 转换为累积分布 qe.random.draw(cdf, 5) # 从ψ中生成5个独立抽样 ``` -我们将把代码写成一个接受以下三个参数的函数 +我们将编写一个函数,它接受以下三个参数: -* 一个随机矩阵 `P` -* 一个初始状态 `init` -* 一个正整数 `sample_size` 表示函数应返回的时间序列长度 +* 一个随机矩阵 `P`(表示转移概率矩阵) +* 一个初始概率分布 `ψ_0`(用于确定初始状态) +* 一个正整数 `sample_size`(表示要生成的马尔可夫链时间序列长度) ```{code-cell} ipython3 def mc_sample_path(P, ψ_0=None, sample_size=1_000): @@ -275,31 +274,31 @@ def mc_sample_path(P, ψ_0=None, sample_size=1_000): return X ``` -让我们用一个小矩阵来看看它是如何工作的 +让我们用一个$2 \times 2$的小矩阵来看看它是如何工作的 ```{code-cell} ipython3 P = [[0.4, 0.6], [0.2, 0.8]] ``` -我们稍后会看到,对于从`P`中抽取的长序列,样本中取值为0的比例大约是0.25。 +我们稍后会看到,对于从`P`这个转移矩阵生成的足够长的马尔可夫链序列,状态0出现的频率大约为$0.25$。 -而且,无论$X_0$的初始分布如何,这个结论都成立。 +有趣的是,这个频率与初始状态分布$X_0$无关,这反映了马尔可夫链的一个重要性质。 -以下代码演示了这一点 +下面的代码验证了这一现象: ```{code-cell} ipython3 X = mc_sample_path(P, ψ_0=[0.1, 0.9], sample_size=100_000) np.mean(X == 0) ``` -你可以尝试改变初始分布,以确认输出总是接近0.25,至少对于上面的`P`矩阵是这样。 +你可以尝试修改初始分布,使用我们上面定义的`P`矩阵,你会发现输出始终接近0.25。 -### 使用QuantEcon的程序 +### 使用QuantEcon库 -如上所述,[QuantEcon.py](http://quantecon.org/quantecon-py)有处理马尔可夫链的程序,包括模拟。 +正如前面提到的,[QuantEcon.py](http://quantecon.org/quantecon-py)库提供了处理马尔可夫链的各种功能,包括模拟功能。 -这里用与前面例子相同的P进行说明 +下面我们使用与前面例子相同的转移矩阵P来演示这些功能 ```{code-cell} ipython3 from quantecon import MarkovChain @@ -309,23 +308,23 @@ X = mc.simulate(ts_length=1_000_000) np.mean(X == 0) ``` -[QuantEcon.py](http://quantecon.org/quantecon-py)程序使用了[JIT编译](https://python-programming.quantecon.org/numba.html#numba-link),运行速度更快。 +[QuantEcon.py](http://quantecon.org/quantecon-py)库使用了[JIT编译](https://python-programming.quantecon.org/numba.html#numba-link),因此运行速度明显更快。 -```{code-cell} ipython +```{code-cell} ipython3 %time mc_sample_path(P, sample_size=1_000_000) # 我们自制代码版本 ``` -```{code-cell} ipython +```{code-cell} ipython3 %time mc.simulate(ts_length=1_000_000) # qe代码版本 ``` -#### 添加状态值和初始条件 +#### 自定义状态值和初始状态 -如果需要,我们可以为`MarkovChain`提供状态值的规范。 +在使用`MarkovChain`类时,我们可以自定义状态的表示方式,而不仅限于默认的数字索引。 -这些状态值可以是整数、浮点数,甚至是字符串。 +这些自定义状态值可以是任何类型:整数、浮点数,甚至是更直观的字符串标签。 -以下代码演示了这一点 +下面的例子展示了如何使用有意义的标签来表示就业状态 ```{code-cell} ipython3 mc = qe.MarkovChain(P, state_values=('unemployed', 'employed')) @@ -352,20 +351,20 @@ mc.simulate_indices(ts_length=4) ```{index} single: 马尔可夫链; 边际分布 ``` -假设 +假设我们有: -1. $\{X_t\}$ 是一个具有随机矩阵 $P$ 的马尔可夫链 -1. $X_t$ 的边际分布已知为 $\psi_t$ +1. 一个马尔可夫链 $\{X_t\}$,其转移概率矩阵为 $P$ +1. 在时间 $t$ 时,$X_t$ 的边际分布为 $\psi_t$ -那么 $X_{t+1}$ 或更一般地 $X_{t+m}$ 的边际分布是什么? +我们想知道:在未来某个时间点,比如 $t+1$ 或更一般地 $t+m$ 时,系统的边际分布会是什么? -为了回答这个问题,我们令 $\psi_t$ 为 $t = 0, 1, 2, \ldots$ 时 $X_t$ 的边际分布。 +为了解决这个问题,我们用 $\psi_t$ 表示时间 $t$ 时随机变量 $X_t$ 的概率分布,其中 $t = 0, 1, 2, \ldots$。 -我们的首要目标是根据 $\psi_t$ 和 $P$ 找到 $\psi_{t + 1}$。 +我们首先考虑如何从当前分布 $\psi_t$ 和转移矩阵 $P$ 推导出下一时刻的分布 $\psi_{t+1}$。 -首先,选取任意 $y \in S$。 +考虑任意状态 $y \in S$,我们想计算系统在下一时刻处于状态 $y$ 的概率。 -使用[全概率公式](https://en.wikipedia.org/wiki/Law_of_total_probability),我们可以将 $X_{t+1} = y$ 的概率分解如下: +根据[全概率公式](https://baike.baidu.com/item/%E5%85%A8%E6%A6%82%E7%8E%87%E5%85%AC%E5%BC%8F/9980676),我们可以将这个概率表示为: $$ \mathbb P \{X_{t+1} = y \} @@ -373,17 +372,17 @@ $$ \cdot \mathbb P \{ X_t = x \} $$ -用文字来说,要得到明天处于状态 $y$ 的概率,我们需要考虑所有可能发生的情况并将它们的概率相加。 +换句话说,要计算明天系统处于状态 $y$ 的概率,我们需要考虑今天可能处于的每个状态 $x$,然后将从这些状态转移到 $y$ 的概率加权求和。 -用边际概率和条件概率重写这个表达式得到 +用数学符号表示,这个表达式可以写为 $$ \psi_{t+1}(y) = \sum_{x \in S} P(x,y) \psi_t(x) $$ -对于每个 $y \in S$,都有一个这样的方程,共 $n$ 个方程。 +这个等式对状态空间 $S$ 中的每个状态 $y$ 都成立,总共有 $n$ 个这样的方程。 -如果我们将 $\psi_{t+1}$ 和 $\psi_t$ 视为*行向量*,这 $n$ 个方程可以用矩阵表达式概括为 +如果我们将分布 $\psi_{t+1}$ 和 $\psi_t$ 看作*行向量*,那么这整组方程可以简洁地表示为矩阵形式 ```{math} :label: fin_mc_fr @@ -391,15 +390,15 @@ $$ \psi_{t+1} = \psi_t P ``` -因此,要将边际分布向前推进一个时间单位,我们需要右乘 $P$。 +由此可见,将边际分布向前推进一个时间单位,只需要将分布向量右乘转移矩阵 $P$。 -通过右乘 $m$ 次,我们可以将边际分布向未来推进 $m$ 步。 +如果我们想将分布向前推进 $m$ 个时间单位,只需要将分布向量右乘 $P$ 的 $m$ 次幂。 -因此,通过迭代 {eq}`fin_mc_fr`,表达式 $\psi_{t+m} = \psi_t P^m$ 也是有效的 --- 这里 $P^m$ 是 $P$ 的 $m$ 次幂。 +换句话说,通过迭代应用等式 {eq}`fin_mc_fr`,我们得到 $\psi_{t+m} = \psi_t P^m$,其中 $P^m$ 表示转移矩阵 $P$ 的 $m$ 次幂。 -作为一个特例,我们可以看到,如果 $\psi_0$ 是 $X_0$ 的初始分布,那么 $\psi_0 P^m$ 就是 $X_m$ 的分布。 +特别地,如果我们知道系统的初始分布 $\psi_0$,那么 $m$ 时刻的分布就是 $\psi_0 P^m$。 -这一点非常重要,让我们重复一遍 +这个结果非常重要,值得我们强调一下 ```{math} :label: mdfmc @@ -420,15 +419,16 @@ X_t \sim \psi_t \quad \implies \quad X_{t+m} \sim \psi_t P^m 我们知道从状态 $x$ 到 $y$ 的一步转移概率是 $P(x,y)$。 -事实证明,从 $x$ 到 $y$ 的 $m$ 步转移概率是 $P^m(x,y)$,即 $P$ 的 $m$ 次幂的第 $(x,y)$ 个元素。 +类似地,从状态 $x$ 到 $y$ 的 $m$ 步转移概率是 $P^m(x,y)$,即矩阵 $P$ 的 $m$ 次幂中第 $(x,y)$ 个元素。 -要理解这一点,再次考虑 {eq}`mdfmc2`,但现在假设 $\psi_t$ 在状态 $x$ 上的概率为1,其他位置为零,使得转移概率为: +为了理解这一点,让我们重新考虑等式 {eq}`mdfmc2`,但这次假设初始分布 $\psi_t$ 是一个特殊的分布:它在状态 $x$ 处的概率为1,在其他所有状态处的概率为0。这相当于确定系统在时刻 $t$ 处于状态 $x$。 -* 在第 $x$ 个位置为1,其他位置为零 +这样的分布可以表示为一个行向量: +* 在第 $x$ 个位置为1,其他位置为0 -将此代入 {eq}`mdfmc2`,我们可以看到,在条件 $X_t = x$ 下,$X_{t+m}$ 的分布是 $P^m$ 的第 $x$ 行。 +将这个特殊分布代入 {eq}`mdfmc2`,我们可以看到,在条件 $X_t = x$ 下,$X_{t+m}$ 的分布正好对应于矩阵 $P^m$ 的第 $x$ 行。 -具体来说 +因此,我们有 $$ \mathbb P \{X_{t+m} = y \,|\, X_t = x \} = P^m(x, y) = P^m \text{的第} (x, y) \text{个元素} @@ -439,13 +439,13 @@ $$ ```{index} single: Markov Chains; Future Probabilities ``` -回顾上面{ref}`考虑过的`衰退和增长的随机矩阵$P$。 +让我们回顾{ref}`前面讨论的`关于衰退和增长的随机矩阵$P$。 -假设当前状态未知 --- 可能统计数据仅在当前月份*结束时*才能获得。 +假设我们不确定当前的经济状态,这种情况很常见,因为经济数据通常要到月末才能收集到。 -我们猜测经济处于状态$x$的概率是$\psi(x)$。 +我们用$\psi(x)$表示经济处于状态$x$的概率估计。 -6个月后经济处于衰退状态(轻度或严重)的概率由以下内积给出: +那么,6个月后经济陷入衰退(无论是轻度还是严重)的概率可以通过以下内积计算: $$ \psi P^6 @@ -460,51 +460,48 @@ $$ $$ (mc_eg1-1)= -### 示例2:横截面分布 +### 示例2:分布的横截面解释 ```{index} single: Markov Chains; Cross-Sectional Distributions ``` +我们研究的边际分布不仅可以解释为概率,还可以被理解为大数定律下大样本中实际观察到的横截面分布。 -我们一直在研究的边际分布可以被视为概率,也可以被视为大数定律使我们预期在大样本中出现的横截面频率。 +为了更好地理解这一点,让我们回到{ref}`前面讨论的`工人就业/失业动态模型。 -为了说明这一点,让我们回顾{ref}`上面讨论过的`关于某个工人就业/失业动态的模型。 +想象一个大型工人群体,其中每个工人的职业生涯都遵循相同的动态过程,且每个工人的经历在统计上独立于其他工人。 -考虑一个大规模的工人群体,每个工人的终身经历都由特定的动态过程描述,每个工人的结果都是统计上独立于其他所有工人过程的实现。 +假设$\psi$代表当前在状态空间$\{ 0, 1 \}$上的*横截面*分布。 -让$\psi$表示当前在$\{ 0, 1 \}$上的*横截面*分布。 +这个横截面分布反映了某一时刻就业和失业工人的比例。 -横截面分布记录了在某一时刻就业和失业工人的比例。 +* 具体来说,$\psi(0)$表示失业率。 -* 例如,$\psi(0)$是失业率。 +如果我们想知道10个周期后的横截面分布会是什么样子,答案是$\psi P^{10}$,其中$P$是{eq}`p_unempemp`中给出的随机矩阵。 -10个周期后的横截面分布会是什么? +这一结果成立是因为每个工人的状态都按照矩阵$P$的规律演变,因此$\psi P^{10}$代表了随机选取的单个工人的边际分布。 -答案是$\psi P^{10}$,其中$P$是{eq}`p_unempemp`中的随机矩阵。 +根据大数定律,当样本规模足够大时,观察到的频率会非常接近理论概率。 -这是因为每个工人的状态都按照$P$演变,所以$\psi P^{10}$是随机选择的单个工人的边际分布。 +因此,对于一个足够大(接近无限)的人口, -但当样本量很大时,结果和概率大致相等(根据大数定律)。 +$\psi P^{10}$同时也代表了处于各个状态的工人比例。 -因此,对于一个非常大的(趋向于无限的)人口, - -$\psi P^{10}$ 也表示每个状态中工人的比例。 - -这正是横截面分布。 +这正是我们所说的横截面分布。 ## {index}`不可约性和非周期性 ` ```{index} single: Markov Chains; Irreducibility, Aperiodicity ``` -不可约性和非周期性是现代马尔可夫链理论的核心概念。 +不可约性和非周期性是马尔可夫链理论中两个最基本的概念。 -让我们来看看它们是什么。 +下面我们来详细了解这两个概念。 ### 不可约性 -设 $P$ 是一个固定的随机矩阵。 +假设我们有一个随机矩阵 $P$。 -如果存在正整数 $j$ 和 $k$ 使得 +当两个状态 $x$ 和 $y$ 之间存在某种"联系"时,即存在正整数 $j$ 和 $k$ 使得 $$ P^j(x, y) > 0 @@ -556,7 +553,6 @@ mc.is_irreducible 这是一个更悲观的情景,其中穷人永远保持贫穷 ```{figure} /_static/lecture_specific/finite_markov/mc_irreducibility2.png - ``` 这个随机矩阵不是不可约的,因为,例如,从穷人状态无法到达富人状态。 @@ -572,7 +568,7 @@ mc = qe.MarkovChain(P, ('poor', 'middle', 'rich')) mc.is_irreducible ``` -我们也可以确定"通信类" +我们也可以确定各个状态之间的"连通类" ```{code-cell} ipython3 mc.communication_classes @@ -605,17 +601,17 @@ mc = qe.MarkovChain(P) mc.period ``` -更正式地说,一个状态 $x$ 的**周期**是一个整数集合的最大公约数 +更正式地说,一个状态 $x$ 的**周期**是指状态 $x$ 可能返回自身的步数集合的最大公约数 $$ D(x) := \{j \geq 1 : P^j(x, x) > 0\} $$ -在上一个例子中,对于每个状态 $x$,$D(x) = \{3, 6, 9, \ldots\}$,所以周期是3。 +在上面的例子中,对于每个状态 $x$,我们有 $D(x) = \{3, 6, 9, \ldots\}$,因此周期是3。 -如果每个状态的周期都是1,随机矩阵被称为**非周期的**,否则称为**周期的**。 +如果所有状态的周期都是1,我们称这个马尔可夫链为**非周期的**,否则称为**周期的**。 -例如,下面这个转移概率对应的随机矩阵是周期的,因为状态 $a$ 的周期是2 +例如,下图所示的马尔可夫链是周期的,这是因为状态 $a$ 的周期是2 ```{figure} /_static/lecture_specific/finite_markov/mc_aperiodicity2.png @@ -642,9 +638,9 @@ mc.is_aperiodic ```{index} single: 马尔可夫链; 平稳分布 ``` -如{eq}`fin_mc_fr`所示,我们可以通过后乘$P$将边际分布向前移动一个时间单位。 +如{eq}`fin_mc_fr`所示,我们可以通过右乘$P$将边际分布向前推进一个时间单位。 -某些分布在这种更新过程下保持不变 --- 例如, +某些分布在这种更新过程下保持不变 --- 比如, ```{code-cell} ipython3 P = np.array([[0.4, 0.6], @@ -660,19 +656,19 @@ P = np.array([[0.4, 0.6], (这与我们在{doc}`AR(1)过程讲座 `中学到的平稳性概念是相同的,只是应用在不同的场景中。) -从这个等式中,我们可以立即得到对于所有$t$都有$\psi^* = \psi^* P^t$。 +从这个等式中,我们可以直接推导出对于所有$t$都有$\psi^* = \psi^* P^t$。 -这告诉我们一个重要的事实:如果$X_0$的分布是平稳分布,那么对于所有$t$,$X_t$将具有相同的分布。 +这告诉我们一个重要事实:如果$X_0$的分布是平稳分布,那么对于所有$t$,$X_t$将具有相同的分布。 -因此,平稳分布可以自然地解释为**随机稳态**——我们很快会详细讨论这一点。 +因此,平稳分布可以自然地解释为**随机稳态**——我们稍后会详细讨论这一点。 -从数学角度来看,当将$P$视为从(行)向量到(行)向量的映射$\psi \mapsto \psi P$时,平稳分布是$P$的不动点。 +从数学角度看,当将$P$视为从(行)向量到(行)向量的映射$\psi \mapsto \psi P$时,平稳分布是$P$的不动点。 -**定理:**每个随机矩阵$P$至少有一个平稳分布。 +**定理:** 每个随机矩阵$P$至少有一个平稳分布。 (我们在此假设状态空间 $S$ 是有限的;如果不是则需要更多假设) -对于这个结果的证明,你可以应用[布劳威尔不动点定理](https://en.wikipedia.org/wiki/Brouwer_fixed-point_theorem),或参见[EDTC](https://johnstachurski.net/edtc.html)中的定理4.3.5。 +对于这个结果的证明,你可以应用[布劳威尔不动点定理](https://baike.baidu.com/item/%E5%B8%83%E5%8A%B3%E5%A8%81%E5%B0%94%E4%B8%8D%E5%8A%A8%E7%82%B9%E5%AE%9A%E7%90%86/12757191),或参见[EDTC](https://johnstachurski.net/edtc.html)中的定理4.3.5。 对于给定的随机矩阵 $P$,可能存在多个平稳分布。 @@ -682,9 +678,9 @@ P = np.array([[0.4, 0.6], 如果从状态空间的某个子集无法到达其他部分,则该子集是无限持续的。 -因此,非平凡子集的无限持续性与不可约性是相对的。 +因此,闭集的不存在与不可约性是对应的。 -这为以下基本定理提供了一些直观理解。 +这为以下基本定理提供了直观理解。 (mc_conv_thm)= @@ -699,9 +695,9 @@ P = np.array([[0.4, 0.6], 满足该定理条件的随机矩阵有时被称为**一致遍历的**。 -$P$的每个元素都严格大于零是非周期性和不可约性的充分条件。 +$P$的每个元素都严格大于零是保证非周期性和不可约性的充分条件。 -* 试着说服自己这一点是正确的。 +* 试着思考为什么这个结论是正确的。 ### 示例 @@ -717,46 +713,46 @@ $$ p = \frac{\beta}{\alpha + \beta} $$ -这在某种意义上是失业的稳态概率 --- 关于这个解释的更多内容见下文。 +这个值表示长期来看,工人处于失业状态的平均时间比例 -- 我们将在后续章节中详细讨论这一解释。 -不出所料,当 $\beta \to 0$ 时,它趋近于零;当 $\alpha \to 0$ 时,它趋近于一。 +不出所料,当$\beta \to 0$时,它趋近于零;当$\alpha \to 0$时,它趋近于一。 ### 计算平稳分布 ```{index} single: Markov Chains; Calculating Stationary Distributions ``` -如上所述,一个特定的马尔可夫矩阵 $P$ 可能有多个平稳分布。 +如前所述,某些马尔可夫矩阵 $P$ 可能存在多个平稳分布。 -也就是说,可能存在多个行向量 $\psi$ 满足 $\psi = \psi P$。 +换句话说,可能有多个概率分布(行向量)$\psi$ 满足条件 $\psi = \psi P$。 -事实上,如果 $P$ 有两个不同的平稳分布 $\psi_1, \psi_2$,那么它就有无限多个平稳分布,因为在这种情况下,正如你可以验证的那样,对于任意 $\lambda \in [0, 1]$ +实际上,如果 $P$ 有两个不同的平稳分布 $\psi_1$ 和 $\psi_2$,那么它必然有无限多个平稳分布。这是因为对于任意 $\lambda \in [0, 1]$,它们的凸组合 $$ \psi_3 := \lambda \psi_1 + (1 - \lambda) \psi_2 $$ -都是 $P$ 的一个平稳分布。 +也是 $P$ 的平稳分布,这一点很容易验证。 -如果我们将注意力限制在只存在一个平稳分布的情况下,找到它的一种方法是求解系统 +当我们考虑只有唯一平稳分布的情况时,可以通过求解以下线性方程组来找到它 $$ \psi (I_n - P) = 0 $$ (eq:eqpsifixed) -其中$I_n$是$n \times n$单位矩阵,求解$\psi$。 +其中$I_n$是$n \times n$单位矩阵,我们需要求解非零向量$\psi$。 -但是零向量可以满足系统{eq}`eq:eqpsifixed`,所以我们必须谨慎处理。 +注意,零向量也满足方程组{eq}`eq:eqpsifixed`,因此我们需要额外的约束条件。 -我们要施加$\psi$是概率分布的限制条件。 +由于$\psi$表示概率分布,我们需要确保它的所有元素非负且和为1。 -有多种方法可以做到这一点。 +解决这个问题有几种方法: -一种选择是将求解系统{eq}`eq:eqpsifixed`视为特征向量问题:满足$\psi = \psi P$的向量$\psi$是与单位特征值$\lambda = 1$相关的左特征向量。 +一种方法是将其视为特征值问题:满足$\psi = \psi P$的向量$\psi$实际上是对应于特征值$\lambda = 1$的左特征向量。 -[QuantEcon.py](http://quantecon.org/quantecon-py)实现了一个专门用于随机矩阵的稳定且复杂的算法。 +[QuantEcon.py](http://quantecon.org/quantecon-py)库提供了一个专门计算随机矩阵平稳分布的高效算法,能够处理各种复杂情况。 -这是我们推荐的方法: +下面是使用这个库的推荐方法: ```{code-cell} ipython3 P = [[0.4, 0.6], @@ -770,14 +766,13 @@ mc.stationary_distributions # 显示所有平稳分布 ```{index} single: 马尔可夫链; 收敛到平稳分布 ``` +马尔可夫链收敛定理的第2部分{ref}`如上所述`表明,无论初始状态如何,$X_t$的边际分布最终都会收敛到平稳分布。 -马尔可夫链收敛定理的第2部分{ref}`如上所述`告诉我们,无论从何处开始,$X_t$的边际分布都会收敛到平稳分布。 +这一结果强有力地证明了我们可以将$\psi^*$理解为系统长期随机行为的稳定状态,无论系统最初处于什么状态。 -这大大加强了我们将$\psi^*$解释为随机稳态的观点。 +以下图形直观地展示了这一收敛过程 -下图展示了定理中的收敛过程 - -```{code-cell} ipython +```{code-cell} ipython3 P = ((0.971, 0.029, 0.000), (0.145, 0.778, 0.077), (0.000, 0.508, 0.492)) @@ -810,14 +805,14 @@ ax.scatter(ψ_star[0], ψ_star[1], ψ_star[2], c='k', s=60) plt.show() ``` -这里 +在这个图中: -* $P$ 是{ref}`上文讨论的 `衰退和增长的随机矩阵。 -* 最高的红点是任意选择的初始边际概率分布 $\psi$,表示为 $\mathbb R^3$ 中的一个向量。 -* 其他红点是边际分布 $\psi P^t$,其中 $t = 1, 2, \ldots$。 -* 黑点是 $\psi^*$。 +* $P$ 是{ref}`上文讨论的 `描述经济衰退和增长的随机矩阵 +* 最高处的红点代表我们选择的初始概率分布 $\psi$(表示为 $\mathbb R^3$ 中的向量) +* 其余红点表示随时间演化的分布 $\psi P^t$($t = 1, 2, \ldots$) +* 黑点表示平稳分布 $\psi^*$ -你可以尝试用不同的初始条件进行实验。 +你可以尝试更改初始分布,观察系统如何始终收敛到相同的平稳分布。 (ergodicity)= ## {index}`遍历性 ` @@ -836,37 +831,37 @@ plt.show() 这里 -* $\mathbf{1}\{X_t = x\} = 1$ 当且仅当 $X_t = x$,否则为零 -* 收敛是以概率1发生的 -* 该结果不依赖于 $X_0$ 的边际分布 +* $\mathbf{1}\{X_t = x\}$ 是指示函数,当 $X_t = x$ 时等于1,否则等于0 +* 收敛是以概率1发生的(也称为"几乎必然"收敛) +* 无论初始状态 $X_0$ 如何分布,这个结果都成立 -结果表明,随着时间趋向无穷,马尔可夫链在状态 $x$ 停留的时间比例收敛到 $\psi^*(x)$。 +直观地说,这个结果表明,随着时间的推移,马尔可夫链在状态 $x$ 停留的时间比例将收敛到 $\psi^*(x)$。 (new_interp_sd)= -这为我们提供了另一种解释平稳分布的方式 --- 前提是{eq}`llnfmc0`中的收敛结果成立。 +这给了我们平稳分布的另一种解释方式——它代表了长期内系统在各状态停留的时间比例,前提是{eq}`llnfmc0`中的收敛成立。 -{eq}`llnfmc0`中所述的收敛是马尔可夫链大数定律结果的一个特例 --- 更多相关信息请参见[EDTC](http://johnstachurski.net/edtc.html)第4.3.4节。 +{eq}`llnfmc0`实际上是马尔可夫链大数定律的一个特例 — 有兴趣的读者可以参考[EDTC](http://johnstachurski.net/edtc.html)第4.3.4节获取更多细节。 (mc_eg1-2)= ### 示例 -回想我们之前{ref}`讨论过的`就业/失业模型的横截面解释。 +让我们回到之前{ref}`讨论过的`就业/失业模型。 -假设 $\alpha \in (0,1)$ 且 $\beta \in (0,1)$,因此不可约性和非周期性都成立。 +假设 $\alpha \in (0,1)$ 且 $\beta \in (0,1)$,这确保了马尔可夫链的不可约性和非周期性。 -我们看到平稳分布是 $(p, 1-p)$,其中 +我们已经知道平稳分布是 $(p, 1-p)$,其中 $$ p = \frac{\beta}{\alpha + \beta} $$ -在横截面解释中,这是失业人口的比例。 +从横截面角度看,$p$ 表示整个人口中失业者的比例。 -根据我们最新的(遍历性)结果,这也是单个工人预期处于失业状态的时间比例。 +而根据刚才介绍的遍历性结果,$p$ 也表示单个工人长期来看处于失业状态的时间占比。 -因此,从长远来看,群体的横截面平均值和个人的时间序列平均值是一致的。 +这意味着,从长期来看,群体的横截面平均值与个体的时间序列平均值是一致的。 -这是遍历性概念的一个方面。 +这正是遍历性的核心含义。 (finite_mc_expec)= ## 计算期望值 @@ -874,7 +869,7 @@ $$ ```{index} single: 马尔可夫链; 预测未来值 ``` -我们有时需要计算 $X_t$ 函数的数学期望值,形式如下: +我们经常需要计算 $X_t$ 函数的期望值,形式如下: ```{math} :label: mc_une @@ -893,7 +888,7 @@ $$ 其中: * $\{X_t\}$ 是由 $n \times n$ 随机矩阵 $P$ 生成的马尔可夫链 -* $h$ 是给定函数,从矩阵代数的角度来看,我们将其视为列向量 +* $h$ 是给定函数,从矩阵代数的角度看,我们将其视为列向量 $$ h @@ -906,9 +901,9 @@ h \right) $$ -计算无条件期望值 {eq}`mc_une` 很简单。 +计算无条件期望值 {eq}`mc_une` 相对简单。 -我们只需对 $X_t$ 的边际分布求和即可得到 +我们只需对 $X_t$ 的边际分布求和即可 $$ \mathbb E [ h(X_t) ] @@ -917,7 +912,7 @@ $$ 这里 $\psi$ 是 $X_0$ 的分布。 -由于 $\psi$ 以及 $\psi P^t$ 都是行向量,我们也可以写成 +由于 $\psi$ 以及 $\psi P^t$ 都是行向量,我们也可以简写为 $$ \mathbb E [ h(X_t) ] @@ -926,7 +921,7 @@ $$ 对于条件期望 {eq}`mc_cce`,我们需要对给定 $X_t = x$ 时 $X_{t + k}$ 的条件分布求和。 -我们已经知道这是 $P^k(x, \cdot)$,所以 +我们已经知道这个条件分布是 $P^k(x, \cdot)$,因此 ```{math} :label: mc_cce2 @@ -935,9 +930,9 @@ $$ = (P^k h)(x) ``` -向量 $P^k h$ 存储了所有 $x$ 的条件期望 $\mathbb E [ h(X_{t + k}) \mid X_t = x]$。 +向量 $P^k h$ 包含了所有状态 $x$ 的条件期望 $\mathbb E [ h(X_{t + k}) \mid X_t = x]$。 -### 迭代期望 +### 迭代期望法则 **迭代期望法则**指出 @@ -945,26 +940,26 @@ $$ \mathbb E \left[ \mathbb E [ h(X_{t + k}) \mid X_t = x] \right] = \mathbb E [ h(X_{t + k}) ] $$ -其中左边的外部期望 $ \mathbb E$ 是关于 $X_t$ 的边际分布 $\psi_t$ 的无条件分布(参见方程 {eq}`mdfmc2`)。 +其中左边的外部期望 $ \mathbb E$ 是关于 $X_t$ 的边际分布 $\psi_t$ 的(参见方程 {eq}`mdfmc2`)。 -为了验证迭代期望法则,使用方程 {eq}`mc_cce2` 将 $ (P^k h)(x)$ 代入 $E [ h(X_{t + k}) \mid X_t = x]$,写作 +为了验证这个法则,我们使用方程 {eq}`mc_cce2` 将 $ (P^k h)(x)$ 代入 $E [ h(X_{t + k}) \mid X_t = x]$,得到 $$ \mathbb E \left[ \mathbb E [ h(X_{t + k}) \mid X_t = x] \right] = \psi_t P^k h, $$ -并注意 $\psi_t P^k h = \psi_{t+k} h = \mathbb E [ h(X_{t + k}) ] $。 +注意到 $\psi_t P^k h = \psi_{t+k} h = \mathbb E [ h(X_{t + k}) ] $。 ### 几何和的期望 -有时我们想要计算几何和的数学期望,例如 $\sum_t \beta^t h(X_t)$。 +有时我们需要计算几何和的期望值,例如 $\sum_t \beta^t h(X_t)$。 -根据前面的讨论,这等于 +根据前面的讨论,对于给定的初始状态 $X_t = x$,这个几何和的条件期望可以表示为 $$ -\mathbb{E} [ +\mathbb{E} \left[ \sum_{j=0}^\infty \beta^j h(X_{t+j}) \mid X_t = x - \Bigr] + \right] = [(I - \beta P)^{-1} h](x) $$ @@ -974,7 +969,7 @@ $$ (I - \beta P)^{-1} = I + \beta P + \beta^2 P^2 + \cdots $$ -乘以 $(I - \beta P)^{-1}$ 相当于"应用**预解算子**"。 +乘以 $(I - \beta P)^{-1}$ 相当于应用**预解算子**(resolvent operator)。 ## 练习 @@ -1005,9 +1000,9 @@ $$ \bar X_m := \frac{1}{m} \sum_{t = 1}^m \mathbf{1}\{X_t = 0\} $$ -本练习要求你通过计算大规模 $m$ 的 $\bar X_m$ 并验证其接近 $p$ 来说明这种收敛性。 +在本练习中,请通过模拟计算大样本量$m$下的 $\bar X_m$ 值,并验证它确实收敛到理论值 $p$。 -你会发现,只要 $\alpha, \beta$ 都在 $(0, 1)$ 区间内,无论选择什么初始条件,这个结论都是成立的。 +你会发现,只要参数 $\alpha$ 和 $\beta$ 都严格在 0 和 1 之间,无论从什么初始状态开始,这个收敛结果都成立。 ``` @@ -1015,11 +1010,11 @@ $$ :class: dropdown ``` -我们将通过图形方式解决这个练习。 +让我们通过模拟来验证这个结果。 -图表显示了两种初始条件下 $\bar X_m - p$ 的时间序列。 +下面的图表展示了从两种不同初始状态开始时,$\bar X_m - p$ 随时间的变化。 -随着 $m$ 变大,两个序列都收敛于零。 +我们可以看到,无论初始状态如何,随着样本量 $m$ 的增加,$\bar X_m$ 都会收敛到理论值 $p$,即 $\bar X_m - p$ 趋近于零。 ```{code-cell} ipython3 α = β = 0.1 @@ -1036,14 +1031,16 @@ ax.grid() ax.hlines(0, 0, N, lw=2, alpha=0.6) # 在零处画水平线 for x0, col in ((0, 'blue'), (1, 'green')): + # 生成从x0开始的工人的时间序列 X = mc.simulate(N, init=x0) + # 计算每个n的失业时间比例 X_bar = (X == 0).cumsum() / (1 + np.arange(N, dtype=float)) + # 绘图 ax.fill_between(range(N), np.zeros(N), X_bar - p, color=col, alpha=0.1) - ax.plot(X_bar - p, color=col, label=f'$X_0 = \, {x0} $') - # 用黑色覆盖--使线条更清晰 + ax.plot(X_bar - p, color=col, label=fr'$X_0 = \, {x0} $') ax.plot(X_bar - p, 'k-', alpha=0.6) ax.legend(loc='upper right') @@ -1057,48 +1054,48 @@ plt.show() :label: fm_ex2 ``` -*排名*是经济学和许多其他学科关注的一个话题。 +*排名*是经济学和众多学科都非常关注的话题。 -现在让我们来考虑一个最实用且重要的排名问题——搜索引擎对网页的排名。 +接下来,我们将探讨一个极其实用且重要的排名问题——搜索引擎如何对网页进行排名。 -(尽管这个问题源自经济学之外,但搜索排名系统与某些竞争均衡中的价格实际上存在深层联系——参见{cite}`DLP2013`。) +(虽然这个问题并非源自经济学,但搜索排名系统与某些竞争均衡中的价格机制有着深层次的联系——详见{cite}`DLP2013`。) -为了理解这个问题,考虑一下网络搜索引擎查询返回的结果集。 +要理解这个问题,我们可以思考一下当你在搜索引擎中输入查询时返回的结果。 -对用户来说,理想的是: +对于用户来说,理想的搜索体验应该是: -1. 获得大量准确的匹配结果 -1. 按顺序返回匹配结果,这个顺序对应某种"重要性"的衡量标准 +1. 获得大量与查询相关的准确结果 +1. 这些结果按照某种"重要性"指标排序呈现 -根据重要性衡量标准进行排名就是我们现在要考虑的问题。 +我们现在要讨论的正是如何根据重要性指标对网页进行排名的问题。 -Google创始人拉里·佩奇和谢尔盖·布林开发的解决这个问题的方法被称为[PageRank](https://en.wikipedia.org/wiki/PageRank)。 +Google的创始人拉里·佩奇和谢尔盖·布林为解决这个问题开发了一种方法,这就是著名的[PageRank](https://baike.baidu.com/item/google%20pagerank/2465380)算法。 为了说明这个概念,请看下面的图表 ```{figure} /_static/lecture_specific/finite_markov/web_graph.png ``` -想象这是万维网的一个微型版本,其中 +假设这是一个简化的万维网模型,其中 -* 每个节点代表一个网页 -* 每个箭头代表从一个页面到另一个页面的链接存在 +* 每个节点表示一个网页 +* 每个箭头表示一个网页链接到另一个网页 -现在让我们思考哪些页面可能是重要的,即对搜索引擎用户来说具有价值的页面。 +我们来思考一下:什么样的页面才是真正重要的,也就是对搜索引擎用户最有价值的页面? -衡量页面重要性的一个可能标准是入站链接的数量——这表明了受欢迎程度。 +一个直观的衡量标准是看一个页面有多少入站链接——这在某种程度上反映了它的受欢迎度。 -按照这个标准,`m`和`j`是最重要的页面,各有5个入站链接。 +从图中可以看出,`m`和`j`各有5个入站链接,按这个标准应该是最重要的页面。 -但是,如果链接到`m`的页面本身并不重要呢? +但这里有个问题:如果链接到`m`的那些页面本身并不重要呢? -这样想的话,似乎应该根据相对重要性来对入站节点进行加权。 +这就引出了一个更合理的想法:我们应该根据链接源页面的重要性来给入站链接赋予不同的权重。 -PageRank算法正是这样做的。 +这正是PageRank算法的核心思想。 -下面是一个稍微简化的介绍,但捕捉到了基本思想。 +下面我们用一种简化的方式来解释这个算法的基本原理。 -令 $j$ 为(整数索引的)典型页面,$r_j$ 为其排名,我们设定 +假设$j$是任意一个页面,$r_j$是它的排名值,我们定义 $$ r_j = \sum_{i \in L_j} \frac{r_i}{\ell_i} @@ -1106,18 +1103,18 @@ $$ 其中 -* $\ell_i$ 是从页面 $i$ 出发的外链总数 -* $L_j$ 是所有链接到页面 $j$ 的页面 $i$ 的集合 +* $\ell_i$ 是页面 $i$ 的出站链接总数 +* $L_j$ 是所有链接到页面 $j$ 的页面集合 -这是一个衡量入站链接数量的指标,根据链接来源页面的排名进行加权(并通过 $1 / \ell_i$ 进行归一化)。 +这个公式实际上是一个加权的入站链接计数,其中每个链接的权重取决于源页面的重要性(即$r_i$),并通过源页面的出链数量(即$\ell_i$)进行归一化。 -然而,还有另一种解释,这让我们回到马尔可夫链。 +这种定义方式自然引导我们回到马尔可夫链的概念。 -令 $P$ 为矩阵,其中 $P(i, j) = \mathbf 1\{i \to j\} / \ell_i$,这里 $\mathbf 1\{i \to j\} = 1$ 表示页面 $i$ 有链接指向 $j$,否则为零。 +让我们定义矩阵 $P$,其中 $P(i, j) = \mathbf 1\{i \to j\} / \ell_i$。这里 $\mathbf 1\{i \to j\} = 1$ 表示页面 $i$ 链接到页面 $j$,否则为0。 -如果每个页面至少有一个链接,则矩阵 $P$ 是一个随机矩阵。 +如果每个页面至少有一个出站链接,那么 $P$ 就是一个随机矩阵。 -基于这个 $P$ 的定义,我们有 +基于 $P$ 的定义,我们可以重写排名公式: $$ r_j @@ -1126,38 +1123,34 @@ r_j = \sum_{\text{所有 } i} P(i, j) r_i $$ -将排名写成行向量 $r$,这就变成了 $r = r P$。 - -因此 $r$ 是随机矩阵 $P$ 的平稳分布。 +如果我们将排名表示为行向量 $r$,那么上式可以简写为 $r = r P$。 -让我们将 $P(i, j)$ 理解为从页面 $i$ "移动"到页面 $j$ 的概率。 +这表明排名向量 $r$ 正是随机矩阵 $P$ 的平稳分布。 -$P(i, j)$ 的值可以解释为: +从直观上理解,$P(i, j)$ 可以被视为从页面 $i$ "跳转"到页面 $j$ 的概率: -* 如果页面 $i$ 有 $k$ 个出站链接,且 $j$ 是其中之一,则 $P(i, j) = 1/k$ -* 如果页面 $i$ 没有直接链接到 $j$,则 $P(i, j) = 0$ +* 如果页面 $i$ 有 $k$ 个出站链接,且其中一个指向 $j$,则 $P(i, j) = 1/k$ +* 如果页面 $i$ 没有链接到 $j$,则 $P(i, j) = 0$ -因此,从一个页面到另一个页面的移动就像一个网络浏览者通过随机点击页面上的某个链接来移动。 +这描述了一个网络浏览者的随机漫步过程——在每个页面上随机点击一个链接继续浏览。 -这里的"随机"意味着每个链接被选中的概率相等。 +由于 $r$ 是 $P$ 的平稳分布,假设一致遍历性成立,我们可以{ref}`解读 ` $r_j$ 为一个长期随机浏览者在页面 $j$ 上停留的时间比例。 -由于 $r$ 是 $P$ 的平稳分布,假设一致遍历性条件成立,我们{ref}`可以解释 ` $r_j$ 为一个(非常持久的)随机浏览者在页面 $j$ 停留的时间比例。 +你的练习是将这个排名算法应用到上图所示的网络中,并按排名从高到低列出所有页面。 -你的练习是将这个排名算法应用到上图所示的图中,并返回按排名顺序排列的页面列表。 +图中共有14个节点(网页),分别标记为 `a` 到 `n`。 -总共有14个节点(即网页),第一个命名为 `a`,最后一个命名为 `n`。 - -文件中的典型行具有以下形式 +数据文件中的每一行具有以下格式: ```{code-block} none d -> h; ``` -这应该被理解为存在一个从`d`到`h`的链接。 +这说明了存在一个从`d`到`h`的链接。 下面显示了这个图的数据,当单元格执行时,这些数据被读入名为`web_graph_data.txt`的文件中。 -```{code-cell} ipython +```{code-cell} ipython3 %%file web_graph_data.txt a -> d; a -> f; @@ -1242,19 +1235,22 @@ Q = np.zeros((n, n), dtype=int) with open(infile) as f: edges = f.readlines() for edge in edges: - from_node, to_node = re.findall('\w', edge) + from_node, to_node = re.findall(r'\w', edge) i, j = alphabet.index(from_node), alphabet.index(to_node) Q[i, j] = 1 + # 创建相应的马尔可夫矩阵P P = np.empty((n, n)) for i in range(n): P[i, :] = Q[i, :] / Q[i, :].sum() mc = MarkovChain(P) -# 计算稳态分布r + +# 计算平稳分布r r = mc.stationary_distributions[0] ranked_pages = {alphabet[i] : r[i] for i in range(n)} -# 打印解决方案,从最高排名到最低排名排序 -print('排名\n ***') + +# 输出解,从最高排名到最低排名排序 +print(r'排名\n ***') for name, rank in sorted(ranked_pages.items(), key=itemgetter(1), reverse=1): print(f'{name}: {rank:.4}') ``` @@ -1332,9 +1328,8 @@ $P$,如上所述。 :class: dropdown 可以在[QuantEcon.py](http://quantecon.org/quantecon-py)库中找到解决方案, -具体见[这里](https://github.com/QuantEcon/QuantEcon.py/blob/master/quantecon/markov/approximation.py)。 +具体可见[这里](https://github.com/QuantEcon/QuantEcon.py/blob/master/quantecon/markov/approximation.py)。 ``` [^pm]: 提示:首先证明如果P和Q是随机矩阵,那么它们的乘积也是随机矩阵——要检查行和,试着用一列1向量进行后乘。最后,用归纳法论证P^n是随机矩阵。 -