@@ -19,7 +19,7 @@ kernelspec:
19
19
20
20
* 正交投影和最小二乘法
21
21
22
- * Gram-Schmidt正交化过程
22
+ * 格拉姆-施密特( Gram-Schmidt)正交化
23
23
24
24
* 特征值和特征向量
25
25
41
41
42
42
* $R$是上三角矩阵
43
43
44
- 我们将使用** Gram-Schmidt正交化过程 ** 来计算QR分解
44
+ 我们将使用** 格拉姆-施密特正交化 ** 来计算QR分解
45
45
46
- 由于这个过程很有教育意义 ,我们将编写自己的Python代码来完成这项工作
46
+ 由于这个过程很有意思 ,我们将编写自己的Python代码来完成这项工作
47
47
48
- ## 格拉姆-施密特正交化过程
48
+ ## 格拉姆-施密特正交化
49
49
50
50
我们从一个** 方阵** $A$开始。
51
51
52
52
如果方阵$A$是非奇异的,那么$QR$分解是唯一的。
53
53
54
- 我们稍后会处理矩形矩阵$A$。
55
-
56
54
实际上,我们的算法也适用于非方阵的矩形矩阵$A$。
57
55
58
- ### 方阵 $A$的格拉姆-施密特过程
56
+ 我们稍后会处理矩形矩阵 $A$。
59
57
60
- 这里我们对矩阵$A$的** 列** 应用格拉姆-施密特过程。
58
+ ### 方阵$A$的格拉姆-施密特正交化
59
+
60
+ 这里我们对矩阵$A$的** 列** 运用格拉姆-施密特正交化。
61
61
62
62
具体来说,令
63
63
87
87
88
88
我们邀请读者通过验证 $e_1 \cdot e_2 = 0$ 来确认 $e_1$ 与 $e_2$ 正交。
89
89
90
- Gram-Schmidt过程继续迭代 。
90
+ 格拉姆-施密特算法过程迭代这个过程 。
91
91
92
92
因此,对于 $k= 2, \ldots, n-1$,我们构造
93
93
97
97
98
98
这里的 $(a_j \cdot e_i)$ 可以被解释为 $a_j$ 在 $e_i$ 上的线性最小二乘** 回归系数**
99
99
100
- * 它是 $a_j$ 和 $e_i$ 的内积除以 $e_i$ 的内积,其中
101
- 由于* 标准化* ,我们知道 $e_i \cdot e_i = 1$
100
+ * 它是 $a_j$ 和 $e_i$ 的内积除以 $e_i$ 的内积,其中由于* 标准化* ,我们知道 $e_i \cdot e_i = 1$
102
101
103
102
* 这个回归系数可以解释为** 协方差** 除以** 方差**
104
103
108
107
A= \left[ \begin{array}{c|c|c|c} a_1 & a_2 & \cdots & a_n \end{array} \right]=
109
108
\left[ \begin{array}{c|c|c|c} e_1 & e_2 & \cdots & e_n \end{array} \right]
110
109
\left[ \begin{matrix} a_1·e_1 & a_2·e_1 & \cdots & a_n·e_1\\ 0 & a_2·e_2 & \cdots & a_n·e_2
111
-
112
110
\\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & a_n·e_n \end{matrix} \right]
113
111
$$
114
112
115
- 因此,我们构造了分解
113
+ 因此,我们构造了矩阵分解
116
114
117
115
$$
118
116
A = Q R
128
126
且
129
127
130
128
$$
131
- R = \left[ \begin{matrix} a_1·e_1 & a_2·e_1 & \cdots & a_n·e_1\\ 0 & a_2·e_2 & \cdots & a_n·e_2
132
- \\ \ vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & a_n·e_n \end{matrix} \right]
129
+ R = \left[ \begin{matrix} a_1·e_1 & a_2·e_1 & \cdots & a_n·e_1\\ 0 & a_2·e_2 & \cdots & a_n·e_2 \\
130
+ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & a_n·e_n \end{matrix} \right]
133
131
$$
134
132
135
133
### $A$ 非方阵
141
139
$$
142
140
A= \left[ \begin{array}{c|c|c|c} a_1 & a_2 & \cdots & a_m \end{array} \right]=\left[ \begin{array}{c|c|c|c} e_1 & e_2 & \cdots & e_n \end{array} \right]
143
141
\left[ \begin{matrix} a_1·e_1 & a_2·e_1 & \cdots & a_n·e_1 & a_{n+1}\cdot e_1 & \cdots & a_{m}\cdot e_1 \\
144
-
145
142
0 & a_2·e_2 & \cdots & a_n·e_2 & a_{n+1}\cdot e_2 & \cdots & a_{m}\cdot e_2 \\ \vdots & \vdots & \ddots & \quad \vdots & \vdots & \ddots & \vdots
146
143
\\ 0 & 0 & \cdots & a_n·e_n & a_{n+1}\cdot e_n & \cdots & a_{m}\cdot e_n \end{matrix} \right]
147
144
$$
@@ -160,7 +157,7 @@ a_m & = (a_m\cdot e_1) e_1 + (a_m\cdot e_2) e_2 + \cdots + (a_m \cdot e_n) e_n
160
157
161
158
## 一些代码
162
159
163
- 现在让我们编写一些自制的Python代码,通过部署上述的Gram-Schmidt过程来实现QR分解 。
160
+ 现在让我们编写一些自制的Python代码,通过部署上述的格拉姆-施密特正交化来实现QR分解 。
164
161
165
162
``` {code-cell} ipython3
166
163
import numpy as np
@@ -193,19 +190,19 @@ def QR_Decomposition(A):
193
190
return Q, R
194
191
```
195
192
196
- 前面的代码没问题,但可以进行一些进一步的整理 。
193
+ 前面的代码没问题,但可以进一步进行整理 。
197
194
198
- 我们这样做是因为在本notebook后面部分,我们想要比较使用上面的自制代码与Python ` scipy ` 包提供的QR代码所得到的结果 。
195
+ 这样做的目的是为了后续能够将我们自制的QR分解代码与 ` scipy ` 包中的QR分解函数进行对比 。
199
196
200
197
不同的数值算法产生的$Q$和$R$矩阵之间可能存在符号差异。
201
198
202
199
由于在计算$QR$时这些符号差异会相互抵消,所以这些都是有效的QR分解。
203
200
204
- 但是,为了使我们自制函数和` scipy ` 中的QR模块的结果具有可比性 ,让我们要求$Q$具有正对角线元素。
201
+ 但是,为了使我们自制函数和` scipy ` 中QR模块的结果具有可比性 ,让我们要求$Q$具有正对角线元素。
205
202
206
203
我们通过适当调整$Q$中列的符号和$R$中行的符号来实现这一点。
207
204
208
- 为了实现这个目标,我们将定义一对函数 。
205
+ 我们将定义一对函数来完成上述要求 。
209
206
210
207
``` {code-cell} ipython3
211
208
def diag_sign(A):
@@ -218,7 +215,7 @@ def diag_sign(A):
218
215
def adjust_sign(Q, R):
219
216
"""
220
217
调整Q中列的符号和R中行的符号,
221
- 以确保Q的对角线为正
218
+ 以确保Q的正对角线属性
222
219
"""
223
220
224
221
D = diag_sign(Q)
@@ -231,13 +228,10 @@ def adjust_sign(Q, R):
231
228
232
229
## 示例
233
230
234
- 现在让我们做一个例子 。
231
+ 现在让我们举一个例子 。
235
232
236
233
``` {code-cell} ipython3
237
234
A = np.array([[1.0, 1.0, 0.0], [1.0, 0.0, 1.0], [0.0, 1.0, 1.0]])
238
- # A = np.array([[1.0, 0.5, 0.2], [0.5, 0.5, 1.0], [0.0, 1.0, 1.0]])
239
- # A = np.array([[1.0, 0.5, 0.2], [0.5, 0.5, 1.0]])
240
-
241
235
A
242
236
```
243
237
@@ -297,13 +291,13 @@ Q_scipy, R_scipy
297
291
298
292
算法如下:
299
293
300
- 1 . 设 $A_0 = A$ 并形成 $A_0 = Q_0 R_0$
294
+ 1 . 设 $A_0 = A$ 并构建 $A_0 = Q_0 R_0$
301
295
302
- 2 . 形成 $A_1 = R_0 Q_0$。注意 $A_1$ 与 $A_0$ 相似(易于验证),因此具有相同的特征值。
296
+ 2 . 构建 $A_1 = R_0 Q_0$。注意 $A_1$ 与 $A_0$ 相似(易于验证),因此具有相同的特征值。
303
297
304
- 3 . 形成 $A_1 = Q_1 R_1$ (即,形成 $A_1$ 的 $QR$ 分解)。
298
+ 3 . 构建 $A_1 = Q_1 R_1$ (即构建 $A_1$ 的 $QR$ 分解)。
305
299
306
- 4 . 形成 $A_2 = R_1 Q_1$ 然后 $A_2 = Q_2 R_2$。
300
+ 4 . 构建 $A_2 = R_1 Q_1$ 然后构建 $A_2 = Q_2 R_2$。
307
301
308
302
5 . 迭代直至收敛。
309
303
@@ -312,8 +306,7 @@ Q_scipy, R_scipy
312
306
``` {todo}
313
307
@mmcky to migrate this to use [sphinx-proof](https://sphinx-proof.readthedocs.io/en/latest/syntax.html#algorithms)
314
308
```
315
-
316
- ** 注意:** 这个算法接近于计算特征值最有效的方法之一!
309
+ ** 注意:** 这个算法实际上非常接近计算特征值最高效的方法!
317
310
318
311
让我们编写一些Python代码来尝试这个算法
319
312
@@ -345,7 +338,7 @@ def QR_eigvals(A, tol=1e-12, maxiter=1000):
345
338
开始吧
346
339
347
340
``` {code-cell} ipython3
348
- # 用一个随机A矩阵做实验
341
+ # 用一个随机矩阵A做实验
349
342
A = np.random.random((3, 3))
350
343
```
351
344
@@ -365,15 +358,15 @@ $QR$ 分解与主成分分析(PCA)之间存在一些有趣的联系。
365
358
366
359
以下是一些联系:
367
360
368
- 1 . 设 $X'$ 是一个 $k \times n$ 的随机矩阵,其中第 $j$ 列是从 ${\mathcal N}(\mu, \Sigma)$ 分布中随机抽取的样本,这里 $\mu$ 是 $k \times 1$ 的均值向量,$\Sigma$ 是 $k \times k$ 的协方差矩阵。我们需要 $n > > k$ —— 这是一个"计量经济学的例子" 。
361
+ 1 . 设 $X'$ 是一个 $k \times n$ 的随机矩阵,其中第 $j$ 列是从 ${\mathcal N}(\mu, \Sigma)$ 分布中随机抽取的样本,这里 $\mu$ 是 $k \times 1$ 的均值向量,$\Sigma$ 是 $k \times k$ 的协方差矩阵。我们需要 $n > > k$ —— 这是一个"计量经济学"的例子 。
369
362
370
363
2 . 将 $X'$ 分解为 $X' = Q R$,其中 $Q$ 是 $k \times k$ 矩阵,$R$ 是 $k \times n$ 矩阵。
371
364
372
365
3 . 计算 $R R'$ 的特征值,即我们将计算 $R R' = \tilde P \Lambda \tilde P'$。
373
366
374
367
4 . 构造 $X' X = Q \tilde P \Lambda \tilde P' Q'$ 并与特征分解 $X'X = P \hat \Lambda P'$ 进行比较。
375
368
376
- 5 . 我们将发现 $\Lambda = \hat \Lambda$ 且 $P = Q \tilde P$。
369
+ 5 . 我们应该会发现 $\Lambda = \hat \Lambda$ 且 $P = Q \tilde P$。
377
370
378
371
让我们用Python代码来验证推测5。
379
372
@@ -411,7 +404,7 @@ Q.shape, R.shape
411
404
```
412
405
413
406
414
- 现在我们可以构造 $R R^{\prime}=\tilde{P} \Lambda \tilde{P}^{\prime}$ 并形成特征分解 。
407
+ 现在我们可以构造 $R R^{\prime}=\tilde{P} \Lambda \tilde{P}^{\prime}$ 并构建特征分解 。
415
408
416
409
``` {code-cell} ipython3
417
410
RR = R @ R.T
0 commit comments