diff --git a/.translate/state/finite_markov.md.yml b/.translate/state/finite_markov.md.yml new file mode 100644 index 00000000..05758222 --- /dev/null +++ b/.translate/state/finite_markov.md.yml @@ -0,0 +1,6 @@ +source-sha: 089e35ca27a9cdff6d341269f77d857f1c46dfd3 +synced-at: "2026-07-18" +model: claude-sonnet-5 +mode: RESYNC +section-count: 9 +tool-version: 0.17.0 diff --git a/lectures/finite_markov.md b/lectures/finite_markov.md index e83ec1b3..bdf89f5f 100644 --- a/lectures/finite_markov.md +++ b/lectures/finite_markov.md @@ -9,6 +9,36 @@ kernelspec: display_name: Python 3 (ipykernel) language: python name: python3 +translation: + title: 有限马尔可夫链 + headings: + Overview: 概述 + Definitions: 定义 + Definitions::Stochastic Matrices: 随机矩阵 + Definitions::Markov Chains: 马尔可夫链 + Definitions::Example 1: 示例1 + Definitions::Example 2: 示例2 + Simulation: 模拟 + Simulation::Rolling Our Own: 自己编写模拟程序 + Simulation::Using QuantEcon's Routines: 使用QuantEcon库 + Simulation::Using QuantEcon's Routines::Adding State Values and Initial Conditions: 自定义状态值和初始状态 + Marginal Distributions: 边际分布 + Marginal Distributions::Multiple Step Transition Probabilities: 多步转移概率 + 'Marginal Distributions::Example: Probability of Recession': 示例:衰退的概率 + 'Marginal Distributions::Example 2: Cross-Sectional Distributions': 示例2:分布的横截面解释 + Irreducibility and Aperiodicity: 不可约性和非周期性 + Irreducibility and Aperiodicity::Irreducibility: 不可约性 + Irreducibility and Aperiodicity::Aperiodicity: 非周期性 + Stationary Distributions: 平稳分布 + Stationary Distributions::Example: 示例 + Stationary Distributions::Calculating Stationary Distributions: 计算平稳分布 + Stationary Distributions::Convergence to Stationarity: 收敛到平稳分布 + Ergodicity: 遍历性 + Ergodicity::Example: 示例 + Computing Expectations: 计算期望值 + Computing Expectations::Iterated Expectations: 迭代期望法则 + Computing Expectations::Expectations of Geometric Sums: 几何和的期望 + Exercises: 练习 --- (mc)= @@ -28,9 +58,10 @@ kernelspec: 除了Anaconda中已有的库外,本讲座还需要以下库: -```{code-cell} ipython3 -:tags: [hide-output] - +```{code-cell} ipython +--- +tags: [hide-output] +--- !pip install quantecon ``` @@ -52,14 +83,14 @@ kernelspec: 首先,让我们导入需要的库: -```{code-cell} ipython3 +```{code-cell} ipython import matplotlib.pyplot as plt import matplotlib as mpl FONTPATH = "fonts/SourceHanSerifSC-SemiBold.otf" mpl.font_manager.fontManager.addfont(FONTPATH) plt.rcParams['font.family'] = ['Source Han Serif SC'] -plt.rcParams["figure.figsize"] = (11, 5) #set default figure size +plt.rcParams["figure.figsize"] = (11, 5) #设置默认图片大小 import quantecon as qe import numpy as np from mpl_toolkits.mplot3d import Axes3D @@ -93,7 +124,7 @@ $P$ 的每一行都可以被视为在 $n$ 个可能结果上的概率质量函 让我们考虑一个有限集 $S$,它包含 $n$ 个元素 $\{x_1, \ldots, x_n\}$。 -我们称 $S$ 为**状态空间**,其中的元素 $x_1, \ldots, x_n$ 称为**状态**。 +我们称 $S$ 为**状态空间**,其中的元素 $x_1, \ldots, x_n$ 称为**状态值**。 **马尔可夫链** $\{X_t\}$ 是一个在状态空间 $S$ 上取值的随机变量序列,它具有**马尔可夫性质**。 @@ -134,7 +165,7 @@ $$ * 从某个初始分布 $\psi$ 中抽取初始状态 $X_0$ * 对于每个时间 $t = 0, 1, \ldots$,根据条件分布 $P(X_t,\cdot)$ 随机生成下一状态 $X_{t+1}$ -通过这种构造方式,我们得到的随机过程自然满足马尔可夫性质 {eq}`mpp`。 +通过这种构造方式,我们得到的随机过程自然满足 {eq}`mpp`。 (mc_eg1)= ### 示例1 @@ -192,13 +223,13 @@ $$ 在这个模型中: * 数据频率是月度的 -* 状态1表示"正常增长"阶段 -* 状态2表示"轻度衰退"阶段 -* 状态3表示"严重衰退"阶段 +* 第一个状态表示"正常增长"阶段 +* 第二个状态表示"轻度衰退"阶段 +* 第三个状态表示"严重衰退"阶段 -从矩阵中我们可以看出,如果经济当前处于正常增长阶段,那么下个月仍然保持正常增长的概率高达0.971。 +从矩阵中我们可以看出,如果经济当前处于正常增长阶段,那么下个月仍然保持正常增长的概率高达0.97。 -注意矩阵主对角线上的元素普遍较大,这表明经济状态往往具有一定的持续性——当经济处于某一特定状态时,它倾向于在该状态停留一段时间。 +一般来说,主对角线上的元素越大,表明过程 $\{ X_t \}$ 越具有持续性。 这个马尔可夫链也可以通过下面的有向图来直观表示,图中的箭头上标注了相应的转移概率: @@ -216,11 +247,11 @@ $$ (如果我们想估计某个事件 $E$ 发生的概率,可以进行大量模拟,然后计算事件 $E$ 在这些模拟中出现的频率)。 -[QuantEcon.py](http://quantecon.org/quantecon-py)库提供了强大的马尔可夫链模拟工具。 +[QuantEcon.py](https://quantecon.org/quantecon-py/)库提供了强大的马尔可夫链模拟工具。 * 这些工具不仅高效,还包含了许多处理马尔可夫链的实用函数。 -不过,自己动手编写模拟程序也是一个很好的学习过程——我们先尝试自己实现,然后再介绍[QuantEcon.py](http://quantecon.org/quantecon-py)的方法。 +不过,自己动手编写模拟程序也是一个很好的学习过程——我们先尝试自己实现,然后再介绍[QuantEcon.py](https://quantecon.org/quantecon-py/)的方法。 在接下来的练习中,我们将状态空间定义为 $S = 0,\ldots, n-1$。 @@ -235,9 +266,9 @@ $$ 为了实现这个过程,我们需要一种从离散概率分布中抽样的方法。 -我们将使用 [QuantEcon](http://quantecon.org/quantecon-py) 库中的 `random.draw` 函数,它的用法如下: +我们将使用 [QuantEcon](https://quantecon.org/quantecon-py/) 库中的 `random.draw` 函数,它的用法如下: -```{code-cell} ipython3 +```{code-cell} python3 ψ = (0.3, 0.7) # {0, 1}上的概率 cdf = np.cumsum(ψ) # 转换为累积分布 qe.random.draw(cdf, 5) # 从ψ中生成5个独立抽样 @@ -245,11 +276,11 @@ qe.random.draw(cdf, 5) # 从ψ中生成5个独立抽样 我们将编写一个函数,它接受以下三个参数: -* 一个随机矩阵 `P`(表示转移概率矩阵) -* 一个初始概率分布 `ψ_0`(用于确定初始状态) -* 一个正整数 `sample_size`(表示要生成的马尔可夫链时间序列长度) +* 一个随机矩阵 `P` +* 一个初始状态 `init` +* 一个正整数 `sample_size`,表示函数应该返回的时间序列长度 -```{code-cell} ipython3 +```{code-cell} python3 def mc_sample_path(P, ψ_0=None, sample_size=1_000): # 设置 @@ -274,9 +305,9 @@ def mc_sample_path(P, ψ_0=None, sample_size=1_000): return X ``` -让我们用一个$2 \times 2$的小矩阵来看看它是如何工作的 +让我们用一个小矩阵来看看它是如何工作的 -```{code-cell} ipython3 +```{code-cell} python3 P = [[0.4, 0.6], [0.2, 0.8]] ``` @@ -287,7 +318,7 @@ P = [[0.4, 0.6], 下面的代码验证了这一现象: -```{code-cell} ipython3 +```{code-cell} python3 X = mc_sample_path(P, ψ_0=[0.1, 0.9], sample_size=100_000) np.mean(X == 0) ``` @@ -296,11 +327,11 @@ np.mean(X == 0) ### 使用QuantEcon库 -正如前面提到的,[QuantEcon.py](http://quantecon.org/quantecon-py)库提供了处理马尔可夫链的各种功能,包括模拟功能。 +正如前面提到的,[QuantEcon.py](https://quantecon.org/quantecon-py/)库提供了处理马尔可夫链的各种功能,包括模拟功能。 下面我们使用与前面例子相同的转移矩阵P来演示这些功能 -```{code-cell} ipython3 +```{code-cell} python3 from quantecon import MarkovChain mc = qe.MarkovChain(P) @@ -308,13 +339,13 @@ 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](https://quantecon.org/quantecon-py/)库使用了[JIT编译](https://python-programming.quantecon.org/numba.html#numba-link),因此运行速度明显更快。 -```{code-cell} ipython3 +```{code-cell} ipython %time mc_sample_path(P, sample_size=1_000_000) # 我们自制代码版本 ``` -```{code-cell} ipython3 +```{code-cell} ipython %time mc.simulate(ts_length=1_000_000) # qe代码版本 ``` @@ -326,29 +357,29 @@ np.mean(X == 0) 下面的例子展示了如何使用有意义的标签来表示就业状态 -```{code-cell} ipython3 +```{code-cell} python3 mc = qe.MarkovChain(P, state_values=('unemployed', 'employed')) mc.simulate(ts_length=4, init='employed') ``` -```{code-cell} ipython3 +```{code-cell} python3 mc.simulate(ts_length=4, init='unemployed') ``` -```{code-cell} ipython3 +```{code-cell} python3 mc.simulate(ts_length=4) # 从随机选择的初始状态开始 ``` 如果我们想要看到索引而不是状态值作为输出,我们可以使用 -```{code-cell} ipython3 +```{code-cell} python3 mc.simulate_indices(ts_length=4) ``` (mc_md)= -## {index}`边际分布 ` +## {index}`边际分布 ` -```{index} single: 马尔可夫链; 边际分布 +```{index} single: Markov Chains; Marginal Distributions ``` 假设我们有: @@ -364,7 +395,7 @@ mc.simulate_indices(ts_length=4) 考虑任意状态 $y \in S$,我们想计算系统在下一时刻处于状态 $y$ 的概率。 -根据[全概率公式](https://baike.baidu.com/item/%E5%85%A8%E6%A6%82%E7%8E%87%E5%85%AC%E5%BC%8F/9980676),我们可以将这个概率表示为: +根据[全概率公式](https://en.wikipedia.org/wiki/Law_of_total_probability),我们可以将这个概率表示为: $$ \mathbb P \{X_{t+1} = y \} @@ -539,9 +570,9 @@ $$ 从图中可以清楚地看出,这个随机矩阵是不可约的:我们最终可以从任何一个状态到达任何其他状态。 -我们也可以使用[QuantEcon.py](http://quantecon.org/quantecon-py)的MarkovChain类来测试这一点 +我们也可以使用[QuantEcon.py](https://quantecon.org/quantecon-py/)的MarkovChain类来测试这一点 -```{code-cell} ipython3 +```{code-cell} python3 P = [[0.9, 0.1, 0.0], [0.4, 0.4, 0.2], [0.1, 0.1, 0.8]] @@ -553,13 +584,14 @@ mc.is_irreducible 这是一个更悲观的情景,其中穷人永远保持贫穷 ```{figure} /_static/lecture_specific/finite_markov/mc_irreducibility2.png + ``` 这个随机矩阵不是不可约的,因为,例如,从穷人状态无法到达富人状态。 让我们来验证这一点 -```{code-cell} ipython3 +```{code-cell} python3 P = [[1.0, 0.0, 0.0], [0.1, 0.8, 0.1], [0.0, 0.2, 0.8]] @@ -570,7 +602,7 @@ mc.is_irreducible 我们也可以确定各个状态之间的"连通类" -```{code-cell} ipython3 +```{code-cell} python3 mc.communication_classes ``` @@ -592,7 +624,7 @@ mc.communication_classes 该链以周期3循环: -```{code-cell} ipython3 +```{code-cell} python3 P = [[0, 1, 0], [0, 0, 1], [1, 0, 0]] @@ -601,12 +633,14 @@ 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。 如果所有状态的周期都是1,我们称这个马尔可夫链为**非周期的**,否则称为**周期的**。 @@ -619,7 +653,7 @@ $$ 我们可以用以下代码确认这个随机矩阵是周期的 -```{code-cell} ipython3 +```{code-cell} python3 P = [[0.0, 1.0, 0.0, 0.0], [0.5, 0.0, 0.5, 0.0], [0.0, 0.5, 0.0, 0.5], @@ -629,20 +663,20 @@ mc = qe.MarkovChain(P) mc.period ``` -```{code-cell} ipython3 +```{code-cell} python3 mc.is_aperiodic ``` -## {index}`平稳分布 ` +## {index}`平稳分布 ` -```{index} single: 马尔可夫链; 平稳分布 +```{index} single: Markov Chains; Stationary Distributions ``` 如{eq}`fin_mc_fr`所示,我们可以通过右乘$P$将边际分布向前推进一个时间单位。 某些分布在这种更新过程下保持不变 --- 比如, -```{code-cell} ipython3 +```{code-cell} python3 P = np.array([[0.4, 0.6], [0.2, 0.8]]) ψ = (0.25, 0.75) @@ -668,7 +702,7 @@ P = np.array([[0.4, 0.6], (我们在此假设状态空间 $S$ 是有限的;如果不是则需要更多假设) -对于这个结果的证明,你可以应用[布劳威尔不动点定理](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。 +对于这个结果的证明,你可以应用[布劳威尔不动点定理](https://en.wikipedia.org/wiki/Brouwer_fixed-point_theorem),或参见[EDTC](https://johnstachurski.net/edtc.html)中的定理4.3.5。 对于给定的随机矩阵 $P$,可能存在多个平稳分布。 @@ -678,7 +712,7 @@ P = np.array([[0.4, 0.6], 如果从状态空间的某个子集无法到达其他部分,则该子集是无限持续的。 -因此,闭集的不存在与不可约性是对应的。 +因此,非平凡子集的无限持续性与不可约性正好相反。 这为以下基本定理提供了直观理解。 @@ -750,11 +784,11 @@ $$ (eq:eqpsifixed) 一种方法是将其视为特征值问题:满足$\psi = \psi P$的向量$\psi$实际上是对应于特征值$\lambda = 1$的左特征向量。 -[QuantEcon.py](http://quantecon.org/quantecon-py)库提供了一个专门计算随机矩阵平稳分布的高效算法,能够处理各种复杂情况。 +[QuantEcon.py](https://quantecon.org/quantecon-py/)库提供了一个专门计算随机矩阵平稳分布的高效算法,能够处理各种复杂情况。 下面是使用这个库的推荐方法: -```{code-cell} ipython3 +```{code-cell} python3 P = [[0.4, 0.6], [0.2, 0.8]] @@ -764,7 +798,7 @@ mc.stationary_distributions # 显示所有平稳分布 ### 收敛到平稳分布 -```{index} single: 马尔可夫链; 收敛到平稳分布 +```{index} single: Markov Chains; Convergence to Stationarity ``` 马尔可夫链收敛定理的第2部分{ref}`如上所述`表明,无论初始状态如何,$X_t$的边际分布最终都会收敛到平稳分布。 @@ -772,7 +806,7 @@ mc.stationary_distributions # 显示所有平稳分布 以下图形直观地展示了这一收敛过程 -```{code-cell} ipython3 +```{code-cell} ipython P = ((0.971, 0.029, 0.000), (0.145, 0.778, 0.077), (0.000, 0.508, 0.492)) @@ -817,7 +851,7 @@ plt.show() (ergodicity)= ## {index}`遍历性 ` -```{index} single: 马尔可夫链; 遍历性 +```{index} single: Markov Chains; Ergodicity ``` 在不可约性条件下,还有另一个重要的结果:对于所有 $x \in S$, @@ -831,23 +865,23 @@ plt.show() 这里 -* $\mathbf{1}\{X_t = x\}$ 是指示函数,当 $X_t = x$ 时等于1,否则等于0 -* 收敛是以概率1发生的(也称为"几乎必然"收敛) -* 无论初始状态 $X_0$ 如何分布,这个结果都成立 +* 若 $X_t = x$ 则 $\mathbf{1}\{X_t = x\} = 1$,否则为零 +* 收敛是以概率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](https://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)$,其中 @@ -855,18 +889,18 @@ $$ p = \frac{\beta}{\alpha + \beta} $$ -从横截面角度看,$p$ 表示整个人口中失业者的比例。 +从横截面角度看,这是失业人口的比例。 -而根据刚才介绍的遍历性结果,$p$ 也表示单个劳动者长期来看处于失业状态的时间占比。 +而根据刚才介绍的遍历性结果,这也是单个劳动者预期处于失业状态的时间占比。 这意味着,从长期来看,群体的横截面平均值与个体的时间序列平均值是一致的。 -这正是遍历性的核心含义。 +这正是遍历性这一概念的一个方面。 (finite_mc_expec)= ## 计算期望值 -```{index} single: 马尔可夫链; 预测未来值 +```{index} single: Markov Chains; Forecasting Future Values ``` 我们经常需要计算 $X_t$ 函数的期望值,形式如下: @@ -940,9 +974,9 @@ $$ \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, @@ -954,12 +988,12 @@ $$ 有时我们需要计算几何和的期望值,例如 $\sum_t \beta^t h(X_t)$。 -根据前面的讨论,对于给定的初始状态 $X_t = x$,这个几何和的条件期望可以表示为 +根据前面的讨论,这个期望是 $$ -\mathbb{E} \left[ +\mathbb{E} \Bigl[ \sum_{j=0}^\infty \beta^j h(X_{t+j}) \mid X_t = x - \right] + \Bigr] = [(I - \beta P)^{-1} h](x) $$ @@ -1010,13 +1044,13 @@ $$ :class: dropdown ``` -让我们通过模拟来验证这个结果。 +让我们通过图形来分析这个练习。 下面的图表展示了从两种不同初始状态开始时,$\bar X_m - p$ 随时间的变化。 -我们可以看到,无论初始状态如何,随着样本量 $m$ 的增加,$\bar X_m$ 都会收敛到理论值 $p$,即 $\bar X_m - p$ 趋近于零。 +随着 $m$ 增大,两条序列都会收敛到零。 -```{code-cell} ipython3 +```{code-cell} python3 α = β = 0.1 N = 10000 p = β / (α + β) @@ -1031,16 +1065,14 @@ 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=fr'$X_0 = \, {x0} $') + # 用黑色叠加--使线条更清晰 ax.plot(X_bar - p, 'k-', alpha=0.6) ax.legend(loc='upper right') @@ -1069,11 +1101,12 @@ plt.show() 我们现在要讨论的正是如何根据重要性指标对网页进行排名的问题。 -Google的创始人拉里·佩奇和谢尔盖·布林为解决这个问题开发了一种方法,这就是著名的[PageRank](https://baike.baidu.com/item/google%20pagerank/2465380)算法。 +Google的创始人拉里·佩奇和谢尔盖·布林为解决这个问题开发了一种方法,这就是著名的[PageRank](https://en.wikipedia.org/wiki/PageRank)算法。 为了说明这个概念,请看下面的图表 -```{figure} /_static/lecture_specific/finite_markov/web_graph.png +```{image} /_static/lecture_specific/finite_markov/web_graph.png +:align: center ``` 假设这是一个简化的万维网模型,其中 @@ -1138,7 +1171,7 @@ $$ 你的练习是将这个排名算法应用到上图所示的网络中,并按排名从高到低列出所有页面。 -图中共有14个节点(网页),分别标记为 `a` 到 `n`。 +图中共有14个节点(网页),第一个命名为`a`,最后一个命名为`n`。 数据文件中的每一行具有以下格式: @@ -1150,7 +1183,7 @@ d -> h; 下面显示了这个图的数据,当单元格执行时,这些数据被读入名为`web_graph_data.txt`的文件中。 -```{code-cell} ipython3 +```{code-cell} ipython %%file web_graph_data.txt a -> d; a -> f; @@ -1195,12 +1228,12 @@ n -> m; 下面的代码片段提供了一个关于如何实现的提示 -```{code-cell} ipython3 +```{code-cell} python3 import re re.findall(r'\w', 'x +++ y ****** z') # \w 匹配字母数字字符 ``` -```{code-cell} ipython3 +```{code-cell} python3 re.findall(r'\w', 'a ^^ b &&& $$ c') ``` @@ -1216,7 +1249,7 @@ re.findall(r'\w', 'a ^^ b &&& $$ c') 这是一个解决方案: -```{code-cell} ipython3 +```{code-cell} python3 """ 返回按排名排序的页面列表 """ @@ -1238,19 +1271,16 @@ for edge in edges: 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 = mc.stationary_distributions[0] ranked_pages = {alphabet[i] : r[i] for i in range(n)} - # 输出解,从最高排名到最低排名排序 -print(r'排名\n ***') +print('排名\n ***') for name, rank in sorted(ranked_pages.items(), key=itemgetter(1), reverse=1): print(f'{name}: {rank:.4}') ``` @@ -1280,7 +1310,7 @@ $$ Tauchen方法{cite}`Tauchen1986`是将这个连续状态过程近似为有限状态马尔可夫链最常用的方法。 -[QuantEcon.py](http://quantecon.org/quantecon-py)中已经有了这个程序,但让我们作为练习自己写一个版本。 +[QuantEcon.py](https://quantecon.org/quantecon-py/)中已经有了这个程序,但让我们作为练习自己写一个版本。 作为第一步,我们选择: @@ -1321,13 +1351,13 @@ $P(x_i, x_j)$ 的值是为了近似 AR(1) 过程而计算的 --- 省略推导过 $\{x_0, \ldots, x_{n-1}\} \subset \mathbb R$ 和 $n \times n$ 矩阵 $P$,如上所述。 -* 更好的方法是编写一个函数,返回[QuantEcon.py](http://quantecon.org/quantecon-py)的MarkovChain类的实例。 +* 更好的方法是编写一个函数,返回[QuantEcon.py](https://quantecon.org/quantecon-py/)的MarkovChain类的实例。 ``` ```{solution} fm_ex3 :class: dropdown -可以在[QuantEcon.py](http://quantecon.org/quantecon-py)库中找到解决方案, +可以在[QuantEcon.py](https://quantecon.org/quantecon-py/)库中找到解决方案, 具体可见[这里](https://github.com/QuantEcon/QuantEcon.py/blob/master/quantecon/markov/approximation.py)。 ```