@@ -20,7 +20,7 @@ kernelspec:
20
20
</div>
21
21
```
22
22
23
- # 卡尔曼滤波器的另一个视角
23
+ # 卡尔曼滤波器进阶
24
24
25
25
``` {index} single: Kalman Filter 2
26
26
```
@@ -37,7 +37,7 @@ kernelspec:
37
37
38
38
这两个变量都是公司无法直接观察到的。
39
39
40
- 公司只能通过观察劳动者产生的产出历史 ,以及理解这些产出如何依赖于劳动者的人力资本,以及人力资本如何作为劳动者努力程度的函数来演化,来了解这些信息 。
40
+ 公司只能通过观察劳动者历史产出 ,以及理解这些产出如何依赖于劳动者的人力资本,以及人力资本如何作为劳动者努力程度的函数来演化,来了解上述变量 。
41
41
42
42
我们将设定一个规则,说明公司如何根据每期获得的信息来支付劳动者工资。
43
43
@@ -49,7 +49,7 @@ kernelspec:
49
49
!pip install quantecon
50
50
```
51
51
52
- 为了进行模拟,我们引入以下导入 ,与 {doc}` 卡尔曼滤波器的初步介绍 <kalman> ` 相同:
52
+ 为了进行模拟,我们引入以下函数库 ,与 {doc}` 卡尔曼滤波器的初步介绍 <kalman> ` 相同:
53
53
54
54
``` {code-cell} ipython3
55
55
import matplotlib.pyplot as plt
@@ -63,6 +63,7 @@ from quantecon import Kalman, LinearStateSpace
63
63
from collections import namedtuple
64
64
from scipy.stats import multivariate_normal
65
65
import matplotlib as mpl
66
+
66
67
# Configure Matplotlib to use pdfLaTeX and CJKutf8
67
68
mpl.rcParams.update({
68
69
'text.usetex': True,
@@ -115,27 +116,27 @@ y_t & = g h_t + v_t , \quad v_t \sim {\mathcal N} (0, R)
115
116
116
117
这意味着从公司的角度来看,劳动者的努力程度实际上是一个未知的固定"参数"。
117
118
118
- 在时间 $t\geq 1$,对于特定劳动者,公司观察到 $y^{t-1} = [ y_ {t-1}, y_ {t-2}, \ldots, y_0] $。
119
-
120
- 公司无法观察到劳动者的"类型" $(h_0, u_0)$。
119
+ 在任意时间点 $t\geq 1$,公司能观察到该劳动者从雇佣开始到当前时刻的所有历史产出记录,记为 $y^{t-1} = [ y_ {t-1}, y_ {t-2}, \ldots, y_0] $。
121
120
122
- 但公司确实观察到劳动者在时间 $t$ 的产出 $y_t$,并记得劳动者的过去产出 $ y^{t-1}$。
121
+ 虽然公司无法直接观察劳动者的真实"类型"(即初始人力资本 $h_0$ 和固有努力水平 $u_0$),但可以通过观察劳动者当前的产出 $y_t$ 以及回顾其历史产出记录 $ y^{t-1}$ 来进行推断 。
123
122
124
123
## 公司的工资设定政策
125
124
126
- 基于公司在时间 $t \geq 1$ 获得的关于劳动者的信息,公司支付劳动者的对数工资为:
125
+ 公司根据掌握的劳动者信息来确定工资。具体来说:
126
+
127
+ 对于 $t \geq 1$ 时期,公司基于截至 $t-1$ 时期的产出历史 $y^{t-1}$ 来预测劳动者当前的人力资本水平 $h_t$。劳动者的对数工资设定为:
127
128
128
129
$$
129
130
w_t = g E [ h_t | y^{t-1} ], \quad t \geq 1
130
131
$$
131
132
132
- 在时间 $ 0$,支付劳动者的对数工资等于 $y_0$ 的无条件均值 :
133
+ 而在初始时期 $t= 0$,由于还没有任何历史信息,公司只能基于先验均值来设定工资 :
133
134
134
135
$$
135
136
w_0 = g \hat h_0
136
137
$$
137
138
138
- 在使用这个支付规则时,公司考虑到劳动者今天的对数产出部分来自完全由运气决定的随机成分 $v_t$,并且假设 $v_t$ 与 $ h_t$ 和 $u_t$ 独立 。
139
+ 这种工资设定方式考虑到了一个事实:劳动者的实际产出中包含一个纯随机的成分 $v_t$。这个随机成分与劳动者的人力资本 $ h_t$ 和努力水平 $u_t$ 都是相互独立的 。
139
140
140
141
## 状态空间表示
141
142
@@ -194,9 +195,9 @@ def create_worker(α=.8, β=.2, c=.2,
194
195
return WorkerModel(A=A, C=C, G=G, R=R, xhat_0=xhat_0, Σ_0=Σ_0)
195
196
```
196
197
197
- 请注意 ` WorkerModel ` namedtuple 如何创建计算相关状态空间表示 {eq}` ssrepresent ` 所需的所有对象 。
198
+ ` WorkerModel ` namedtuple 为我们创建了所有需要的对象,以便构建状态空间表示 {eq}` ssrepresent ` 。
198
199
199
- 这很方便,因为为了模拟劳动者的历史 $ \{ y_t, h_t \} $,我们需要使用 [ ` LinearStateSpace ` ] ( https://quanteconpy.readthedocs.io/en/latest/tools/lss.html ) 类为他/她形成状态空间系统 。
200
+ 这使得我们能够方便地使用 [ ` LinearStateSpace ` ] ( https://quanteconpy.readthedocs.io/en/latest/tools/lss.html ) 类来模拟劳动者的历史 $ \{ y_t, h_t \} $ 。
200
201
201
202
``` {code-cell} ipython3
202
203
# 定义 A, C, G, R, xhat_0, Σ_0
@@ -246,7 +247,7 @@ for t in range(1, T):
246
247
x_hat, Σ = kalman.x_hat, kalman.Sigma
247
248
Σ_t[:, :, t-1] = Σ
248
249
x_hat_t[:, t-1] = x_hat.reshape(-1)
249
- y_hat_t[t-1] = worker.G @ x_hat
250
+ [ y_hat_t[t-1] ] = worker.G @ x_hat
250
251
251
252
x_hat_t = np.concatenate((x[:, 1][:, np.newaxis],
252
253
x_hat_t), axis=1)
@@ -257,9 +258,9 @@ u_hat_t = x_hat_t[1, :]
257
258
258
259
对于 $h_0, u_0$ 的一个实现,我们绘制 $E y_t = G \hat x_t $,其中 $\hat x_t = E [ x_t | y^{t-1}] $。
259
260
260
- 我们还绘制 $E [ u_0 | y^{t-1}] $,这是公司基于其拥有的信息 $y^{t-1}$ 对劳动者固有的"工作伦理 " $u_0$ 的推断。
261
+ 我们还绘制 $E [ u_0 | y^{t-1}] $,这是公司基于其拥有的信息 $y^{t-1}$ 对劳动者固有的"工作努力程度 " $u_0$ 的推断。
261
262
262
- 我们可以观察公司对劳动者工作伦理的推断 $E [ u_0 | y^{t-1}] $ 如何逐渐收敛于隐藏的 $u_0$,而 $u_0$ 是公司无法直接观察到的。
263
+ 我们可以观察公司对劳动者工作努力程度的推断 $E [ u_0 | y^{t-1}] $ 如何逐渐收敛于隐藏的 $u_0$,而 $u_0$ 是公司无法直接观察到的。
263
264
264
265
``` {code-cell} ipython3
265
266
fig, ax = plt.subplots(1, 2)
@@ -284,7 +285,7 @@ plt.show()
284
285
285
286
## 一些计算实验
286
287
287
- 让我们看看 $\Sigma_0$ 和 $\Sigma_T$,以了解公司在设定的时间范围内对隐藏状态了解多少 。
288
+ 让我们看看 $\Sigma_0$ 和 $\Sigma_T$,以表示公司在设定的时间范围内对隐藏状态了解多少 。
288
289
289
290
``` {code-cell} ipython3
290
291
print(Σ_t[:, :, 0])
@@ -296,7 +297,7 @@ print(Σ_t[:, :, -1])
296
297
297
298
显然,条件协方差矩阵中的元素随时间变小。
298
299
299
- 通过在不同时间 $t$ 绘制 $E [ x_t |y^{t-1}] $ 周围的置信椭圆,我们可以生动地展示条件协方差矩阵 $\Sigma_t$ 如何演化。
300
+ 通过在不同时间 $t$ 绘制 $E [ x_t |y^{t-1}] $ 周围的置信椭圆,我们可以形象地展示条件协方差矩阵 $\Sigma_t$ 如何演化。
300
301
301
302
``` {code-cell} ipython3
302
303
# 创建用于等高线绘制的点网格
@@ -336,13 +337,13 @@ plt.tight_layout()
336
337
plt.show()
337
338
```
338
339
339
- 注意证据 $y^t$ 的积累如何随着样本量 $t$ 的增长影响置信椭圆的形状。
340
+ 注意 $y^t$ 的积累是如何随着样本量 $t$ 的增长影响置信椭圆的形状。
340
341
341
342
现在让我们使用我们的代码将隐藏状态 $x_0$ 设置为特定的向量,以观察公司如何从我们感兴趣的某个 $x_0$ 开始学习。
342
343
343
- 例如,让我们说 $h_0 = 0$ 和 $u_0 = 4$。
344
+ 例如,让我们设 $h_0 = 0$ 和 $u_0 = 4$。
344
345
345
- 这是实现这个目标的一种方式 :
346
+ 这是实现这个例子的一种方式 :
346
347
347
348
``` {code-cell} ipython3
348
349
# 例如,我们可能想要 h_0 = 0 和 u_0 = 4
@@ -364,7 +365,7 @@ print('h_0 =', h_0)
364
365
print('u_0 =', u_0)
365
366
```
366
367
367
- 实现相同目标的另一种方式是使用以下代码 :
368
+ 实现相同例子的另一种方式是使用以下代码 :
368
369
369
370
``` {code-cell} ipython3
370
371
# 如果我们想要设置初始
@@ -403,8 +404,8 @@ for t in range(1, T):
403
404
kalman.update(y[t])
404
405
x_hat, Σ = kalman.x_hat, kalman.Sigma
405
406
Σ_t.append(Σ)
406
- y_hat_t[t-1] = worker.G @ x_hat
407
- u_hat_t[t-1] = x_hat[1]
407
+ [ y_hat_t[t-1] ] = worker.G @ x_hat
408
+ [ u_hat_t[t-1] ] = x_hat[1]
408
409
409
410
410
411
# 生成 y_hat_t 和 u_hat_t 的图
@@ -440,11 +441,11 @@ hard_working_worker = create_worker(α=.4, β=.8,
440
441
print(hard_working_worker)
441
442
```
442
443
443
- 我们还可以为不同的劳动者模拟 $T = 50$ 期的系统 。
444
+ 让我们通过模拟不同劳动者在50个时期内的表现来进一步理解这个系统 。
444
445
445
- 推断的工作伦理和真实工作伦理之间的差异随时间收敛到 $0$ 。
446
+ 有趣的是,我们会发现随着时间推移,公司对劳动者真实努力程度的估计会越来越准确 - 估计值和实际值之间的差异会逐渐趋近于零 。
446
447
447
- 这表明滤波器正在逐渐教会劳动者和公司关于劳动者努力程度的信息 。
448
+ 这说明卡尔曼滤波器在帮助公司和劳动者之间建立信息沟通的桥梁,使公司对劳动者真实努力程度的估计越来越准确 。
448
449
449
450
``` {code-cell} ipython3
450
451
:tags: [hide-input]
@@ -478,11 +479,11 @@ def simulate_workers(worker, T, ax, mu_0=None, Sigma_0=None,
478
479
kalman.update(y[i])
479
480
x_hat, Σ = kalman.x_hat, kalman.Sigma
480
481
Σ_t.append(Σ)
481
- y_hat_t[i] = worker.G @ x_hat
482
- u_hat_t[i] = x_hat[1]
482
+ [ y_hat_t[i] ] = worker.G @ x_hat
483
+ [ u_hat_t[i] ] = x_hat[1]
483
484
484
485
if diff == True:
485
- title = (cjk('推断的工作伦理与真实工作伦理的差异随时间变化 ')
486
+ title = (cjk('推断的工作努力程度与真实工作努力程度的差异随时间变化 ')
486
487
if title == None else title)
487
488
488
489
ax.plot(u_hat_t - u_0, alpha=.5)
@@ -494,7 +495,7 @@ def simulate_workers(worker, T, ax, mu_0=None, Sigma_0=None,
494
495
else:
495
496
label_line = (r'$E[u_t|y^{t-1}]$' if name == None
496
497
else name)
497
- title = (cjk('推断的工作伦理随时间变化 ')
498
+ title = (cjk('推断的工作努力程度随时间变化 ')
498
499
if title == None else title)
499
500
500
501
u_hat_plot = ax.plot(u_hat_t, label=label_line)
@@ -598,4 +599,4 @@ plt.show()
598
599
599
600
## 未来扩展
600
601
601
- 我们可以通过创建新类型的劳动者,并让公司仅通过观察他们的产出历史来了解他们的隐藏(对公司来说)状态,来进行许多富有启发性的实验 。
602
+ 我们可以进行许多有趣的实验,比如创建不同类型的劳动者,让公司通过观察他们的产出历史来推断他们的隐藏特征(如能力和努力程度)。这种设置可以帮助我们理解信息不对称下的劳动力市场动态 。
0 commit comments