From 957b754226294047f2bbafce3fcbf2ac664f8ab0 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Fri, 7 May 2021 10:20:42 +0800 Subject: [PATCH] 2021-05-07 10:20:42 --- SUMMARY.md | 80 ++++++++---- docs/linalg/README.md | 51 ++++++++ docs/linalg/SUMMARY.md | 36 ++++++ docs/linalg/chapter01.md | 96 ++++++++++++++ docs/linalg/chapter02.md | 47 +++++++ docs/linalg/chapter03.md | 60 +++++++++ docs/linalg/chapter04.md | 81 ++++++++++++ docs/linalg/chapter05.md | 35 +++++ docs/linalg/chapter06.md | 36 ++++++ docs/linalg/chapter07.md | 151 ++++++++++++++++++++++ docs/linalg/chapter08.md | 123 ++++++++++++++++++ docs/linalg/chapter09.md | 46 +++++++ docs/linalg/chapter10.md | 114 +++++++++++++++++ docs/linalg/chapter11.md | 113 +++++++++++++++++ docs/linalg/chapter12.md | 204 ++++++++++++++++++++++++++++++ docs/linalg/chapter13.md | 55 ++++++++ docs/linalg/chapter14.md | 86 +++++++++++++ docs/linalg/chapter15.md | 154 ++++++++++++++++++++++ docs/linalg/chapter16.md | 118 +++++++++++++++++ docs/linalg/chapter17.md | 44 +++++++ docs/linalg/chapter18.md | 38 ++++++ docs/linalg/chapter19.md | 52 ++++++++ docs/linalg/chapter20.md | 53 ++++++++ docs/linalg/chapter21.md | 70 ++++++++++ docs/linalg/chapter22.md | 72 +++++++++++ docs/linalg/chapter23.md | 63 +++++++++ docs/linalg/chapter24.md | 68 ++++++++++ docs/linalg/chapter25.md | 44 +++++++ docs/linalg/chapter26.md | 40 ++++++ docs/linalg/chapter27.md | 64 ++++++++++ docs/linalg/chapter28.md | 49 +++++++ docs/linalg/chapter29.md | 56 ++++++++ docs/linalg/chapter30.md | 59 +++++++++ docs/linalg/chapter31.md | 181 ++++++++++++++++++++++++++ docs/linalg/chapter32.md | 103 +++++++++++++++ docs/linalg/chapter33.md | 68 ++++++++++ docs/linalg/chapter34.md | 67 ++++++++++ docs/linalg/chapter35.md | 98 ++++++++++++++ docs/linalg/img/chapter01_1_0.png | Bin 0 -> 8688 bytes docs/linalg/img/chapter01_4_0.png | Bin 0 -> 11244 bytes docs/linalg/img/chapter12_1_0.png | Bin 0 -> 12845 bytes docs/linalg/img/chapter12_3_0.png | Bin 0 -> 15487 bytes docs/linalg/img/chapter15_1_0.png | Bin 0 -> 9968 bytes docs/linalg/img/chapter15_4_0.png | Bin 0 -> 7783 bytes docs/linalg/img/chapter16_1_0.png | Bin 0 -> 10930 bytes docs/linalg/img/chapter31_1_0.png | Bin 0 -> 25744 bytes docs/linalg/img/chapter31_4_0.png | Bin 0 -> 12140 bytes docs/linalg/img/chapter35_1_0.png | Bin 0 -> 5987 bytes docs/linalg/img/graph_12.png | Bin 0 -> 13386 bytes docs/linalg/img/graph_15_1.png | Bin 0 -> 9968 bytes docs/linalg/img/graph_15_2.png | Bin 0 -> 7783 bytes docs/linalg/img/graph_16_1.png | Bin 0 -> 11025 bytes 52 files changed, 2953 insertions(+), 22 deletions(-) create mode 100644 docs/linalg/README.md create mode 100644 docs/linalg/SUMMARY.md create mode 100644 docs/linalg/chapter01.md create mode 100644 docs/linalg/chapter02.md create mode 100644 docs/linalg/chapter03.md create mode 100644 docs/linalg/chapter04.md create mode 100644 docs/linalg/chapter05.md create mode 100644 docs/linalg/chapter06.md create mode 100644 docs/linalg/chapter07.md create mode 100644 docs/linalg/chapter08.md create mode 100644 docs/linalg/chapter09.md create mode 100644 docs/linalg/chapter10.md create mode 100644 docs/linalg/chapter11.md create mode 100644 docs/linalg/chapter12.md create mode 100644 docs/linalg/chapter13.md create mode 100644 docs/linalg/chapter14.md create mode 100644 docs/linalg/chapter15.md create mode 100644 docs/linalg/chapter16.md create mode 100644 docs/linalg/chapter17.md create mode 100644 docs/linalg/chapter18.md create mode 100644 docs/linalg/chapter19.md create mode 100644 docs/linalg/chapter20.md create mode 100644 docs/linalg/chapter21.md create mode 100644 docs/linalg/chapter22.md create mode 100644 docs/linalg/chapter23.md create mode 100644 docs/linalg/chapter24.md create mode 100644 docs/linalg/chapter25.md create mode 100644 docs/linalg/chapter26.md create mode 100644 docs/linalg/chapter27.md create mode 100644 docs/linalg/chapter28.md create mode 100644 docs/linalg/chapter29.md create mode 100644 docs/linalg/chapter30.md create mode 100644 docs/linalg/chapter31.md create mode 100644 docs/linalg/chapter32.md create mode 100644 docs/linalg/chapter33.md create mode 100644 docs/linalg/chapter34.md create mode 100644 docs/linalg/chapter35.md create mode 100644 docs/linalg/img/chapter01_1_0.png create mode 100644 docs/linalg/img/chapter01_4_0.png create mode 100644 docs/linalg/img/chapter12_1_0.png create mode 100644 docs/linalg/img/chapter12_3_0.png create mode 100644 docs/linalg/img/chapter15_1_0.png create mode 100644 docs/linalg/img/chapter15_4_0.png create mode 100644 docs/linalg/img/chapter16_1_0.png create mode 100644 docs/linalg/img/chapter31_1_0.png create mode 100644 docs/linalg/img/chapter31_4_0.png create mode 100644 docs/linalg/img/chapter35_1_0.png create mode 100644 docs/linalg/img/graph_12.png create mode 100644 docs/linalg/img/graph_15_1.png create mode 100644 docs/linalg/img/graph_15_2.png create mode 100644 docs/linalg/img/graph_16_1.png diff --git a/SUMMARY.md b/SUMMARY.md index ad993bd3..b2cee141 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -154,25 +154,61 @@ + [十分钟上手 Pandas](docs/da/151.md) + [一维数据结构:Series](docs/da/152.md) + [二维数据结构:DataFrame](docs/da/153.md) ++ [线性代数](docs/linalg/README.md) + + [第一讲:方程组的几何解释](docs/linalg/chapter01.md) + + [第二讲:矩阵消元](docs/linalg/chapter02.md) + + [第三讲:乘法和逆矩阵](docs/linalg/chapter03.md) + + [第四讲:$A$ 的 $LU$ 分解](docs/linalg/chapter04.md) + + [第五讲:转换、置换、向量空间R](docs/linalg/chapter05.md) + + [第六讲:列空间和零空间](docs/linalg/chapter06.md) + + [第七讲:求解$Ax=0$,主变量,特解](docs/linalg/chapter07.md) + + [第八讲:求解$Ax=b$:可解性和解的结构](docs/linalg/chapter08.md) + + [第九讲:线性相关性、基、维数](docs/linalg/chapter09.md) + + [第十讲 四个基本子空间](docs/linalg/chapter10.md) + + [第十一讲:矩阵空间、秩1矩阵和小世界图](docs/linalg/chapter11.md) + + [第十二讲:图和网络](docs/linalg/chapter12.md) + + [第十三讲:复习一](docs/linalg/chapter13.md) + + [第十四讲:正交向量与子空间](docs/linalg/chapter14.md) + + [第十五讲:子空间投影](docs/linalg/chapter15.md) + + [第十六讲:投影矩阵和最小二乘](docs/linalg/chapter16.md) + + [第十七讲:正交矩阵和Gram-Schmidt正交化法](docs/linalg/chapter17.md) + + [第十八讲:行列式及其性质](docs/linalg/chapter18.md) + + [第十九讲:行列式公式和代数余子式](docs/linalg/chapter19.md) + + [第二十讲:克拉默法则、逆矩阵、体积](docs/linalg/chapter20.md) + + [第二十一讲:特征值和特征向量](docs/linalg/chapter21.md) + + [第二十二讲:对角化和$A$的幂](docs/linalg/chapter22.md) + + [第二十三讲:微分方程和$e^{At}$](docs/linalg/chapter23.md) + + [第二十四讲:马尔科夫矩阵、傅里叶级数](docs/linalg/chapter24.md) + + [第二十五讲:复习二](docs/linalg/chapter25.md) + + [第二十六讲:对称矩阵及正定性](docs/linalg/chapter26.md) + + [第二十七讲:复数矩阵和快速傅里叶变换](docs/linalg/chapter27.md) + + [第二十八讲:正定矩阵和最小值](docs/linalg/chapter28.md) + + [第二十九讲:相似矩阵和若尔当形](docs/linalg/chapter29.md) + + [第三十讲:奇异值分解](docs/linalg/chapter30.md) + + [第三十一讲:线性变换及对应矩阵](docs/linalg/chapter31.md) + + [第三十二讲:基变换和图像压缩](docs/linalg/chapter32.md) + + [第三十三讲:单元检测3复习](docs/linalg/chapter33.md) + + [第三十四讲:左右逆和伪逆](docs/linalg/chapter34.md) + + [第三十五讲:期末复习](docs/linalg/chapter35.md) + 机器学习 - + [第1章_基础知识](docs/ml/1.md) - + [第2章_K近邻算法](docs/ml/2.md) - + [第3章_决策树算法](docs/ml/3.md) - + [第4章_朴素贝叶斯](docs/ml/4.md) - + [第5章_逻辑回归](docs/ml/5.md) - + [第6章_支持向量机](docs/ml/6.md) - + [第7章_集成方法](docs/ml/7.md) - + [第8章_回归](docs/ml/8.md) - + [第9章_树回归](docs/ml/9.md) - + [第10章_KMeans聚类](docs/ml/10.md) - + [第11章_Apriori算法](docs/ml/11.md) - + [第12章_FP-growth算法](docs/ml/12.md) - + [第13章_PCA降维](docs/ml/13.md) - + [第14章_SVD简化数据](docs/ml/14.md) - + [第15章_大数据与MapReduce](docs/ml/15.md) - + [第16章_推荐系统](docs/ml/16.md) - + [为何录制教学版视频](docs/why-to-record-study-ml-video.md) - + [2017-04-08_第一期的总结](docs/report/2017-04-08.md) + + [第1章_基础知识](docs/ml/1.md) + + [第2章_K近邻算法](docs/ml/2.md) + + [第3章_决策树算法](docs/ml/3.md) + + [第4章_朴素贝叶斯](docs/ml/4.md) + + [第5章_逻辑回归](docs/ml/5.md) + + [第6章_支持向量机](docs/ml/6.md) + + [第7章_集成方法](docs/ml/7.md) + + [第8章_回归](docs/ml/8.md) + + [第9章_树回归](docs/ml/9.md) + + [第10章_KMeans聚类](docs/ml/10.md) + + [第11章_Apriori算法](docs/ml/11.md) + + [第12章_FP-growth算法](docs/ml/12.md) + + [第13章_PCA降维](docs/ml/13.md) + + [第14章_SVD简化数据](docs/ml/14.md) + + [第15章_大数据与MapReduce](docs/ml/15.md) + + [第16章_推荐系统](docs/ml/16.md) + + [为何录制教学版视频](docs/why-to-record-study-ml-video.md) + + [2017-04-08_第一期的总结](docs/report/2017-04-08.md) + [PyTorch](docs/pytorch/README.md) + [PyTorch 简介](docs/pytorch/01.md) + [1.1 – Why PyTorch?](docs/pytorch/02.md) @@ -201,10 +237,10 @@ + [5.3 – Dropout 防止过拟合](docs/pytorch/25.md) + [5.4 – Batch Normalization 批标准化](docs/pytorch/26.md) + 深度学习入门 - + [反向传递](docs/dl/反向传递.md) - + [CNN原理](docs/dl/CNN原理.md) - + [RNN原理](docs/dl/RNN原理.md) - + [LSTM原理](docs/dl/LSTM原理.md) + + [反向传递](docs/dl/反向传递.md) + + [CNN原理](docs/dl/CNN原理.md) + + [RNN原理](docs/dl/RNN原理.md) + + [LSTM原理](docs/dl/LSTM原理.md) + [自然语言处理](docs/nlp/README.md) + [前言](docs/nlp/0.md) + [1 语言处理与 Python](docs/nlp/1.md) diff --git a/docs/linalg/README.md b/docs/linalg/README.md new file mode 100644 index 00000000..0d293770 --- /dev/null +++ b/docs/linalg/README.md @@ -0,0 +1,51 @@ +# MIT 18.06 线性代数笔记 + +> 课程:[麻省理工公开课:线性代数](http://open.163.com/special/opencourse/daishu.html) +> +> 作者:[子实](https://github.com/zlotus) +> +> 通过代码行数衡量开发进程就好比用重量来衡量飞机制造进度。——比尔·盖茨 + +* [在线阅读](https://linalg.apachecn.org) +* [在线阅读(Gitee)](https://apachecn.gitee.io/mit-18.06-linalg-notes/) +* [ApacheCN 机器学习交流群 629470233](http://shang.qq.com/wpa/qunwpa?idkey=30e5f1123a79867570f665aa3a483ca404b1c3f77737bc01ec520ed5f078ddef) +* [ApacheCN 学习资源](http://www.apachecn.org/) + +## 联系方式 + +### 负责人 + +* [飞龙](https://github.com/wizardforcel): 562826179 + +### 其他 + +* 在我们的 [apachecn/mit-18.06-linalg-notes](https://github.com/apachecn/mit-18.06-linalg-notes) github 上提 issue. +* 发邮件到 Email: `apachecn@163.com`. +* 在我们的 [组织学习交流群](http://www.apachecn.org/organization/348.html) 中联系群主/管理员即可. + + +## 下载 + +### PYPI + +``` +pip install mit-18.06-linalg-notes +mit-18.06-linalg-notes +# 访问 http://localhost:{port} 查看文档 +``` + +### NPM + +``` +npm install -g mit-yiba-lingliu-linalg-notes +mit-yiba-lingliu-linalg-notes +# 访问 http://localhost:{port} 查看文档 +``` + +### Docker + +``` +docker pull apachecn0/mit-18-06-linalg-notes +docker run -tid -p :80 apachecn0/mit-18-06-linalg-notes +# 访问 http://localhost:{port} 查看文档 +``` diff --git a/docs/linalg/SUMMARY.md b/docs/linalg/SUMMARY.md new file mode 100644 index 00000000..d9c03775 --- /dev/null +++ b/docs/linalg/SUMMARY.md @@ -0,0 +1,36 @@ ++ [MIT 18.06 线性代数笔记](README.md) ++ [第一讲:方程组的几何解释](chapter01.md) ++ [第二讲:矩阵消元](chapter02.md) ++ [第三讲:乘法和逆矩阵](chapter03.md) ++ [第四讲:$A$ 的 $LU$ 分解](chapter04.md) ++ [第五讲:转换、置换、向量空间R](chapter05.md) ++ [第六讲:列空间和零空间](chapter06.md) ++ [第七讲:求解$Ax=0$,主变量,特解](chapter07.md) ++ [第八讲:求解$Ax=b$:可解性和解的结构](chapter08.md) ++ [第九讲:线性相关性、基、维数](chapter09.md) ++ [第十讲 四个基本子空间](chapter10.md) ++ [第十一讲:矩阵空间、秩1矩阵和小世界图](chapter11.md) ++ [第十二讲:图和网络](chapter12.md) ++ [第十三讲:复习一](chapter13.md) ++ [第十四讲:正交向量与子空间](chapter14.md) ++ [第十五讲:子空间投影](chapter15.md) ++ [第十六讲:投影矩阵和最小二乘](chapter16.md) ++ [第十七讲:正交矩阵和Gram-Schmidt正交化法](chapter17.md) ++ [第十八讲:行列式及其性质](chapter18.md) ++ [第十九讲:行列式公式和代数余子式](chapter19.md) ++ [第二十讲:克拉默法则、逆矩阵、体积](chapter20.md) ++ [第二十一讲:特征值和特征向量](chapter21.md) ++ [第二十二讲:对角化和$A$的幂](chapter22.md) ++ [第二十三讲:微分方程和$e^{At}$](chapter23.md) ++ [第二十四讲:马尔科夫矩阵、傅里叶级数](chapter24.md) ++ [第二十五讲:复习二](chapter25.md) ++ [第二十六讲:对称矩阵及正定性](chapter26.md) ++ [第二十七讲:复数矩阵和快速傅里叶变换](chapter27.md) ++ [第二十八讲:正定矩阵和最小值](chapter28.md) ++ [第二十九讲:相似矩阵和若尔当形](chapter29.md) ++ [第三十讲:奇异值分解](chapter30.md) ++ [第三十一讲:线性变换及对应矩阵](chapter31.md) ++ [第三十二讲:基变换和图像压缩](chapter32.md) ++ [第三十三讲:单元检测3复习](chapter33.md) ++ [第三十四讲:左右逆和伪逆](chapter34.md) ++ [第三十五讲:期末复习](chapter35.md) diff --git a/docs/linalg/chapter01.md b/docs/linalg/chapter01.md new file mode 100644 index 00000000..98aeda7b --- /dev/null +++ b/docs/linalg/chapter01.md @@ -0,0 +1,96 @@ + +# 第一讲:方程组的几何解释 + +我们从求解线性方程组来开始这门课,从一个普通的例子讲起:方程组有$2$个未知数,一共有$2$个方程,分别来看方程组的“行图像”和“列图像”。 + +有方程组$\begin{cases}2x&-y&=0\\-x&+2y&=3\end{cases}$,写作矩阵形式有$\begin{bmatrix}2&-1\\-1&2\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}0\\3\end{bmatrix}$,通常我们把第一个矩阵称为系数矩阵$A$,将第二个矩阵称为向量$x$,将第三个矩阵称为向量$b$,于是线性方程组可以表示为$Ax=b$。 + +我们来看行图像,即直角坐标系中的图像: + + +```python +%matplotlib inline +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import seaborn as sns + +x = [-2, 2, -2, 2] +y = [-4, 4, 0.5, 2.5] + +fig = plt.figure() +plt.axhline(y=0, c='black') +plt.axvline(x=0, c='black') + +plt.plot(x[:2], y[:2], x[2:], y[2:]) + +plt.draw() +``` + + +![png](img/chapter01_1_0.png) + + + +```python +plt.close(fig) +``` + +上图是我们都很熟悉的直角坐标系中两直线相交的情况,接下来我们按列观察方程组$x\begin{bmatrix}2\\-1\end{bmatrix}+y\begin{bmatrix}-1\\2\end{bmatrix}=\begin{bmatrix}0\\3\end{bmatrix}$(我们把第一个向量称作$col_1$,第二个向量称作$col_2$,以表示第一列向量和第二列向量),要使得式子成立,需要第一个向量加上两倍的第二个向量,即$1\begin{bmatrix}2\\-1\end{bmatrix}+2\begin{bmatrix}-1\\2\end{bmatrix}=\begin{bmatrix}0\\3\end{bmatrix}$。 + +现在来看列图像,在二维平面上画出上面的列向量: + + +```python +from functools import partial + +fig = plt.figure() +plt.axhline(y=0, c='black') +plt.axvline(x=0, c='black') +ax = plt.gca() +ax.set_xlim(-2.5, 2.5) +ax.set_ylim(-3, 4) + +arrow_vector = partial(plt.arrow, width=0.01, head_width=0.1, head_length=0.2, length_includes_head=True) + +arrow_vector(0, 0, 2, -1, color='g') +arrow_vector(0, 0, -1, 2, color='c') +arrow_vector(2, -1, -2, 4, color='b') +arrow_vector(0, 0, 0, 3, width=0.05, color='r') + +plt.draw() +``` + + +![png](img/chapter01_4_0.png) + + + +```python +plt.close(fig) +``` + +如图,绿向量$col_1$与蓝向量(两倍的蓝绿向量$col_2$)合成红向量$b$。 + +接着,我们继续观察$x\begin{bmatrix}2\\-1\end{bmatrix}+y\begin{bmatrix}-1\\2\end{bmatrix}=\begin{bmatrix}0\\3\end{bmatrix}$,$col_1,col_2$的某种线性组合得到了向量$b$,那么$col_1,col_2$的所有线性组合能够得到什么结果?它们将铺满整个平面。 + +下面进入三个未知数的方程组:$\begin{cases}2x&-y&&=0\\-x&+2y&-z&=-1\\&-3y&+4z&=4\end{cases}$,写作矩阵形式$A=\begin{bmatrix}2&-1&0\\-1&2&-1\\0&-3&4\end{bmatrix},\ b=\begin{bmatrix}0\\-1\\4\end{bmatrix}$。 + +在三维直角坐标系中,每一个方程将确定一个平面,而例子中的三个平面会相交于一点,这个点就是方程组的解。 + +同样的,将方程组写成列向量的线性组合,观察列图像:$x\begin{bmatrix}2\\-1\\0\end{bmatrix}+y\begin{bmatrix}-1\\2\\-3\end{bmatrix}+z\begin{bmatrix}0\\-1\\4\end{bmatrix}=\begin{bmatrix}0\\-1\\4\end{bmatrix}$。易知教授特意安排的例子中最后一个列向量恰巧等于等式右边的$b$向量,所以我们需要的线性组合为$x=0,y=0,z=1$。假设我们令$b=\begin{bmatrix}1\\1\\-3\end{bmatrix}$,则需要的线性组合为$x=1,y=1,z=0$。 + +我们并不能总是这么轻易的求出正确的线性组合,所以下一讲将介绍消元法——一种线性方程组的系统性解法。 + +现在,我们需要考虑,对于任意的$b$,是否都能求解$Ax=b$?用列向量线性组合的观点阐述就是,列向量的线性组合能否覆盖整个三维向量空间?对上面这个例子,答案是肯定的,这个例子中的$A$是我们喜欢的矩阵类型,但是对另一些矩阵,答案是否定的。那么在什么情况下,三个向量的线性组合得不到$b$? + +——如果三个向量在同一个平面上,问题就出现了——那么他们的线性组合也一定都在这个平面上。举个例子,比如$col_3=col_1+col_2$,那么不管怎么组合,这三个向量的结果都逃不出这个平面,因此当$b$在平面内,方程组有解,而当$b$不在平面内,这三个列向量就无法构造出$b$。在后面的课程中,我们会了解到这种情形称为**奇异**、**矩阵不可逆**。 + +下面我们推广到九维空间,每个方程有九个未知数,共九个方程,此时已经无法从坐标图像中描述问题了,但是我们依然可以从求九维列向量线性组合的角度解决问题,仍然是上面的问题,是否总能得到$b$?当然这仍取决于这九个向量,如果我们取一些并不相互独立的向量,则答案是否定的,比如取了九列但其实只相当于八列,有一列毫无贡献(这一列是前面列的某种线性组合),则会有一部分$b$无法求得。 + +接下来介绍方程的矩阵形式$Ax=b$,这是一种乘法运算,举个例子,取$A=\begin{bmatrix}2&5\\1&3\end{bmatrix},\ x=\begin{bmatrix}1\\2\end{bmatrix}$,来看如何计算矩阵乘以向量: + +* 我们依然使用列向量线性组合的方式,一次计算一列,$\begin{bmatrix}2&5\\1&3\end{bmatrix}\begin{bmatrix}1\\2\end{bmatrix}=1\begin{bmatrix}2\\1\end{bmatrix}+2\begin{bmatrix}5\\3\end{bmatrix}=\begin{bmatrix}12\\7\end{bmatrix}$ +* 另一种方法,使用向量内积,矩阵第一行向量点乘$x$向量$\begin{bmatrix}2&5\end{bmatrix}\cdot\begin{bmatrix}1&2\end{bmatrix}^T=12,\ \begin{bmatrix}1&3\end{bmatrix}\cdot\begin{bmatrix}1&2\end{bmatrix}^T=7$。 + +教授建议使用第一种方法,将$Ax$看做$A$列向量的线性组合。 diff --git a/docs/linalg/chapter02.md b/docs/linalg/chapter02.md new file mode 100644 index 00000000..1f80daa4 --- /dev/null +++ b/docs/linalg/chapter02.md @@ -0,0 +1,47 @@ + +# 第二讲:矩阵消元 + +这个方法最早由高斯提出,我们以前解方程组的时候都会使用,现在来看如何使用矩阵实现消元法。 + +## 消元法 + +有三元方程组$\begin{cases}x&+2y&+z&=2\\3x&+8y&+z&=12\\&4y&+z&=2\end{cases}$,对应的矩阵形式$Ax=b$为$\begin{bmatrix}1&2&1\\3&8&1\\0&4&1\end{bmatrix}\begin{bmatrix}x\\y\\z\end{bmatrix}=\begin{bmatrix}2\\12\\2\end{bmatrix}$。 + +按照我们以前做消元法的思路: + +* 第一步,我们希望在第二个方程中消去$x$项,来操作系数矩阵$A=\begin{bmatrix}\underline{1}&2&1\\3&8&1\\0&4&1\end{bmatrix}$,下划线的元素为第一步的主元(pivot):$\begin{bmatrix}\underline{1}&2&1\\3&8&1\\0&4&1\end{bmatrix}\xrightarrow{row_2-3row_1}\begin{bmatrix}\underline{1}&2&1\\0&2&-2\\0&4&1\end{bmatrix}$ + + 这里我们先不管$b$向量,等做完$A$的消元可以再做$b$的消元。(这是MATLAB等工具经常使用的算法。) +* 第二步,我们希望在第三个方程中消去$y$项,现在第二行第一个非零元素成为了第二个主元:$\begin{bmatrix}\underline{1}&2&1\\0&\underline{2}&-2\\0&4&1\end{bmatrix}\xrightarrow{row_3-2row_2}\begin{bmatrix}\underline{1}&2&1\\0&\underline{2}&-2\\0&0&\underline{5}\end{bmatrix}$ + + 注意到第三行消元过后仅剩一个非零元素,所以它就成为第三个主元。做到这里就算消元完成了。 + +再来讨论一下消元失效的情形:首先,主元不能为零;其次,如果在消元时遇到主元位置为零,则需要交换行,使主元不为零;最后提一下,如果我们把第三个方程$z$前的系数改成$-4$,会导致第二步消元时最后一行全部为零,则第三个主元就不存在了,至此消元不能继续进行了,这就是下一讲中涉及的不可逆情况。 + +* 接下来就该回代(back substitution)了,这时我们在$A$矩阵后面加上$b$向量写成增广矩阵(augmented matrix)的形式:$\left[\begin{array}{c|c}A&b\end{array}\right]=\left[\begin{array}{ccc|c}1&2&1&2\\3&8&1&12\\0&4&1&2\end{array}\right]\to\left[\begin{array}{ccc|c}1&2&1&2\\0&2&-2&6\\0&4&1&2\end{array}\right]\to\left[\begin{array}{ccc|c}1&2&1&2\\0&2&-2&6\\0&0&5&-10\end{array}\right]$ + + 不难看出,$z$的解已经出现了,此时方程组变为$\begin{cases}x&+2y&+z&=2\\&2y&-2z&=6\\&&5z&=-10\end{cases}$,从第三个方程求出$z=-2$,代入第二个方程求出$y=1$,再代入第一个方程求出$x=2$。 + +## 消元矩阵 + +上一讲我们学习了矩阵乘以向量的方法,有三个列向量的矩阵乘以另一个向量,按列的线性组合可以写作$\Bigg[v_1\ v_2\ v_3\Bigg]\begin{bmatrix}3\\4\\5\end{bmatrix}=3v_1+4v_2+5v_3$。 + +但现在我们希望用矩阵乘法表示行操作,则有$\begin{bmatrix}1&2&7\end{bmatrix}\begin{bmatrix}&row_1&\\&row_2&\\&row_3&\end{bmatrix}=1row_1+2row_2+7row_3$。易看出这里是一个行向量从左边乘以矩阵,这个行向量按行操作矩阵的行向量,并将其合成为一个矩阵行向量的线性组合。 + +介绍到这里,我们就可以将消元法所做的行操作写成向量乘以矩阵的形式了。 + +* 消元法第一步操作为将第二行改成$row_2-3row_1$,其余两行不变,则有$\begin{bmatrix}1&0&0\\-3&1&0\\0&0&1\end{bmatrix}\begin{bmatrix}1&2&1\\3&8&1\\0&4&1\end{bmatrix}=\begin{bmatrix}1&2&1\\0&2&-2\\0&4&1\end{bmatrix}$(另外,如果三行都不变,消元矩阵就是单位矩阵$I=\begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix}$,$I$之于矩阵运算相当于$1$之于四则运算。)这个消元矩阵我们记作$E_{21}$,即将第二行第一个元素变为零。 + +* 接下来就是求$E_{32}$消元矩阵了,即将第三行第二个元素变为零,则$\begin{bmatrix}1&0&0\\0&1&0\\0&-2&1\end{bmatrix}\begin{bmatrix}1&2&1\\0&2&-2\\0&4&1\end{bmatrix}=\begin{bmatrix}1&2&1\\0&2&-2\\0&0&5\end{bmatrix}$。这就是消元所用的两个初等矩阵(elementary matrix)。 + +* 最后,我们将这两步综合起来,即$E_{32}(E_{21}A)=U$,也就是说如果我们想从$A$矩阵直接得到$U$矩阵的话,只需要$(E_{32}E_{21})A$即可。注意,矩阵乘法虽然不能随意变动相乘次序,但是可以变动括号位置,也就是满足结合律(associative law),而结合律在矩阵运算中非常重要,很多定理的证明都需要巧妙的使用结合律。 + +既然提到了消元用的初等矩阵,那我们再介绍一种用于置换两行的矩阵:置换矩阵(permutation matrix):例如$\begin{bmatrix}0&1\\1&0\end{bmatrix}\begin{bmatrix}a&b\\c&d\end{bmatrix}=\begin{bmatrix}c&d\\a&b\end{bmatrix}$,置换矩阵将原矩阵的两行做了互换。顺便提一下,如果我们希望交换两列,则有$\begin{bmatrix}a&b\\c&d\end{bmatrix}\begin{bmatrix}0&1\\1&0\end{bmatrix}=\begin{bmatrix}b&a\\d&c\end{bmatrix}$。 + +我们现在能够将$A$通过行变换写成$U$,那么如何从$U$再变回$A$,也就是求消元的逆运算。对某些“坏”矩阵,并没有逆,而本讲的例子都是“好”矩阵。 + +## 逆 + +现在,我们以$E_{21}$为例,$\Bigg[\quad ?\quad \Bigg]\begin{bmatrix}1&0&0\\-3&1&0\\0&0&1\end{bmatrix}=\begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix}$,什么矩阵可以取消这次行变换?这次变换是从第二行中减去三倍的第一行,那么其逆变换就是给第二行加上三倍的第一行,所以逆矩阵就是$\begin{bmatrix}1&0&0\\3&1&0\\0&0&1\end{bmatrix}$。 + +我们把矩阵$E$的逆记作$E^{-1}$,所以有$E^{-1}E=I$。 diff --git a/docs/linalg/chapter03.md b/docs/linalg/chapter03.md new file mode 100644 index 00000000..5f2938f6 --- /dev/null +++ b/docs/linalg/chapter03.md @@ -0,0 +1,60 @@ + +# 第三讲:乘法和逆矩阵 + +上一讲大概介绍了矩阵乘法和逆矩阵,本讲就来做进一步说明。 + +## 矩阵乘法 + +* 行列内积:有$m\times n$矩阵$A$和$n\times p$矩阵$B$($A$的总列数必须与$B$的总行数相等),两矩阵相乘有$AB=C$,$C$是一个$m\times p$矩阵,对于$C$矩阵中的第$i$行第$j$列元素$c_{ij}$,有: + + $$c_{ij}=row_i\cdot column_j=\sum_{k=i}^na_{ik}b_{kj}$$ + + 其中$a_{ik}$是$A$矩阵的第$i$行第$k$列元素,$b_{kj}$是$B$矩阵的第$k$行第$j$列元素。 + + 可以看出$c_{ij}$其实是$A$矩阵第$i$行点乘$B$矩阵第$j$列 $\begin{bmatrix}&\vdots&\\&row_i&\\&\vdots&\end{bmatrix}\begin{bmatrix}&&\\\cdots&column_j&\cdots\\&&\end{bmatrix}=\begin{bmatrix}&\vdots&\\\cdots&c_{ij}&\cdots\\&\vdots&\end{bmatrix}$ + +* 整列相乘:上一讲我们知道了如何计算矩阵乘以向量,而整列相乘就是使用这种线性组合的思想: + + $\begin{bmatrix}&&\\A_{col1}&A_{col2}&\cdots&A_{coln}\\&&\end{bmatrix}\begin{bmatrix}\cdots&b_{1j}&\cdots\\\cdots&b_{2j}&\cdots\\\cdots&\vdots&\cdots\\\cdots&b_{nj}&\cdots\\\end{bmatrix}=\begin{bmatrix}&&\\\cdots&\left(b_{1j}A_{col1}+b_{2j}A_{col2}+\cdots+b_{nj}A_{coln}\right)&\cdots\\&&\end{bmatrix}$ + + 上面的运算为$B$的第$j$个列向量右乘矩阵$A$,求得的结果就是$C$矩阵的第$j$列,即$C$的第$j$列是$A$的列向量以$B$的第$j$列作为系数所求得的线性组合,$C_j=b_{1j}A_{col1}+b_{2j}A_{col2}+\cdots+b_{nj}A_{coln}$。 + +* 整行相乘:同样的,也是利用行向量线性组合的思想: + + $\begin{bmatrix}\vdots&\vdots&\vdots&\vdots\\a_{i1}&a_{i2}&\cdots&a_{in}\\\vdots&\vdots&\vdots&\vdots\end{bmatrix}\begin{bmatrix}&B_{row1}&\\&B_{row2}&\\&\vdots&\\&B_{rown}&\end{bmatrix}=\begin{bmatrix}\vdots\\\left(a_{i1}B_{row1}+a_{i2}B_{row2}+\cdots+a_{in}B_{rown}\right)\\\vdots\end{bmatrix}$ + + 上面的运算为$A$的第$i$个行向量左乘矩阵$B$,求得的结果就是$C$矩阵的第$i$行,即$C$的第$i$行是$B$的行向量以$A$的第$i$行作为系数所求的的线性组合,$C_i=a_{i1}B_{row1}+a_{i2}B_{row2}+\cdots+a_{in}B_{rown}$。 + +* 列乘以行:用$A$矩阵的列乘以$B$矩阵的行,得到的矩阵相加即可: + + $\begin{bmatrix}&&\\A_{col1}&A_{col2}&\cdots&A_{coln}\\&&\end{bmatrix}\begin{bmatrix}&B_{row1}&\\&B_{row2}&\\&\vdots&\\&B_{rown}&\end{bmatrix}=A_{col1}B_{row1}+A_{col2}B_{row2}+\cdots+A_{coln}B_{rown}$ + + 注意,$A_{coli}B_{rowi}$是一个$m\times 1$向量乘以一个$1\times p$向量,其结果是一个$m\times p$矩阵,而所有的$m\times p$矩阵之和就是计算结果。 + +* 分块乘法:$\left[\begin{array}{c|c}A_1&A_2\\\hline A_3&A_4\end{array}\right]\left[\begin{array}{c|c}B_1&B_2\\\hline B_3&B_4\end{array}\right]=\left[\begin{array}{c|c}A_1B_1+A_2B_3&A_1B_2+A_2B_4\\\hline A_3B_1+A_4B_3&A_3B_2+A_4B_4\end{array}\right]$ + + 在分块合适的情况下,可以简化运算。 + +## 逆(方阵) + +首先,并不是所有的方阵都有逆;而如果逆存在,则有$A^{-1}A=I=AA^{-1}$。教授这里提前剧透,对于方阵,左逆和右逆是相等的,但是对于非方阵(长方形矩阵),其左逆不等于右逆。 + +对于这些有逆的矩阵,我们称其为可逆的或非奇异的。我们先来看看奇异矩阵(不可逆的):$A=\begin{bmatrix}1&2\\3&6\end{bmatrix}$,在后面将要学习的行列式中,会发现这个矩阵的行列式为$0$。 + +观察这个方阵,我们如果用另一个矩阵乘$A$,则得到的结果矩阵中的每一列应该都是$\begin{bmatrix}1\\2\end{bmatrix}$的倍数,所以我们不可能从$AB$的乘积中得到单位矩阵$I$。 + +另一种判定方法,如果存在非零向量$x$,使得$Ax=0$,则矩阵$A$不可逆。我们来用上面的矩阵为例:$\begin{bmatrix}1&2\\3&6\end{bmatrix}\begin{bmatrix}3\\-1\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}$。 + +证明:如果对于非零的$x$仍有$Ax=0$,而$A$有逆$A^{-1}$,则$A^{-1}Ax=0$,即$x=0$,与题设矛盾,得证。 + +现在来看看什么矩阵有逆,设$A=\begin{bmatrix}1&3\\2&7\end{bmatrix}$,我们来求$A^{-1}$。$\begin{bmatrix}1&3\\2&7\end{bmatrix}\begin{bmatrix}a&b\\c&d\end{bmatrix}=\begin{bmatrix}1&0\\0&1\end{bmatrix}$,使用列向量线性组合的思想,我们可以说$A$乘以$A^{-1}$的第$j$列,能够得到$I$的第$j$列,这时我会得到一个关于列的方程组。 + +接下来介绍高斯-若尔当(Gauss-Jordan)方法,该方法可以一次处理所有的方程: + +* 这个方程组为$\begin{cases}\begin{bmatrix}1&3\\2&7\end{bmatrix}\begin{bmatrix}a\\b\end{bmatrix}=\begin{bmatrix}1\\0\end{bmatrix}\\\begin{bmatrix}1&3\\2&7\end{bmatrix}\begin{bmatrix}c\\d\end{bmatrix}=\begin{bmatrix}0\\1\end{bmatrix}\end{cases}$,我们想要同时解这两个方程; + +* 构造这样一个矩阵$\left[\begin{array}{cc|cc}1&3&1&0\\2&7&0&1\end{array}\right]$,接下来用消元法将左侧变为单位矩阵; +* $\left[\begin{array}{cc|cc}1&3&1&0\\2&7&0&1\end{array}\right]\xrightarrow{row_2-2row_1}\left[\begin{array}{cc|cc}1&3&1&0\\0&1&-2&1\end{array}\right]\xrightarrow{row_1-3row_2}\left[\begin{array}{cc|cc}1&0&7&-3\\0&1&-2&1\end{array}\right]$ +* 于是,我们就将矩阵从$\left[\begin{array}{c|c}A&I\end{array}\right]$变为$\left[\begin{array}{c|c}I&A^{-1}\end{array}\right]$ + +而高斯-若尔当法的本质是使用消元矩阵$E$,对$A$进行操作,$E\left[\begin{array}{c|c}A&I\end{array}\right]$,利用一步步消元有$EA=I$,进而得到$\left[\begin{array}{c|c}I&E\end{array}\right]$,其实这个消元矩阵$E$就是$A^{-1}$,而高斯-若尔当法中的$I$只是负责记录消元的每一步操作,待消元完成,逆矩阵就自然出现了。 diff --git a/docs/linalg/chapter04.md b/docs/linalg/chapter04.md new file mode 100644 index 00000000..4a5b5d0a --- /dev/null +++ b/docs/linalg/chapter04.md @@ -0,0 +1,81 @@ + +# 第四讲:$A$ 的 $LU$ 分解 + +$AB$的逆矩阵: +$$ +\begin{aligned} +A \cdot A^{-1} = I & = A^{-1} \cdot A\\ +(AB) \cdot (B^{-1}A^{-1}) & = I\\ +\textrm{则} AB \textrm{的逆矩阵为} & B^{-1}A^{-1} +\end{aligned} +$$ + +$A^{T}$的逆矩阵: +$$ +\begin{aligned} +(A \cdot A^{-1})^{T} & = I^{T}\\ +(A^{-1})^{T} \cdot A^{T} & = I\\ +\textrm{则} A^{T} \textrm{的逆矩阵为} & (A^{-1})^{T} +\end{aligned} +$$ + +## 将一个 $n$ 阶方阵 $A$ 变换为 $LU$ 需要的计算量估计: + +1. 第一步,将$a_{11}$作为主元,需要的运算量约为$n^2$ +$$ +\begin{bmatrix} +a_{11} & a_{12} & \cdots & a_{1n} \\ +a_{21} & a_{22} & \cdots & a_{2n} \\ +\vdots & \vdots & \ddots & \vdots \\ +a_{n1} & a_{n2} & \cdots & a_{nn} \\ +\end{bmatrix} +\underrightarrow{消元} +\begin{bmatrix} +a_{11} & a_{12} & \cdots & a_{1n} \\ +0 & a_{22} & \cdots & a_{2n} \\ +0 & \vdots & \ddots & \vdots \\ +0 & a_{n2} & \cdots & a_{nn} \\ +\end{bmatrix} +$$ + +2. 以此类推,接下来每一步计算量约为$(n-1)^2、(n-2)^2、\cdots、2^2、1^2$。 + +3. 则将 $A$ 变换为 $LU$ 的总运算量应为$O(n^2+(n-1)^2+\cdots+2^2+1^2)$,即$O(\frac{n^3}{3})$。 + +置换矩阵(Permutation Matrix): + +3阶方阵的置换矩阵有6个: +$$ +\begin{bmatrix} +1 & 0 & 0 \\ +0 & 1 & 0 \\ +0 & 0 & 1 \\ +\end{bmatrix} +\begin{bmatrix} +0 & 1 & 0 \\ +1 & 0 & 0 \\ +0 & 0 & 1 \\ +\end{bmatrix} +\begin{bmatrix} +0 & 0 & 1 \\ +0 & 1 & 0 \\ +1 & 0 & 0 \\ +\end{bmatrix} +\begin{bmatrix} +1 & 0 & 0 \\ +0 & 0 & 1 \\ +0 & 1 & 0 \\ +\end{bmatrix} +\begin{bmatrix} +0 & 1 & 0 \\ +0 & 0 & 1 \\ +1 & 0 & 0 \\ +\end{bmatrix} +\begin{bmatrix} +0 & 0 & 1 \\ +1 & 0 & 0 \\ +0 & 1 & 0 \\ +\end{bmatrix} +$$ + +$n$阶方阵的置换矩阵有$\binom{n}{1}=n!$个。 diff --git a/docs/linalg/chapter05.md b/docs/linalg/chapter05.md new file mode 100644 index 00000000..858fb1e0 --- /dev/null +++ b/docs/linalg/chapter05.md @@ -0,0 +1,35 @@ + +# 第五讲:转换、置换、向量空间R + +## 置换矩阵(Permutation Matrix) + +$P$为置换矩阵,对任意可逆矩阵$A$有: + +$PA=LU$ + +$n$阶方阵的置换矩阵$P$有$\binom{n}{1}=n!$个 + +对置换矩阵$P$,有$P^TP = I$ + +即$P^T = P^{-1} +## 转置矩阵(Transpose Matrix) + +$(A^T)_{ij} = (A)_{ji}$ + +## 对称矩阵(Symmetric Matrix) + +$A^T$ = $A$ + +对任意矩阵$R$有$R^TR$为对称矩阵: + +$$ +(R^TR)^T = (R)^T(R^T)^T = R^TR\\ +\textrm{即}(R^TR)^T = R^TR +$$ + +## 向量空间(Vector Space) + +所有向量空间都必须包含原点(Origin); + +向量空间中任意向量的数乘、求和运算得到的向量也在该空间中。 +即向量空间要满足加法封闭和数乘封闭。 diff --git a/docs/linalg/chapter06.md b/docs/linalg/chapter06.md new file mode 100644 index 00000000..98fcd703 --- /dev/null +++ b/docs/linalg/chapter06.md @@ -0,0 +1,36 @@ + +# 第六讲:列空间和零空间 + +对向量子空间$S$和$T$,有$S \cap T$也是向量子空间。 + +对$m \times n$矩阵$A$,$n \times 1$矩阵$x$,$m \times 1$矩阵$b$,运算$Ax=b$: + +$$ +\begin{bmatrix} +a_{11} & a_{12} & \cdots & a_{1(n-1)} & a_{1n} \\ +a_{21} & a_{22} & \cdots & a_{2(n-1)} & a_{2n} \\ +\vdots & \vdots & \ddots & \vdots & \vdots \\ +a_{m1} & a_{m2} & \cdots & a_{m(n-1)} & a_{mn} \\ +\end{bmatrix} +\cdot +\begin{bmatrix} +x_{1} \\ +x_{2} \\ +\vdots \\ +x_{n-1} \\ +x_{n} \\ +\end{bmatrix} += +\begin{bmatrix} +b_{1} \\ +b_{2} \\ +\vdots \\ +b_{m} \\ +\end{bmatrix} +$$ + +由$A$的列向量生成的子空间为$A$的列空间; + +$Ax=b$有非零解当且仅当$b$属于$A$的列空间 + +A的零空间是$Ax=0$中$x$的解组成的集合。 diff --git a/docs/linalg/chapter07.md b/docs/linalg/chapter07.md new file mode 100644 index 00000000..102b3e4a --- /dev/null +++ b/docs/linalg/chapter07.md @@ -0,0 +1,151 @@ + +# 第七讲:求解$Ax=0$,主变量,特解 + +举例:$3 \times 4$矩阵 +$ +A= +\begin{bmatrix} +1 & 2 & 2 & 2\\ +2 & 4 & 6 & 8\\ +3 & 6 & 8 & 10\\ +\end{bmatrix} +$,求$Ax=0$的特解: + +找出主变量(pivot variable): +$$ +A= +\begin{bmatrix} +1 & 2 & 2 & 2\\ +2 & 4 & 6 & 8\\ +3 & 6 & 8 & 10\\ +\end{bmatrix} +\underrightarrow{消元} +\begin{bmatrix} +\underline{1} & 2 & 2 & 2\\ +0 & 0 & \underline{2} & 4\\ +0 & 0 & 0 & 0\\ +\end{bmatrix} +=U +$$ + +主变量(pivot variable,下划线元素)的个数为2,即矩阵$A$的秩(rank)为2,即$r=2$。 + +主变量所在的列为主列(pivot column),其余列为自由列(free column)。 + +自由列中的变量为自由变量(free variable),自由变量的个数为$n-r=4-2=2$。 + +通常,给自由列变量赋值,去求主列变量的值。如,令$x_2=1, x_4=0$求得特解 +$x=c_1\begin{bmatrix}-2\\1\\0\\0\\\end{bmatrix}$; +再令$x_2=0, x_4=1$求得特解 +$x=c_2\begin{bmatrix}2\\0\\-2\\1\\\end{bmatrix}$。 + +该例还能进一步简化,即将$U$矩阵化简为$R$矩阵(Reduced row echelon form),即简化行阶梯形式。 + +在简化行阶梯形式中,主元上下的元素都是$0$: +$$ +U= +\begin{bmatrix} +\underline{1} & 2 & 2 & 2\\ +0 & 0 & \underline{2} & 4\\ +0 & 0 & 0 & 0\\ +\end{bmatrix} +\underrightarrow{化简} +\begin{bmatrix} +\underline{1} & 2 & 0 & -2\\ +0 & 0 & \underline{1} & 2\\ +0 & 0 & 0 & 0\\ +\end{bmatrix} +=R +$$ + +将$R$矩阵中的主变量放在一起,自由变量放在一起(列交换),得到 + +$$ +R= +\begin{bmatrix} +\underline{1} & 2 & 0 & -2\\ +0 & 0 & \underline{1} & 2\\ +0 & 0 & 0 & 0\\ +\end{bmatrix} +\underrightarrow{列交换} +\left[ +\begin{array}{c c | c c} +1 & 0 & 2 & -2\\ +0 & 1 & 0 & 2\\ +\hline +0 & 0 & 0 & 0\\ +\end{array} +\right] += +\begin{bmatrix} +I & F \\ +0 & 0 \\ +\end{bmatrix} +\textrm{,其中}I\textrm{为单位矩阵,}F\textrm{为自由变量组成的矩阵} +$$ + +计算零空间矩阵$N$(nullspace matrix),其列为特解,有$RN=0$。 + +$$ +x_{pivot}=-Fx_{free} \\ +\begin{bmatrix} +I & F \\ +\end{bmatrix} +\begin{bmatrix} +x_{pivot} \\ +x_{free} \\ +\end{bmatrix}=0 \\ +N=\begin{bmatrix} +-F \\ +I \\ +\end{bmatrix} +$$ + +在本例中 +$ +N= +\begin{bmatrix} +-2 & 2 \\ +0 & -2 \\ +1 & 0 \\ +0 & 1 \\ +\end{bmatrix} +$,与上面求得的两个$x$特解一致。 + +另一个例子,矩阵 +$ +A= +\begin{bmatrix} +1 & 2 & 3 \\ +2 & 4 & 6 \\ +2 & 6 & 8 \\ +2 & 8 & 10 \\ +\end{bmatrix} +\underrightarrow{消元} +\begin{bmatrix} +1 & 2 & 3 \\ +0 & 2 & 2 \\ +0 & 0 & 0 \\ +0 & 0 & 0 \\ +\end{bmatrix} +\underrightarrow{化简} +\begin{bmatrix} +1 & 0 & 1 \\ +0 & 1 & 1 \\ +0 & 0 & 0 \\ +0 & 0 & 0 \\ +\end{bmatrix} +=R +$ + +矩阵的秩仍为$r=2$,有$2$个主变量,$1$个自由变量。 + +同上一例,取自由变量为$x_3=1$,求得特解 +$ +x=c +\begin{bmatrix} +-1 \\ +-1 \\ +1 \\ +\end{bmatrix} +$ diff --git a/docs/linalg/chapter08.md b/docs/linalg/chapter08.md new file mode 100644 index 00000000..15e194e3 --- /dev/null +++ b/docs/linalg/chapter08.md @@ -0,0 +1,123 @@ + +# 第八讲:求解$Ax=b$:可解性和解的结构 + +举例,同上一讲:$3 \times 4$矩阵 +$ +A= +\begin{bmatrix} +1 & 2 & 2 & 2\\ +2 & 4 & 6 & 8\\ +3 & 6 & 8 & 10\\ +\end{bmatrix} +$,求$Ax=b$的特解: + +写出其增广矩阵(augmented matrix)$\left[\begin{array}{c|c}A & b\end{array}\right]$: + +$$ +\left[ +\begin{array}{c c c c|c} +1 & 2 & 2 & 2 & b_1 \\ +2 & 4 & 6 & 8 & b_2 \\ +3 & 6 & 8 & 10 & b_3 \\ +\end{array} +\right] +\underrightarrow{消元} +\left[ +\begin{array}{c c c c|c} +1 & 2 & 2 & 2 & b_1 \\ +0 & 0 & 2 & 4 & b_2-2b_1 \\ +0 & 0 & 0 & 0 & b_3-b_2-b_1 \\ +\end{array} +\right] +$$ + +显然,有解的必要条件为$b_3-b_2-b_1=0$。 + +讨论$b$满足什么条件才能让方程$Ax=b$有解(solvability condition on b):当且仅当$b$属于$A$的列空间时。另一种描述:如果$A$的各行线性组合得到$0$行,则$b$端分量做同样的线性组合,结果也为$0$时,方程才有解。 + +解法:令所有自由变量取$0$,则有$ +\Big\lbrace +\begin{eqnarray*} +x_1 & + & 2x_3 & = & 1 \\ + & & 2x_3 & = & 3 \\ +\end{eqnarray*} +$ +,解得 +$ +\Big\lbrace +\begin{eqnarray*} +x_1 & = & -2 \\ +x_3 & = & \frac{3}{2} \\ +\end{eqnarray*} +$ +,代入$Ax=b$求得特解 +$ +x_p= +\begin{bmatrix} +-2 \\ 0 \\ \frac{3}{2} \\ 0 +\end{bmatrix} +$。 + +令$Ax=b$成立的所有解: + +$$ +\Big\lbrace +\begin{eqnarray} +A & x_p & = & b \\ +A & x_n & = & 0 \\ +\end{eqnarray} +\quad +\underrightarrow{两式相加} +\quad +A(x_p+x_n)=b +$$ + +即$Ax=b$的解集为其特解加上零空间,对本例有: +$ +x_{complete}= +\begin{bmatrix} +-2 \\ 0 \\ \frac{3}{2} \\ 0 +\end{bmatrix} ++ +c_1\begin{bmatrix}-2\\1\\0\\0\\\end{bmatrix} ++ +c_2\begin{bmatrix}2\\0\\-2\\1\\\end{bmatrix} +$ + +对于$m \times n$矩阵$A$,有矩阵$A$的秩$r \leq min(m, n)$ + +列满秩$r=n$情况: +$ +A= +\begin{bmatrix} +1 & 3 \\ +2 & 1 \\ +6 & 1 \\ +5 & 1 \\ +\end{bmatrix} +$ +,$rank(A)=2$,要使$Ax=b, b \neq 0$有非零解,$b$必须取$A$中各列的线性组合,此时A的零空间中只有$0$向量。 + +行满秩$r=m$情况: +$ +A= +\begin{bmatrix} +1 & 2 & 6 & 5 \\ +3 & 1 & 1 & 1 \\ +\end{bmatrix} +$ +,$rank(A)=2$,$\forall b \in R^m都有x \neq 0的解$,因为此时$A$的列空间为$R^m$,$b \in R^m$恒成立,组成$A$的零空间的自由变量有n-r个。 + +行列满秩情况:$r=m=n$,如 +$ +A= +\begin{bmatrix} +1 & 2 \\ +3 & 4 \\ +\end{bmatrix} +$ +,则$A$最终可以化简为$R=I$,其零空间只包含$0$向量。 + +总结: + +$$\begin{array}{c|c|c|c}r=m=n&r=n\lt m&r=m\lt n&r\lt m,r\lt n\\R=I&R=\begin{bmatrix}I\\0\end{bmatrix}&R=\begin{bmatrix}I&F\end{bmatrix}&R=\begin{bmatrix}I&F\\0&0\end{bmatrix}\\1\ solution&0\ or\ 1\ solution&\infty\ solution&0\ or\ \infty\ solution\end{array}$$ diff --git a/docs/linalg/chapter09.md b/docs/linalg/chapter09.md new file mode 100644 index 00000000..91fb2baa --- /dev/null +++ b/docs/linalg/chapter09.md @@ -0,0 +1,46 @@ + +# 第九讲:线性相关性、基、维数 + +$v_1,\ v_2,\ \cdots,\ v_n$是$m\times n$矩阵$A$的列向量: + +如果$A$零空间中有且仅有$0$向量,则各向量线性无关,$rank(A)=n$。 + +如果存在非零向量$c$使得$Ac=0$,则存在线性相关向量,$rank(A)\lt n$。 + +向量空间$S$中的一组基(basis),具有两个性质: + +1. 他们线性无关; +2. 他们可以生成$S$。 + +对于向量空间$\mathbb{R}^n$,如果$n$个向量组成的矩阵为可逆矩阵,则这$n$个向量为该空间的一组基,而数字$n$就是该空间的维数(dimension)。 + +举例: +$ +A= +\begin{bmatrix} +1 & 2 & 3 & 1 \\ +1 & 1 & 2 & 1 \\ +1 & 2 & 3 & 1 \\ +\end{bmatrix} +$ +,A的列向量线性相关,其零空间中有非零向量,所以$rank(A)=2=主元存在的列数=列空间维数$。 + +可以很容易的求得$Ax=0$的两个解,如 +$ +x_1= +\begin{bmatrix} +-1 \\ +-1 \\ +1 \\ +0 \\ +\end{bmatrix}, +x_2= +\begin{bmatrix} +-1 \\ +0 \\ +0 \\ +1 \\ +\end{bmatrix} +$,根据前几讲,我们知道特解的个数就是自由变量的个数,所以$n-rank(A)=2=自由变量存在的列数=零空间维数$ + +我们得到:列空间维数$dim C(A)=rank(A)$,零空间维数$dim N(A)=n-rank(A)$ diff --git a/docs/linalg/chapter10.md b/docs/linalg/chapter10.md new file mode 100644 index 00000000..1bd508ec --- /dev/null +++ b/docs/linalg/chapter10.md @@ -0,0 +1,114 @@ + +# 第十讲 四个基本子空间 + +对于$m \times n$矩阵$A$,$rank(A)=r$有: + +* 行空间$C(A^T) \in \mathbb{R}^n, dim C(A^T)=r$,基见例1。 + +* 零空间$N(A) \in \mathbb{R}^n, dim N(A)=n-r$,自由元所在的列即可组成零空间的一组基。 + +* 列空间$C(A) \in \mathbb{R}^m, dim C(A)=r$,主元所在的列即可组成列空间的一组基。 + +* 左零空间$N(A^T) \in \mathbb{R}^m, dim N(A^T)=m-r$,基见例2。 + +例1,对于行空间 +$ +A= +\begin{bmatrix} +1 & 2 & 3 & 1 \\ +1 & 1 & 2 & 1 \\ +1 & 2 & 3 & 1 \\ +\end{bmatrix} +\underrightarrow{消元、化简} +\begin{bmatrix} +1 & 0 & 1 & 1 \\ +0 & 1 & 1 & 0 \\ +0 & 0 & 0 & 0 \\ +\end{bmatrix} +=R +$ + +由于我们做了行变换,所以A的列空间受到影响,$C(R) \neq C(A)$,而行变换并不影响行空间,所以可以在$R$中看出前两行就是行空间的一组基。 + +所以,可以得出无论对于矩阵$A$还是$R$,其行空间的一组基,可以由$R$矩阵的前$r$行向量组成(这里的$R$就是第七讲提到的简化行阶梯形式)。 + +例2,对于左零空间,有$A^Ty=0 \rightarrow (A^Ty)^T=0^T\rightarrow y^TA=0^T$,因此得名。 + +采用Gauss-Jordan消元,将增广矩阵$\left[\begin{array}{c|c}A_{m \times n} & I_{m \times m}\end{array}\right]$中$A$的部分划为简化行阶梯形式$\left[\begin{array}{c|c}R_{m \times n} & E_{m \times m}\end{array}\right]$,此时矩阵$E$会将所有的行变换记录下来。 + +则$EA=R$,而在前几讲中,有当$A'$是$m$阶可逆方阵时,$R'$即是$I$,所以$E$就是$A^{-1}$。 + +本例中 + +$$ +\left[\begin{array}{c|c}A_{m \times n} & I_{m \times m}\end{array}\right]= +\left[ +\begin{array} +{c c c c|c c c} +1 & 2 & 3 & 1 & 1 & 0 & 0 \\ +1 & 1 & 2 & 1 & 0 & 1 & 0 \\ +1 & 2 & 3 & 1 & 0 & 0 & 1 \\ +\end{array} +\right] +\underrightarrow{消元、化简} +\left[ +\begin{array} +{c c c c|c c c} +1 & 0 & 1 & 1 & -1 & 2 & 0 \\ +0 & 1 & 1 & 0 & 1 & -1 & 0 \\ +0 & 0 & 0 & 0 & -1 & 0 & 1 \\ +\end{array} +\right] +=\left[\begin{array}{c|c}R_{m \times n} & E_{m \times m}\end{array}\right] +$$ + +则 + +$$ +EA= +\begin{bmatrix} +-1 & 2 & 0 \\ +1 & -1 & 0 \\ +-1 & 0 & 1 \\ +\end{bmatrix} +\cdot +\begin{bmatrix} +1 & 2 & 3 & 1 \\ +1 & 1 & 2 & 1 \\ +1 & 2 & 3 & 1 \\ +\end{bmatrix} += +\begin{bmatrix} +1 & 0 & 1 & 1 \\ +0 & 1 & 1 & 0 \\ +0 & 0 & 0 & 0 \\ +\end{bmatrix} +=R +$$ + + +很明显,式中$E$的最后一行对$A$的行做线性组合后,得到$R$的最后一行,即$0$向量,也就是$y^TA=0^T$。 + +最后,引入矩阵空间的概念,矩阵可以同向量一样,做求和、数乘。 + +举例,设所有$3 \times 3$矩阵组成的矩阵空间为$M$。则上三角矩阵、对称矩阵、对角矩阵(前两者的交集)。 + +观察一下对角矩阵,如果取 +$ +\begin{bmatrix} +1 & 0 & 0 \\ +0 & 0 & 0 \\ +0 & 0 & 0 \\ +\end{bmatrix} \quad +\begin{bmatrix} +1 & 0 & 0 \\ +0 & 3 & 0 \\ +0 & 0 & 0 \\ +\end{bmatrix} \quad +\begin{bmatrix} +0 & 0 & 0 \\ +0 & 0 & 0 \\ +0 & 0 & 7 \\ +\end{bmatrix} +$ +,可以发现,任何三阶对角矩阵均可用这三个矩阵的线性组合生成,因此,他们生成了三阶对角矩阵空间,即这三个矩阵是三阶对角矩阵空间的一组基。 diff --git a/docs/linalg/chapter11.md b/docs/linalg/chapter11.md new file mode 100644 index 00000000..f42012f8 --- /dev/null +++ b/docs/linalg/chapter11.md @@ -0,0 +1,113 @@ + +# 第十一讲:矩阵空间、秩1矩阵和小世界图 + +## 矩阵空间 + +接上一讲,使用$3 \times 3$矩阵举例,其矩阵空间记为$M$。 + +则$M$的一组基为: +$ +\begin{bmatrix} +1 & 0 & 0 \\ +0 & 0 & 0 \\ +0 & 0 & 0 \\ +\end{bmatrix} +\begin{bmatrix} +0 & 1 & 0 \\ +0 & 0 & 0 \\ +0 & 0 & 0 \\ +\end{bmatrix} +\begin{bmatrix} +0 & 0 & 1 \\ +0 & 0 & 0 \\ +0 & 0 & 0 \\ +\end{bmatrix} \\ +\begin{bmatrix} +0 & 0 & 0 \\ +1 & 0 & 0 \\ +0 & 0 & 0 \\ +\end{bmatrix} +\begin{bmatrix} +0 & 0 & 0 \\ +0 & 1 & 0 \\ +0 & 0 & 0 \\ +\end{bmatrix} +\begin{bmatrix} +0 & 0 & 0 \\ +0 & 0 & 1 \\ +0 & 0 & 0 \\ +\end{bmatrix} \\ +\begin{bmatrix} +0 & 0 & 0 \\ +0 & 0 & 0 \\ +1 & 0 & 0 \\ +\end{bmatrix} +\begin{bmatrix} +0 & 0 & 0 \\ +0 & 0 & 0 \\ +0 & 1 & 0 \\ +\end{bmatrix} +\begin{bmatrix} +0 & 0 & 0 \\ +0 & 0 & 0 \\ +0 & 0 & 1 \\ +\end{bmatrix} \\ +$ + +易得,$dim M=9$。 + +所以可以得出,对上讲中的三阶对称矩阵空间有$dim S=6$、上三角矩阵空间有$dim U=6$、对角矩阵空间有$dim D=3$ + +求并(intersect):$S \cup U=D, dim(S \cup U)=9$; + +求交(sum):$S \cap U=M, dim(S \cap U)=3$; + +可以看出:$dim S + dim U=12=dim(S \cup U) + dim(S \cap U)$。 + +另一个例子来自微分方程: + +$\frac{d^2y}{dx^2}+y=0$,即$y''+y=0$ + +方程的解有:$y=\cos{x}, \quad y=\sin{x}, \quad y=e^{ix}, \quad y=e^{-ix}$等等($e^{ix}=\cos{x}+i\sin{x}, \quad e^{-ix}=\cos{x}-i\sin{x}$) + +而该方程的所有解:$y=c_1 \cos{x} + c_2 \sin{x}$。 + +所以,该方程的零空间的一组基为$\cos{x}, \sin{x}$,零空间的维数为$2$。同理$e^{ix}, e^{-ix}$可以作为另一组基。 + +## 秩一矩阵 + +$2 \times 3$矩阵$A=\begin{bmatrix}1&4&5\\2&8&10\end{bmatrix}=\begin{bmatrix}1\\2\end{bmatrix}\begin{bmatrix}1&4&5\end{bmatrix}$。 + +且$dimC(A)=1=dimC(A^T)$,所有的秩一矩阵都可以划为$A=UV^T$的形式,这里的$U, V$均为列向量。 + +秩一矩阵类似“积木”,可以搭建任何矩阵,如对于一个$5 \times 17$秩为$4$的矩阵,只需要$4$个秩一矩阵就可以组合出来。 + +令$M$代表所有$5 \times 17$,$M$中所有秩$4$矩阵组成的集合并不是一个子空间,通常两个秩四矩阵相加,其结果并不是秩四矩阵。 + +现在,在$\mathbb{R}^4$空间中有向量$v=\begin{bmatrix}v_1\\v_2\\v_3\\v_4\end{bmatrix}$,取$\mathbb{R}^4$中满足$v_1+v_2+v_3+v_4=0$的所有向量组成一个向量空间$S$,则$S$是一个向量子空间。 + +易看出,不论是使用系数乘以该向量,或是用两个满足条件的向量相加,其结果仍然落在分量和为零的向量空间中。 + +求$S$的维数: + +从另一个角度看,$v_1+v_2+v_3+v_4=0$等价于$\begin{bmatrix}1&1&1&1\end{bmatrix}\begin{bmatrix}v_1\\v_2\\v_3\\v_4\end{bmatrix}=0$,则$S$就是$A=\begin{bmatrix}1&1&1&1\end{bmatrix}$的零空间。 + +$rank(A)=1$,则对其零空间有$rank(N(A))=n-r=3=dim N(A)$,则$S$的维数是$3$。 + +顺便看一下$1 \times 4$矩阵$A$的四个基本子空间: + +行空间:$dim C(A^T)=1$,其中的一组基是$\begin{bmatrix}1\\1\\1\\1\end{bmatrix}$; + +零空间:$dim N(A)=3$,其中的一组基是$\begin{bmatrix}-1\\1\\0\\0\end{bmatrix}\begin{bmatrix}-1\\0\\1\\0\end{bmatrix}\begin{bmatrix}-1\\0\\0\\1\end{bmatrix}$ + +列空间:$dim C(A)=1$,其中一组基是$\begin{bmatrix}1\end{bmatrix}$,可以看出列空间就是整个$\mathbb{R}^1$空间。 + +左零空间:$dim N(A^T)=0$,因为$A$转置后没有非零的$v$可以使$Av=0$成立,就是$\begin{bmatrix}0\end{bmatrix}$。 + +综上,$dim C(A^T)+dim N(A)=4=n, dim C(A)+dim N(A^T)=1=m$ + +## 小世界图 + +图(graph)由节点(node)与边(edge)组成。 + +假设,每个人是图中的一个节点,如果两个人为朋友关系,则在这两个人的节点间添加一条边,通常来说,从一个节点到另一个节点只需要不超过$6$步(即六条边)即可到达。 diff --git a/docs/linalg/chapter12.md b/docs/linalg/chapter12.md new file mode 100644 index 00000000..25546630 --- /dev/null +++ b/docs/linalg/chapter12.md @@ -0,0 +1,204 @@ + +# 第十二讲:图和网络 + +## 图和网络 + + +```python +import networkx as nx +import matplotlib.pyplot as plt +%matplotlib inline + +dg = nx.DiGraph() +dg.add_edges_from([(1,2), (2,3), (1,3), (1,4), (3,4)]) +edge_labels = {(1, 2): 1, (1, 3): 3, (1, 4): 4, (2, 3): 2, (3, 4): 5} + +pos = nx.spring_layout(dg) +nx.draw_networkx_edge_labels(dg,pos,edge_labels=edge_labels, font_size=16) +nx.draw_networkx_labels(dg, pos, font_size=20, font_color='w') +nx.draw(dg, pos, node_size=1500, node_color="gray") +``` + + +![png](img/chapter12_1_0.png) + + +该图由4个节点与5条边组成, + +$$ +\begin{array}{c | c c c c} + & node_1 & node_2 & node_3 & node_4 \\ +\hline +edge_1 & -1 & 1 & 0 & 0 \\ +edge_2 & 0 & -1 & 1 & 0 \\ +edge_3 & -1 & 0 & 1 & 0 \\ +edge_4 & -1 & 0 & 0 & 1 \\ +edge_5 & 0 & 0 & -1 & 1 \\ +\end{array} +$$ + +我们可以建立$5 \times 4$矩阵 +$ +A= +\begin{bmatrix} +-1 & 1 & 0 & 0 \\ +0 & -1 & 1 & 0 \\ +-1 & 0 & 1 & 0 \\ +-1 & 0 & 0 & 1 \\ +0 & 0 & -1 & 1 \\ +\end{bmatrix} +$ + +观察前三行,易看出这三个行向量线性相关,也就是这三个向量可以形成回路(loop)。 + +现在,解$Ax=0$: +$ +Ax= +\begin{bmatrix} +-1 & 1 & 0 & 0 \\ +0 & -1 & 1 & 0 \\ +-1 & 0 & 1 & 0 \\ +-1 & 0 & 0 & 1 \\ +0 & 0 & -1 & 1 \\ +\end{bmatrix} +\begin{bmatrix} +x_1\\x_2\\x_3\\x_4\\ +\end{bmatrix} +$。 + +展开得到: +$\begin{bmatrix}x_2-x_1 \\x_3-x_2 \\x_3-x_1 \\x_4-x_1 \\x_4-x_3 \\ \end{bmatrix}=\begin{bmatrix}0\\0\\0\\0\\0\\ \end{bmatrix}$ + +引入矩阵的实际意义:将$x=\begin{bmatrix}x_1 & x_2 & x_3 & x_4\end{bmatrix}$设为各节点电势(Potential at the Nodes)。 + +则式子中的诸如$x_2-x_1$的元素,可以看做该边上的电势差(Potential Differences)。 + +容易看出其中一个解$x=\begin{bmatrix}1\\1\\1\\1\end{bmatrix}$,即等电势情况,此时电势差为$0$。 + +化简$A$易得$rank(A)=3$,所以其零空间维数应为$n-r=4-3=1$,即$\begin{bmatrix}1\\1\\1\\1\end{bmatrix}$就是其零空间的一组基。 + +其零空间的物理意义为,当电位相等时,不存在电势差,图中无电流。 + +当我们把图中节点$4$接地后,节点$4$上的电势为$0$,此时的 +$ +A= +\begin{bmatrix} +-1 & 1 & 0 \\ +0 & -1 & 1 \\ +-1 & 0 & 1 \\ +-1 & 0 & 0 \\ +0 & 0 & -1 \\ +\end{bmatrix} +$,各列线性无关,$rank(A)=3$。 + +现在看看$A^Ty=0$(这是应用数学里最常用的式子): + +$A^Ty=0=\begin{bmatrix}-1 & 0 & -1 & -1 & 0 \\1 & -1 & 0 & 0 & 0 \\0 & 1 & 1 & 0 & -1 \\0 & 0 & 0 & 1 & 1 \\ \end{bmatrix}\begin{bmatrix}y_1\\y_2\\y_3\\y_4\\y_5\end{bmatrix}=\begin{bmatrix}0\\0\\0\\0\end{bmatrix}$,对于转置矩阵有$dim N(A^T)=m-r=5-3=2$。 + +接着说上文提到的的电势差,矩阵$C$将电势差与电流联系起来,电流与电势差的关系服从欧姆定律:边上的电流值是电势差的倍数,这个倍数就是边的电导(conductance)即电阻(resistance)的倒数。 + +$ +电势差 +\xrightarrow[欧姆定律]{矩阵C} +各边上的电流y_1, y_2, y_3, y_4, y_5 +$,而$A^Ty=0$的另一个名字叫做“基尔霍夫电流定律”(Kirchoff's Law, 简称KCL)。 + +再把图拿下来观察: + + +```python +import networkx as nx +import matplotlib.pyplot as plt +%matplotlib inline + +dg = nx.DiGraph() +dg.add_edges_from([(1,2), (2,3), (1,3), (1,4), (3,4)]) +edge_labels = {(1, 2): 1, (1, 3): 3, (1, 4): 4, (2, 3): 2, (3, 4): 5} + +pos = nx.spring_layout(dg) +nx.draw_networkx_edge_labels(dg,pos,edge_labels=edge_labels, font_size=16) +nx.draw_networkx_labels(dg, pos, font_size=20, font_color='w') +nx.draw(dg, pos, node_size=1500, node_color="gray") +``` + + +![png](img/chapter12_3_0.png) + + +将$A^Ty=0$中的方程列出来: +$ +\left\{ +\begin{aligned} +y_1 + y_3 + y_4 &= 0 \\ +y_1 - y_2 &= 0 \\ +y_2 + y_3 - y_5 &= 0 \\ +y_4 - y_5 &= 0 \\ +\end{aligned} +\right. +$ + +对比看$A^Ty=0$的第一个方程,$-y_1-y_3-y_4=0$,可以看出这个方程是关于节点$1$上的电流的,方程指出节点$1$上的电流和为零,基尔霍夫定律是一个平衡方程、守恒定律,它说明了流入等于流出,电荷不会在节点上累积。 + +对于$A^T$,有上文得出其零空间的维数是$2$,则零空间的基应该有两个向量。 + +* 现在假设$y_1=1$,也就是令$1$安培的电流在边$1$上流动; +* 由图看出$y_2$也应该为$1$; +* 再令$y_3=-1$,也就是让$1$安培的电流流回节点$1$; +* 令$y_4=y_5=0$; + +得到一个符合KCL的向量$\begin{bmatrix}1\\1\\-1\\0\\0\end{bmatrix}$,代回方程组发现此向量即为一个解,这个解发生在节点$1,2,3$组成的回路中,该解即为零空间的一个基。 + +根据上一个基的经验,可以利用$1,3,4$组成的节点求另一个基: + +* 令$y_1=y_2=0$; +* 令$y_3=1$; +* 由图得$y_5=1$; +* 令$y_4=-1$; + +得到令一个符合KCL的向量$\begin{bmatrix}0\\0\\1\\-1\\1\end{bmatrix}$,代回方程可知此为另一个解。 + +则$N(A^T)$的一组基为$\begin{bmatrix}1\\1\\-1\\0\\0\end{bmatrix}\quad\begin{bmatrix}0\\0\\1\\-1\\1\end{bmatrix}$。 + +看图,利用节点$1,2,3,4$组成的大回路(即边$1,2,5,4$): + +* 令$y_3=0$; +* 令$y_1=1$; +* 则由图得$y_2=1, y_5=1, y_4=-1$; + +得到符合KCL的向量$\begin{bmatrix}1\\1\\0\\-1\\1\end{bmatrix}$,易看出此向量为求得的两个基之和。 + +接下来观察$A$的行空间,即$A^T$的列空间,方便起见我们直接计算 +$ +A^T= +\begin{bmatrix} +-1 & 0 & -1 & -1 & 0 \\ +1 & -1 & 0 & 0 & 0 \\ +0 & 1 & 1 & 0 & -1 \\ +0 & 0 & 0 & 1 & 1 \\ +\end{bmatrix} +$ +的列空间。 + +易从基的第一个向量看出前三列$A^T$的线性相关,则$A^T$的主列为第$1,2,4$列,对应在图中就是边$1,2,4$,可以发现这三条边没有组成回路,则在这里可以说**线性无关等价于没有回路**。由$4$个节点与$3$条边组成的图没有回路,就表明$A^T$的对应列向量线性无关,也就是节点数减一($rank=nodes-1$)条边线性无关。另外,没有回路的图也叫作树(Tree)。 + +再看左零空间的维数公式:$dim N(A^T)=m-r$,左零空间的维数就是相互无关的回路的数量,于是得到$loops=edges-(nodes-1)$,整理得: + +$$ +nodes-edges+loops=1 +$$ + +此等式对任何图均有效,任何图都有此拓扑性质,这就是著名的欧拉公式(Euler's Formula)。$零维(节点)-一维(边)+二维(回路)=1$便于记忆。 + +总结: + +* 将电势记为$e$,则在引入电势的第一步中,有$e=Ax$; +* 电势差导致电流产生,$y=Ce$; +* 电流满足基尔霍夫定律方程,$A^Ty=0$; + +这些是在无电源情况下的方程。 + +电源可以通过:在边上加电池(电压源),或在节点上加外部电流 两种方式接入。 + +如果在边上加电池,会体现在$e=Ax$中;如果在节点上加电流,会体现在$A^Ty=f$中,$f$向量就是外部电流。 + +将以上三个等式连起来得到$A^TCAx=f$。另外,最后一个方程是一个平衡方程,还需要注意的是,方程仅描述平衡状态,方程并不考虑时间。最后,$A^TA$是一个对称矩阵。 diff --git a/docs/linalg/chapter13.md b/docs/linalg/chapter13.md new file mode 100644 index 00000000..0357a768 --- /dev/null +++ b/docs/linalg/chapter13.md @@ -0,0 +1,55 @@ + +# 第十三讲:复习一 + +1. 令$u, v, w$是$\mathbb{R}^7$空间内的非零向量:则$u, v, w$生成的向量空间可能是$1, 2, 3$维的。 + +2. 有一个$5 \times 3$矩阵$U$,该矩阵为阶梯矩阵(echelon form),有$3$个主元:则能够得到该矩阵的秩为$3$,即三列向量线性无关,不存在非零向量使得三列的线性组合为零向量,所以该矩阵的零空间应为$\begin{bmatrix}0\\0\\0\\ \end{bmatrix}$。 + +3. 接上一问,有一个$10 \times 3$矩阵$B=\begin{bmatrix}U\\2U \end{bmatrix}$,则化为最简形式(阶梯矩阵)应为$\begin{bmatrix}U\\0 \end{bmatrix}$,$rank(B)=3$。 + +4. 接上一问,有一个矩阵型为$C=\begin{bmatrix}U & U \\ U & 0 \end{bmatrix}$,则化为最简形式应为$\begin{bmatrix}U & 0 \\ 0 & U \end{bmatrix}$,$rank(C)=6$。矩阵$C$为$10 \times 6$矩阵,$dim N(C^T)=m-r=4$。 + +5. 有$Ax=\begin{bmatrix}2\\4\\2\\ \end{bmatrix}$,并且$x=\begin{bmatrix}2\\0\\0\\ \end{bmatrix}+c\begin{bmatrix}1\\1\\0\\ \end{bmatrix}+d\begin{bmatrix}0\\0\\1 \end{bmatrix}$,则等号右侧$b$向量的列数应为$A$的行数,且解的列数应为$A$的列数,所以$A$是一个$3 \times 3$矩阵。从解的结构可知自由元有两个,则$rank(A)=1, dim N(A)=2$。从解的第一个向量得出,矩阵$A$的第一列是$\begin{bmatrix}1\\2\\1 \end{bmatrix}$;解的第二个向量在零空间中,说明第二列与第一列符号相反,所以矩阵第二列是$\begin{bmatrix}-1\\-2\\-1 \end{bmatrix}$;解的第三个向量在零空间中,说明第三列为零向量;综上,$A=\begin{bmatrix}1 & -1 & 0\\ 2 & -2 & 0\\ 1 & -1 & 0\\ \end{bmatrix}$。 + +6. 接上一问,如何使得$Ax=b$有解?即使$b$在矩阵$A$的列空间中。易知$A$的列空间型为$c\begin{bmatrix}1\\2\\1\\ \end{bmatrix}$,所以使$b$为向量$\begin{bmatrix}1\\2\\1\\ \end{bmatrix}$的倍数即可。 + +7. 有一方阵的零空间中只有零向量,则其左零空间也只有零向量。 + +8. 由$5 \times 5$矩阵组成的矩阵空间,其中的可逆矩阵能否构成子空间?两个可逆矩阵相加的结果并不一定可逆,况且零矩阵本身并不包含在可逆矩阵中。其中的奇异矩阵(singular matrix,非可逆矩阵)也不能组成子空间,因为其相加的结果并不一定能够保持不可逆。 + +9. 如果$B^2=0$,并不能得出$B=0$,反例:$\begin{bmatrix}0 & 1\\ 0 & 0\\ \end{bmatrix}$,**这个矩阵经常会被用作反例**。 + +10. $n \times n$矩阵的列向量线性无关,则是否$\forall b, Ax=b$有解?是的,因为方阵各列线性无关,所以方阵满秩,它是可逆矩阵,肯定有解。 + +11. 有 +$ +B= +\begin{bmatrix} +1 & 1 & 0 \\ +0 & 1 & 0 \\ +1 & 0 & 1 \\ +\end{bmatrix} +\begin{bmatrix} +1 & 0 & -1 & 2 \\ +0 & 1 & 1 & -1 \\ +0 & 0 & 0 & 0 \\ +\end{bmatrix} +$,在不解出$B$的情况下,求$B$的零空间。可以观察得出前一个矩阵是可逆矩阵,设$B=CD$,则求零空间$Bx=0, CDx=0$,而$C$是可逆矩阵,则等式两侧同时乘以$C^{-1}$有$C^{-1}CDx=Dx=0$,所以当$C$为可逆矩阵时,有$N(CD)=N(D)$,即左乘逆矩阵不会改变零空间。本题转化为求$D$的零空间,$N(B)$的基为 +$\begin{bmatrix}-F\\I\\ \end{bmatrix}$,也就是$\begin{bmatrix}1\\-1\\1\\0 \end{bmatrix}\quad\begin{bmatrix}-2\\1\\0\\1\end{bmatrix}$ + +12. 接上题,求$Bx=\begin{bmatrix}1\\0\\1\\ \end{bmatrix}$的通解。观察$B=CD$,易得$B$矩阵的第一列为$\begin{bmatrix}1\\0\\1\\ \end{bmatrix}$,恰好与等式右边一样,所以$\begin{bmatrix}1\\0\\0\\0\\ \end{bmatrix}$可以作为通解中的特解部分,再利用上一问中求得的零空间的基,得到通解 +$ +x= +\begin{bmatrix}1\\0\\0\\0\\ \end{bmatrix}+ +c_1\begin{bmatrix}1\\-1\\1\\0 \end{bmatrix}+c_2\begin{bmatrix}-2\\1\\0\\1\end{bmatrix} +$ + +13. 对于任意方阵,其行空间等于列空间?不成立,可以使用$\begin{bmatrix}0 & 1\\ 0 & 0\\ \end{bmatrix}$作为反例,其行空间是向量$\begin{bmatrix}0 & 1\\ \end{bmatrix}$的任意倍数,而列空间是向量$\begin{bmatrix}1 & 0\\ \end{bmatrix}$的任意倍数。但是如果该方阵是对称矩阵,则成立。 + +14. $A$与$-A$的四个基本子空间相同。 + +15. 如果$A, B$的四个基本子空间相同,则$A, B$互为倍数关系。不成立,如任意两个$n$阶可逆矩阵,他们的列空间、行空间均为$\mathbb{R}^n$,他们的零空间、左零空间都只有零向量,所以他们的四个基本子空间相同,但是并不一定具有倍数关系。 + +16. 如果交换矩阵的某两行,则其行空间与零空间保持不变,而列空间与左零空间均已改变。 + +17. 为什么向量$v=\begin{bmatrix}1\\2\\3 \end{bmatrix}$不能同时出现在矩阵的行空间与零空间中?令$A\begin{bmatrix}1\\2\\3 \end{bmatrix}=\begin{bmatrix}0\\0\\0 \end{bmatrix}$,很明显矩阵$A$中不能出现值为$\begin{bmatrix}1 & 2 & 3 \end{bmatrix}$的行向量,否则无法形成等式右侧的零向量。这里引入正交(perpendicular)的概念,矩阵的行空间与零空间正交,它们仅共享零向量。 diff --git a/docs/linalg/chapter14.md b/docs/linalg/chapter14.md new file mode 100644 index 00000000..b07f3937 --- /dev/null +++ b/docs/linalg/chapter14.md @@ -0,0 +1,86 @@ + +# 第十四讲:正交向量与子空间 + +在四个基本子空间中,提到对于秩为r的$m \times n$矩阵,其行空间($dim C(A^T)=r$)与零空间($dim N(A)=n-r$)同属于$\mathbb{R}^n$空间,其列空间($dim C(A)=r$)与左零空间($dim N(A^T)$=m-r)同属于$\mathbb{R}^m$空间。 + +对于向量$x, y$,当$x^T \cdot y=0$即$x_1y_1+x_2y_x+\cdots+x_ny_n=0$时,有向量$x, y$正交(vector orthogonal)。 + +毕达哥拉斯定理(Pythagorean theorem)中提到,直角三角形的三条边满足: + +$$ +\begin{aligned} +\left\|\overrightarrow{x}\right\|^2+\left\|\overrightarrow{y}\right\|^2 &= \left\|\overrightarrow{x+y}\right\|^2 \\ +x^Tx+y^Ty &= (x+y)^T(x+y) \\ +x^Tx+y^Ty &= x^Tx+y^Ty+x^Ty+y^Tx \\ +0 &= x^Ty+y^Tx \qquad 对于向量点乘,x^Ty=y^Tx \\ +0 &= 2x^Ty \\ +x^Ty &=0 +\end{aligned} +$$ + +由此得出,两正交向量的点积为$0$。另外,$x, y$可以为$0$向量,由于$0$向量与任意向量的点积均为零,所以$0$向量与任意向量正交。 + +举个例子: +$x=\begin{bmatrix}1\\2\\3\end{bmatrix}, y=\begin{bmatrix}2\\-1\\0\end{bmatrix}, x+y=\begin{bmatrix}3\\1\\3\end{bmatrix}$,有$\left\| \overrightarrow{x} \right\|^2=14, \left\| \overrightarrow{y} \right\|^2=5, \left\| \overrightarrow{x+y} \right\|^2=19$,而$x^Ty=1\times2+2\times (-1)+3\times0=0$。 + +向量$S$与向量$T$正交,则意味着$S$中的每一个向量都与$T$中的每一个向量正交。若两个子空间正交,则它们一定不会相交于某个非零向量。 + +现在观察行空间与零空间,零空间是$Ax=0$的解,即$x$若在零空间,则$Ax$为零向量; + +而对于行空间,有 $ +\begin{bmatrix}row_1\\row_2\\ \vdots \\row_m\end{bmatrix} +\Bigg[x\Bigg]= +\begin{bmatrix}0\\0\\ \vdots\\ 0\end{bmatrix} +$,可以看出: +$$ +\begin{bmatrix}row_1\end{bmatrix}\Bigg[x\Bigg]=0 \\ +\begin{bmatrix}row_2\end{bmatrix}\Bigg[x\Bigg]=0 \\ +\vdots \\ +\begin{bmatrix}row_m\end{bmatrix}\Bigg[x\Bigg]=0 \\ +$$ + +所以这个等式告诉我们,$x$同$A$中的所有行正交; + +接下来还验证$x$是否与$A$中各行的线性组合正交, +$ +\begin{cases} +c_1(row_1)^Tx=0 \\ +c_2(row_2)^Tx=0 \\ +\vdots \\ +c_n(row_m)^Tx=0 \\ +\end{cases} +$,各式相加得$(c_1row_1+c_2row_2+\cdots+c_nrow_m)^Tx=0$,得证。 + +我们可以说,行空间与零空间将$\mathbb{R}^n$分割为两个正交的子空间,同样的,列空间与左零空间将$\mathbb{R}^m$分割为两个正交的子空间。 + +举例,$A=\begin{bmatrix}1&2&5\\2&4&10\end{bmatrix}$,则可知$m=2, n=3, rank(A)=1, dim N(A)=2$。 + +有$Ax=\begin{bmatrix}1&2&5\\2&4&10\end{bmatrix}\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}$,解得零空间的一组基$x_1=\begin{bmatrix}-2\\1\\0\end{bmatrix}\quad x_2=\begin{bmatrix}-5\\0\\1\end{bmatrix}$。 + +而行空间的一组基为$r=\begin{bmatrix}1\\2\\5\end{bmatrix}$,零空间与行空间正交,在本例中行空间也是零空间的法向量。 + +补充一点,我们把行空间与零空间称为$n$维空间里的正交补(orthogonal complement),即零空间包含了所有与行空间正交的向量;同理列空间与左零空间为$m$维空间里的正交补,即左零空间包含了所有与零空间正交的向量。 + +接下来看长方矩阵,$m>n$。对于这种矩阵,$Ax=b$中经常混入一些包含“坏数据”的方程,虽然可以通过筛选的方法去掉一些我们不希望看到的方程,但是这并不是一个稳妥的方法。 + +于是,我们引入一个重要的矩阵:$A^TA$。这是一个$n \times m$矩阵点乘$m \times n$矩阵,其结果是一个$n \times n$矩阵,应该注意的是,这也是一个对称矩阵,证明如下: + +$$ +(A^TA)^T=A^T(A^T)^T=A^TA +$$ + +这一章节的核心就是$A^TAx=A^Tb$,这个变换可以将“坏方程组”变为“好方程组”。 + +举例,有$\begin{bmatrix}1&1\\1&2\\1&5\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix}$,只有当$\begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix}$在矩阵的列空间时,方程才有解。 + +现在来看$\begin{bmatrix}1&1&1\\1&2&5\end{bmatrix}\begin{bmatrix}1&1\\1&2\\1&5\end{bmatrix}=\begin{bmatrix}3&8\\8&30\end{bmatrix}$,可以看出此例中$A^TA$是可逆的。然而并非所有$A^TA$都是可逆的,如$\begin{bmatrix}1&1&1\\3&3&3\end{bmatrix}\begin{bmatrix}1&3\\1&3\\1&3\end{bmatrix}=\begin{bmatrix}3&9\\9&27\end{bmatrix}$(注意到这是两个秩一矩阵相乘,其结果秩不会大于一) + +先给出结论: + +$$ +N(A^TA)=N(A)\\ +rank(A^TA)=rank(A)\\ +A^TA可逆当且仅当N(A)为零向量,即A的列线性无关\\ +$$ + +下一讲涉及投影,很重要。 diff --git a/docs/linalg/chapter15.md b/docs/linalg/chapter15.md new file mode 100644 index 00000000..711f1bfe --- /dev/null +++ b/docs/linalg/chapter15.md @@ -0,0 +1,154 @@ + +# 第十五讲:子空间投影 + +从$\mathbb{R}^2$空间讲起,有向量$a, b$,做$b$在$a$上的投影$p$,如图: + + + +```python +%matplotlib inline +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd + +plt.style.use("seaborn-dark-palette") + +fig = plt.figure() +plt.axis('equal') +plt.axis([-7, 7, -6, 6]) +plt.arrow(-4, -1, 8, 2, head_width=0.3, head_length=0.5, color='r', length_includes_head=True) +plt.arrow(0, 0, 2, 4, head_width=0.3, head_length=0.5, color='b', length_includes_head=True) +plt.arrow(0, 0, 48/17, 12/17, head_width=0.3, head_length=0.5, color='gray', length_includes_head=True) +plt.arrow(48/17, 12/17, 2-48/17, 4-12/17, head_width=0.3, head_length=0.5, color='g', length_includes_head=True) +# plt.plot([48/17], [12/17], 'o') +# y=1/4x +# y=-4x+12 +# x=48/17 +# y=12/17 +plt.annotate('b', xy=(1, 2), xytext=(-30, 15), textcoords='offset points', size=20, arrowprops=dict(arrowstyle="->")) +plt.annotate('a', xy=(-1, -0.25), xytext=(15, -30), textcoords='offset points', size=20, arrowprops=dict(arrowstyle="->")) +plt.annotate('e=b-p', xy=(2.5, 2), xytext=(30, 0), textcoords='offset points', size=20, arrowprops=dict(arrowstyle="->")) +plt.annotate('p=xa', xy=(2, 0.5), xytext=(-20, -40), textcoords='offset points', size=20, arrowprops=dict(arrowstyle="->")) +plt.grid() + +``` + + +![png](img/chapter15_1_0.png) + + + +```python +plt.close(fig) +``` + +从图中我们知道,向量$e$就像是向量$b, p$之间的误差,$e=b-p, e \bot p$。$p$在$a$上,有$\underline{p=ax}$。 + +所以有$a^Te=a^T(b-p)=a^T(b-ax)=0$。关于正交的最重要的方程: + +$$ +a^T(b-xa)=0 \\ +\underline{xa^Ta=a^Tb} \\ +\underline{x=\frac{a^Tb}{a^Ta}} \\ +p=a\frac{a^Tb}{a^Ta} +$$ + +从上面的式子可以看出,如果将$b$变为$2b$则$p$也会翻倍,如果将$a$变为$2a$则$p$不变。 + +设投影矩阵为$P$,则可以说投影矩阵作用与某个向量后,得到其投影向量,$projection_p=Pb$。 + +易看出$\underline{P=\frac{aa^T}{a^Ta}}$,若$a$是$n$维列向量,则$P$是一个$n \times n$矩阵。 + +观察投影矩阵$P$的列空间,$C(P)$是一条通过$a$的直线,而$rank(P)=1$(一列乘以一行:$aa^T$,而这一列向量$a$是该矩阵的基)。 + +投影矩阵的性质: + +* $\underline{P=P^T}$,投影矩阵是一个对称矩阵。 +* 如果对一个向量做两次投影,即$PPb$,则其结果仍然与$Pb$相同,也就是$\underline{P^2=P}$。 + +为什么我们需要投影?因为就像上一讲中提到的,有些时候$Ax=b$无解,我们只能求出最接近的那个解。 + +$Ax$总是在$A$的列空间中,而$b$却不一定,这是问题所在,所以我们可以将$b$变为$A$的列空间中最接近的那个向量,即将无解的$Ax=b$变为求有解的$A\hat{x}=p$($p$是$b$在$A$的列空间中的投影,$\hat{x}$不再是那个不存在的$x$,而是最接近的解)。 + +现在来看$\mathbb{R}^3$中的情形,将向量$b$投影在平面$A$上。同样的,$p$是向量$b$在平面$A$上的投影,$e$是垂直于平面$A$的向量,即$b$在平面$A$法方向的分量。 +设平面$A$的一组基为$a_1, a_2$,则投影向量$p=\hat{x_1}a_1+\hat{x_2}a_2$,我们更倾向于写作$p=A\hat{x}$,这里如果我们求出$\hat{x}$,则该解就是无解方程组最近似的解。 + +现在问题的关键在于找$e=b-A\hat{x}$,使它垂直于平面,因此我们得到两个方程 +$ +\begin{cases}a_1^T(b-A\hat{x})=0\\ +a_2^T(b-A\hat{x})=0\end{cases} +$,将方程组写成矩阵形式 +$ +\begin{bmatrix}a_1^T\\a_2^T\end{bmatrix} +(b-A\hat{x})= +\begin{bmatrix}0\\0\end{bmatrix} +$,即$A^T(b-A\hat{x})=0$。 + +比较该方程与$\mathbb{R}^2$中的投影方程,发现只是向量$a$变为矩阵$A$而已,本质上就是$A^Te=0$。所以,$e$在$A^T$的零空间中($e\in N(A^T)$),从前面几讲我们知道,左零空间$\bot$列空间,则有$e\bot C(A)$,与我们设想的一致。 + +再化简方程得$A^TAx=A^Tb$,比较在$\mathbb{R}^2$中的情形,$a^Ta$是一个数字而$A^TA$是一个$n$阶方阵,而解出的$x$可以看做两个数字的比值。现在在$\mathbb{R}^3$中,我们需要再次考虑:什么是$\hat{x}$?投影是什么?投影矩阵又是什么? + +* 第一个问题:$\hat x=(A^TA)^{-1}A^Tb$; +* 第二个问题:$p=A\hat x=\underline{A(A^TA)^{-1}A^T}b$,回忆在$\mathbb{R}^2$中的情形,下划线部分就是原来的$\frac{aa^T}{a^Ta}$; +* 第三个问题:易看出投影矩阵就是下划线部分$P=A(A^TA)^{-1}A^T$。 + +这里还需要注意一个问题,$P=A(A^TA)^{-1}A^T$是不能继续化简为$P=AA^{-1}(A^T)^{-1}A^T=I$的,因为这里的$A$并不是一个可逆方阵。 +也可以换一种思路,如果$A$是一个$n$阶可逆方阵,则$A$的列空间是整个$\mathbb{R}^n$空间,于是$b$在$\mathbb{R}^n$上的投影矩阵确实变为了$I$,因为$b$已经在空间中了,其投影不再改变。 + +再来看投影矩阵$P$的性质: +* $P=P^T$:有 +$ +\left[A(A^TA)^{-1}A^T\right]^T=A\left[(A^TA)^{-1}\right]^TA^T +$,而$(A^TA)$是对称的,所以其逆也是对称的,所以有$A((A^TA)^{-1})^TA^T=A(A^TA)^{-1}A^T$,得证。 +* $P^2=P$:有 +$ +\left[A(A^TA)^{-1}A^T\right]\left[A(A^TA)^{-1}A^T\right]=A(A^TA)^{-1}\left[(A^TA)(A^TA)^{-1}\right]A^T=A(A^TA)^{-1}A^T +$,得证。 + +## 最小二乘法 + +接下看看投影的经典应用案例:最小二乘法拟合直线(least squares fitting by a line)。 + +我们需要找到距离图中三个点 $(1, 1), (2, 2), (3, 2)$ 偏差最小的直线:$b=C+Dt$。 + + +```python +plt.style.use("seaborn-dark-palette") + +fig = plt.figure() +plt.axis('equal') +plt.axis([-1, 4, -1, 3]) +plt.axhline(y=0, c='black', lw='2') +plt.axvline(x=0, c='black', lw='2') + +plt.plot(1, 1, 'o', c='r') +plt.plot(2, 2, 'o', c='r') +plt.plot(3, 2, 'o', c='r') + +plt.annotate('(1, 1)', xy=(1, 1), xytext=(-40, 20), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) +plt.annotate('(2, 2)', xy=(2, 2), xytext=(-60, -5), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) +plt.annotate('(3, 2)', xy=(3, 2), xytext=(-18, 20), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) + +plt.grid() +``` + + +![png](img/chapter15_4_0.png) + + + +```python +plt.close(fig) +``` + +根据条件可以得到方程组 +$ +\begin{cases} +C+D&=1 \\ +C+2D&=2 \\ +C+3D&=2 \\ +\end{cases} +$,写作矩阵形式 +$\begin{bmatrix}1&1 \\1&2 \\1&3\\\end{bmatrix}\begin{bmatrix}C\\D\\\end{bmatrix}=\begin{bmatrix}1\\2\\2\\\end{bmatrix}$,也就是我们的$Ax=b$,很明显方程组无解。但是$A^TA\hat x=A^Tb$有解,于是我们将原是两边同时乘以$A^T$后得到的新方程组是有解的,$A^TA\hat x=A^Tb$也是最小二乘法的核心方程。 + +下一讲将进行最小二乘法的验算。 diff --git a/docs/linalg/chapter16.md b/docs/linalg/chapter16.md new file mode 100644 index 00000000..e3ad8a7c --- /dev/null +++ b/docs/linalg/chapter16.md @@ -0,0 +1,118 @@ + +# 第十六讲:投影矩阵和最小二乘 + +上一讲中,我们知道了投影矩阵$P=A(A^TA)^{-1}A^T$,$Pb$将会把向量投影在$A$的列空间中。 + +举两个极端的例子: +* 如果$b\in C(A)$,则$Pb=b$; +* 如果$b\bot C(A)$,则$Pb=0$。 + +一般情况下,$b$将会有一个垂直于$A$的分量,有一个在$A$列空间中的分量,投影的作用就是去掉垂直分量而保留列空间中的分量。 + +在第一个极端情况中,如果$b\in C(A)$则有$b=Ax$。带入投影矩阵$p=Pb=A(A^TA)^{-1}A^TAx=Ax$,得证。 + +在第二个极端情况中,如果$b\bot C(A)$则有$b\in N(A^T)$,即$A^Tb=0$。则$p=Pb=A(A^TA)^{-1}A^Tb=0$,得证。 + +向量$b$投影后,有$b=e+p, p=Pb, e=(I-P)b$,这里的$p$是$b$在$C(A)$中的分量,而$e$是$b$在$N(A^T)$中的分量。 + +回到上一讲最后提到的例题: + +我们需要找到距离图中三个点 $(1, 1), (2, 2), (3, 2)$ 偏差最小的直线:$y=C+Dt$。 + + +```python +%matplotlib inline +import matplotlib.pyplot as plt +from sklearn import linear_model +import numpy as np +import pandas as pd +import seaborn as sns + +x = np.array([1, 2, 3]).reshape((-1,1)) +y = np.array([1, 2, 2]).reshape((-1,1)) +predict_line = np.array([-1, 4]).reshape((-1,1)) + +regr = linear_model.LinearRegression() +regr.fit(x, y) +ey = regr.predict(x) + +fig = plt.figure() +plt.axis('equal') +plt.axhline(y=0, c='black') +plt.axvline(x=0, c='black') + +plt.scatter(x, y, c='r') +plt.scatter(x, regr.predict(x), s=20, c='b') +plt.plot(predict_line, regr.predict(predict_line), c='g', lw='1') +[ plt.plot([x[i], x[i]], [y[i], ey[i]], 'r', lw='1') for i in range(len(x))] + +plt.annotate('(1, 1)', xy=(1, 1), xytext=(-15, -30), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) +plt.annotate('(2, 2)', xy=(2, 2), xytext=(-60, -5), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) +plt.annotate('(3, 2)', xy=(3, 2), xytext=(-15, -30), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) + +plt.annotate('$e_1$', color='r', xy=(1, 1), xytext=(0, 2), textcoords='offset points', size=20) +plt.annotate('$e_2$', color='r', xy=(2, 2), xytext=(0, -15), textcoords='offset points', size=20) +plt.annotate('$e_3$', color='r', xy=(3, 2), xytext=(0, 1), textcoords='offset points', size=20) + +plt.annotate('$p_1$', xy=(1, 7/6), color='b', xytext=(-7, 30), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) +plt.annotate('$p_2$', xy=(2, 5/3), color='b', xytext=(-7, -30), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) +plt.annotate('$p_3$', xy=(3, 13/6), color='b', xytext=(-7, 30), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) +plt.draw() +``` + + +![png](img/chapter16_1_0.png) + + + +```python +plt.close(fig) +``` + +根据条件可以得到方程组 +$ +\begin{cases} +C+D&=1 \\ +C+2D&=2 \\ +C+3D&=2 \\ +\end{cases} +$,写作矩阵形式 +$\begin{bmatrix}1&1 \\1&2 \\1&3\\\end{bmatrix}\begin{bmatrix}C\\D\\\end{bmatrix}=\begin{bmatrix}1\\2\\2\\\end{bmatrix}$,也就是我们的$Ax=b$,很明显方程组无解。 + +我们需要在$b$的三个分量上都增加某个误差$e$,使得三点能够共线,同时使得$e_1^2+e_2^2+e_3^2$最小,找到拥有最小平方和的解(即最小二乘),即$\left\|Ax-b\right\|^2=\left\|e\right\|^2$最小。此时向量$b$变为向量$p=\begin{bmatrix}p_1\\p_2\\p_3\end{bmatrix}\\$(在方程组有解的情况下,$Ax-b=0$,即$b$在$A$的列空间中,误差$e$为零。)我们现在做的运算也称作线性回归(linear regression),使用误差的平方和作为测量总误差的标准。 + +注:如果有另一个点,如$(0, 100)$,在本例中该点明显距离别的点很远,最小二乘将很容易被离群的点影响,通常使用最小二乘时会去掉明显离群的点。 + +现在我们尝试解出$\hat x=\begin{bmatrix}\hat C\\ \hat D\end{bmatrix}$与$p=\begin{bmatrix}p_1\\p_2\\p_3\end{bmatrix}$。 + +$$ +A^TA\hat x=A^Tb\\ +A^TA= +\begin{bmatrix}3&6\\6&14\end{bmatrix}\qquad +A^Tb= +\begin{bmatrix}5\\11\end{bmatrix}\\ +\begin{bmatrix}3&6\\6&14\end{bmatrix} +\begin{bmatrix}\hat C\\\hat D\end{bmatrix}= +\begin{bmatrix}5\\11\end{bmatrix}\\ +$$ + +写作方程形式为$\begin{cases}3\hat C+16\hat D&=5\\6\hat C+14\hat D&=11\\\end{cases}$,也称作正规方程组(normal equations)。 + +回顾前面提到的“使得误差最小”的条件,$e_1^2+e_2^2+e_3^2=(C+D-1)^2+(C+2D-2)^2+(C+3D-2)^2$,使该式取最小值,如果使用微积分方法,则需要对该式的两个变量$C, D$分别求偏导数,再令求得的偏导式为零即可,正是我们刚才求得的正规方程组。(正规方程组中的第一个方程是对$C$求偏导的结果,第二个方程式对$D$求偏导的结果,无论使用哪一种方法都会得到这个方程组。) + +解方程得$\hat C=\frac{2}{3}, \hat D=\frac{1}{2}$,则“最佳直线”为$y=\frac{2}{3}+\frac{1}{2}t$,带回原方程组解得$p_1=\frac{7}{6}, p_2=\frac{5}{3}, p_3=\frac{13}{6}$,即$e_1=-\frac{1}{6}, e_2=\frac{1}{3}, e_3=-\frac{1}{6}$ + +于是我们得到$p=\begin{bmatrix}\frac{7}{6}\\\frac{5}{3}\\\frac{13}{6}\end{bmatrix}, e=\begin{bmatrix}-\frac{1}{6}\\\frac{1}{3}\\-\frac{1}{6}\end{bmatrix}$,易看出$b=p+e$,同时我们发现$p\cdot e=0$即$p\bot e$。 + +误差向量$e$不仅垂直于投影向量$p$,它同时垂直于列空间,如 $\begin{bmatrix}1\\1\\1\end{bmatrix}, \begin{bmatrix}1\\2\\3\end{bmatrix}$。 + +接下来我们观察$A^TA$,如果$A$的各列线性无关,求证$A^TA$是可逆矩阵。 + +先假设$A^TAx=0$,两边同时乘以$x^T$有$x^TA^TAx=0$,即$(Ax)^T(Ax)=0$。一个矩阵乘其转置结果为零,则这个矩阵也必须为零($(Ax)^T(Ax)$相当于$Ax$长度的平方)。则$Ax=0$,结合题设中的“$A$的各列线性无关”,可知$x=0$,也就是$A^TA$的零空间中有且只有零向量,得证。 + +我们再来看一种线性无关的特殊情况:互相垂直的单位向量一定是线性无关的。 + +* 比如$\begin{bmatrix}1\\0\\0\end{bmatrix}\begin{bmatrix}0\\1\\0\end{bmatrix}\begin{bmatrix}0\\0\\1\end{bmatrix}$,这三个正交单位向量也称作标准正交向量组(orthonormal vectors)。 +* 另一个例子$\begin{bmatrix}\cos\theta\\\sin\theta\end{bmatrix}\begin{bmatrix}-\sin\theta\\\cos\theta\end{bmatrix}$ + +下一讲研究标准正交向量组。 diff --git a/docs/linalg/chapter17.md b/docs/linalg/chapter17.md new file mode 100644 index 00000000..3c0897fa --- /dev/null +++ b/docs/linalg/chapter17.md @@ -0,0 +1,44 @@ + +# 第十七讲:正交矩阵和Gram-Schmidt正交化法 + +## 标准正交矩阵 + +定义标准正交向量(orthonormal):$q_i^Tq_j=\begin{cases}0\quad i\neq j\\1\quad i=j\end{cases}$ + +我们将标准正交向量放入矩阵中,有$Q=\Bigg[q_1 q_2 \cdots q_n\Bigg]$。 + +上一讲我们研究了$A^A$的特性,现在来观察$Q^TQ=\begin{bmatrix} & q_1^T & \\ & q_2^T & \\ & \vdots & \\ & q_n^T & \end{bmatrix}\Bigg[q_1 q_2 \cdots q_n\Bigg]$ + +根据标准正交向量的定义,计算$Q^TQ=\begin{bmatrix}1&0&\cdots&0\\0&1&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&1\end{bmatrix}=I$,我们也把$Q$成为标准正交矩阵(orthonormal matrix)。 + +特别的,当$Q$恰好是方阵时,由于正交性,易得$Q$是可逆的,又$Q^TQ=I$,所以$Q^T=Q^{-1}$。 + +* 举个置换矩阵的例子:$Q=\begin{bmatrix}0&1&0\\1&0&0\\0&0&1\end{bmatrix}$,则$Q^T=\begin{bmatrix}0&1&0\\0&0&1\\1&0&0\end{bmatrix}$,易得$Q^TQ=I$。 +* 使用上一讲的例子$Q=\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{bmatrix}$,列向量长度为$1$,且列向量相互正交。 +* 其他例子$Q=\frac{1}{\sqrt 2}\begin{bmatrix}1&1\\1&-1\end{bmatrix}$,列向量长度为$1$,且列向量相互正交。 +* 使用上一个例子的矩阵,令$Q'=c\begin{bmatrix}Q&Q\\Q&-Q\end{bmatrix}$,取合适的$c$另列向量长度为$1$也可以构造标准正交矩阵:$Q=\frac{1}{2}\begin{bmatrix}1&1&1&1\\1&-1&1&-1\\1&1&-1&-1\\1&-1&-1&1\end{bmatrix}$,这种构造方法以阿德玛(Adhemar)命名,对$2, 4, 16, 64, \cdots$阶矩阵有效。 +* 再来看一个例子,$Q=\frac{1}{3}\begin{bmatrix}1&-2&2\\2&-1&-2\\2&2&1\end{bmatrix}$,列向量长度为$1$,且列向量相互正交。格拉姆-施密特正交化法的缺点在于,由于要求得单位向量,所以我们总是除以向量的长度,这导致标准正交矩阵中总是带有根号,而上面几个例子很少有根号。 + +再来看标准正交化有什么好处,假设要做投影,将向量$b$投影在标准正交矩阵$Q$的列空间中,根据上一讲的公式得$P=Q(Q^TQ)^{-1}Q^T$,易得$P=QQ^T$。我们断言,当列向量为标准正交基时,$QQ^T$是投影矩阵。极端情况,假设矩阵是方阵,而其列向量是标准正交的,则其列空间就是整个向量空间,而投影整个空间的投影矩阵就是单位矩阵,此时$QQ^T=I$。可以验证一下投影矩阵的两个性质:$(QQ^T)^T=(Q^T)^TQ^T=QQ^T$,得证;$(QQ^T)^2=QQ^TQQ^T=Q(Q^TQ)Q^T=QQ^T$,得证。 + +我们计算的$A^TA\hat x=A^Tb$,现在变为$Q^TQ\hat x=Q^Tb$,也就是$\hat x=Q^Tb$,分解开来看就是 $\underline{\hat x_i=q_i^Tb}$,这个式子在很多数学领域都有重要作用。当我们知道标准正交基,则解向量第$i$个分量为基的第$i$个分量乘以$b$,在第$i$个基方向上的投影就等于$q_i^Tb$。 + +## Gram-Schmidt正交化法 + +我们有两个线性无关的向量$a, b$,先把它们化为正交向量$A, B$,再将它们单位化,变为单位正交向量$q_1=\frac{A}{\left\|A\right\|}, q_2=\frac{B}{\left\|B\right\|}$: + +* 我们取定$a$向量的方向,$a=A$; +* 接下来将$b$投影在$A$的法方向上得到$B$,也就是求子空间投影一讲中,我们提到的误差向量$e=b-p$,即$B=b-\frac{A^Tb}{A^TA}A$。检验一下$A\bot B$,$A^TB=A^Tb-A^T\frac{A^Tb}{A^TA}A=A^Tb-\frac{A^TA}{A^TA}A^Tb=0$。($\frac{A^Tb}{A^TA}A$就是$A\hat x=p$。) + +如果我们有三个线性无关的向量$a, b, c$,则我们现需要求它们的正交向量$A, B, C$,再将它们单位化,变为单位正交向量$q_1=\frac{A}{\left\|A\right\|}, q_2=\frac{B}{\left\|B\right\|}, q_3=\frac{C}{\left\|C\right\|}$: + +* 前两个向量我们已经得到了,我们现在需要求第三个向量同时正交于$A, B$; +* 我们依然沿用上面的方法,从$c$中减去其在$A, B$上的分量,得到正交与$A, B$的$C$:$C=c-\frac{A^Tc}{A^TA}A-\frac{B^Tc}{B^TB}B$。 + +现在我们试验一下推导出来的公式,$a=\begin{bmatrix}1\\1\\1\end{bmatrix}, b=\begin{bmatrix}1\\0\\2\end{bmatrix}$: + +* 则$A=a=\begin{bmatrix}1\\1\\1\end{bmatrix}$; +* 根据公式有$B=a-hA$,$h$是比值$\frac{A^Tb}{A^TA}=\frac{3}{3}$,则$B=\begin{bmatrix}1\\1\\1\end{bmatrix}-\frac{3}{3}\begin{bmatrix}1\\0\\2\end{bmatrix}=\begin{bmatrix}0\\-1\\1\end{bmatrix}$。验证一下正交性有$A\cdot B=0$。 +* 单位化,$q_1=\frac{1}{\sqrt 3}\begin{bmatrix}1\\1\\1\end{bmatrix},\quad q_2=\frac{1}{\sqrt 2}\begin{bmatrix}1\\0\\2\end{bmatrix}$,则标准正交矩阵为$Q=\begin{bmatrix}\frac{1}{\sqrt 3}&0\\\frac{1}{\sqrt 3}&-\frac{1}{\sqrt 2}\\\frac{1}{\sqrt 3}&\frac{1}{\sqrt 2}\end{bmatrix}$,对比原来的矩阵$D=\begin{bmatrix}1&1\\1&0\\1&2\end{bmatrix}$,有$D, Q$的列空间是相同的,我们只是将原来的基标准正交化了。 + +我们曾经用矩阵的眼光审视消元法,有$A=LU$。同样的,我们也用矩阵表达标准正交化,$A=QR$。设矩阵$A$有两个列向量$\Bigg[a_1 a_2\Bigg]$,则标准正交化后有$\Bigg[a_1 a_2\Bigg]=\Bigg[q_1 q_2\Bigg]\begin{bmatrix}a_1^Tq_1&a_2^Tq_1\\a_1^Tq_2&a_2^Tq_2\end{bmatrix}$,而左下角的$a_1^Tq_2$始终为$0$,因为Gram-Schmidt正交化总是使得$a_1\bot q_2$,后来构造的向量总是正交于先前的向量。所以这个$R$矩阵是一个上三角矩阵。 diff --git a/docs/linalg/chapter18.md b/docs/linalg/chapter18.md new file mode 100644 index 00000000..70e74548 --- /dev/null +++ b/docs/linalg/chapter18.md @@ -0,0 +1,38 @@ + +# 第十八讲:行列式及其性质 + +本讲我们讨论出行列式(determinant)的性质: + +1. $\det{I}=1$,单位矩阵行列式值为一。 +2. 交换行行列式变号。 + + 在给出第三个性质之前,先由前两个性质可知,对置换矩阵有$\det P=\begin{cases}1\quad &even\\-1\quad &odd\end{cases}$。 + + 举例:$\begin{vmatrix}1&0\\0&1\end{vmatrix}=1,\quad\begin{vmatrix}0&1\\1&0\end{vmatrix}=-1$,于是我们猜想,对于二阶方阵,行列式的计算公式为$\begin{vmatrix}a&b\\c&d\end{vmatrix}=ad-bc$。 + +3. a. $\begin{vmatrix}ta&tb\\tc&td\end{vmatrix}=t\begin{vmatrix}a&b\\c&d\end{vmatrix}$。 + + b. $\begin{vmatrix}a+a'&b+b'\\c&d\end{vmatrix}=\begin{vmatrix}a&b\\c&d\end{vmatrix}+\begin{vmatrix}a'&b'\\c&d\end{vmatrix}$。 + + **注意**:~~这里并不是指$\det (A+B)=\det A+\det B$,方阵相加会使每一行相加,这里仅是针对某一行的线性变换。~~ + +4. 如果两行相等,则行列式为零。使用性质2交换两行易证。 +5. 从第$k$行中减去第$i$行的$l$倍,行列式不变。这条性质是针对消元的,我们可以先消元,将方阵变为上三角形式后再计算行列式。 + + 举例:$\begin{vmatrix}a&b\\c-la&d-lb\end{vmatrix}\stackrel{3.b}{=}\begin{vmatrix}a&b\\c&d\end{vmatrix}+\begin{vmatrix}a&b\\-la&-lb\end{vmatrix}\stackrel{3.a}{=}\begin{vmatrix}a&b\\c&d\end{vmatrix}-l\begin{vmatrix}a&b\\a&b\end{vmatrix}\stackrel{4}{=}\begin{vmatrix}a&b\\c&d\end{vmatrix}$ + +6. 如果方阵的某一行为零,则其行列式值为零。使用性质3.a对为零行乘以不为零系数$l$,使$l\det A=\det A$即可证明;或使用性质5将某行加到为零行,使存在两行相等后使用性质4即可证明。 + +7. 有上三角行列式$U=\begin{vmatrix}d_{1}&*&\cdots&*\\0&d_{2}&\cdots&*\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&d_{n}\end{vmatrix}$,则$\det U=d_1d_2\cdots d_n$。使用性质5,从最后一行开始,将对角元素上方的$*$元素依次变为零,可以得到型为$D=\begin{vmatrix}d_{1}&0&\cdots&0\\0&d_{2}&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&d_{n}\end{vmatrix}$的对角行列式,再使用性质3将对角元素提出得到$d_nd_{n-1}\cdots d_1\begin{vmatrix}1&0&\cdots&0\\0&1&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&1\end{vmatrix}$,得证。 + +8. 当矩阵$A$为奇异矩阵时,$\det A=0$;当且仅当$A$可逆时,有$\det A\neq0$。如果矩阵可逆,则化简为上三角形式后各行都含有主元,行列式即为主元乘积;如果矩阵奇异,则化简为上三角形式时会出现全零行,行列式为零。 + + 再回顾二阶情况:$\begin{vmatrix}a&b\\c&d\end{vmatrix}\xrightarrow{消元}\begin{vmatrix}a&b\\0&d-\frac{c}{a}b\end{vmatrix}=ad-bc$,前面的猜想得到证实。 + +9. $\det AB=(\det A)(\det B)$。使用这一性质,$\det I=\det{A^{-1}A}=\det A^{-1}\det A$,所以$\det A^{-1}=\frac{1}{\det A}$。 + + 同时还可以得到:$\det A^2=(\det A)^2$,以及$\det 2A=2^n\det A$,这个式子就像是求体积,对三维物体有每边翻倍则体积变为原来的八倍。 + +10. $\det A^T=\det A$,前面一直在关注行的属性给行列式带来的变化,有了这条性质,行的属性同样适用于列,比如对性质2就有“交换列行列式变号”。 + + 证明:$\left|A^T\right|=\left|A\right|\rightarrow\left|U^TL^T\right|=\left|LU\right|\rightarrow\left|U^T\right|\left|L^T\right|=\left|L\right|\left|U\right|$,值得注意的是,$L, U$的行列式并不因为转置而改变,得证。 diff --git a/docs/linalg/chapter19.md b/docs/linalg/chapter19.md new file mode 100644 index 00000000..653d7971 --- /dev/null +++ b/docs/linalg/chapter19.md @@ -0,0 +1,52 @@ + +# 第十九讲:行列式公式和代数余子式 + +上一讲中,我们从三个简单的性质扩展出了一些很好的推论,本讲将继续使用这三条基本性质: + +1. $\det I=1$; +2. 交换行行列式变号; +3. 对行列式的每一行都可以单独使用线性运算,其值不变; + +我们使用这三条性质推导二阶方阵行列式: + +$$\begin{vmatrix}a&b\\c&d\end{vmatrix}=\begin{vmatrix}a&0\\c&d\end{vmatrix}+\begin{vmatrix}0&b\\c&d\end{vmatrix}=\begin{vmatrix}a&0\\c&0\end{vmatrix}+\begin{vmatrix}a&0\\0&d\end{vmatrix}+\begin{vmatrix}0&b\\c&0\end{vmatrix}+\begin{vmatrix}0&b\\0&d\end{vmatrix}=ad-bc$$ + +按照这个方法,我们继续计算三阶方阵的行列式,可以想到,我们保持第二、三行不变,将第一行拆分为个行列式之和,再将每一部分的第二行拆分为三部分,这样就得到九个行列式,再接着拆分这九个行列式的第三行,最终得到二十七个行列式。可以想象到,这些矩阵中有很多值为零的行列式,我们只需要找到不为零的行列式,求和即可。 + +$$\begin{vmatrix}a_{11}&a_{12}&a_{13}\\a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{vmatrix}=\begin{vmatrix}a_{11}&0&0\\0&a_{22}&0\\0&0&a_{33}\end{vmatrix}+\begin{vmatrix}a_{11}&0&0\\0&0&a_{23}\\0&a_{32}&0\end{vmatrix}+\begin{vmatrix}0&a_{12}&0\\a_{21}&0&0\\0&0&a_{33}\end{vmatrix}+\begin{vmatrix}0&a_{12}&0\\0&0&a_{23}\\a_{31}&0&0\end{vmatrix}+\begin{vmatrix}0&0&a_{13}\\a_{21}&0&0\\0&a_{32}&0\end{vmatrix}+\begin{vmatrix}0&0&a_{13}\\0&a_{22}&0\\a_{31}&0&0\end{vmatrix}$$ + +$$原式=a_{11}a_{22}a_{33}-a_{11}a_{23}a_{32}-a_{12}a_{21}a_{33}+a_{12}a_{23}a_{31}+a_{13}a_{21}a_{32}-a_{13}a_{22}a_{31}\tag{1}$$ + +同理,我们想继续推导出阶数更高的式子,按照上面的式子可知$n$阶行列式应该可以分解成$n!$个非零行列式(占据第一行的元素有$n$种选择,占据第二行的元素有$n-1$种选择,以此类推得$n!$): + +$$\det A=\sum_{n!} \pm a_{1\alpha}a_{2\beta}a_{3\gamma}\cdots a_{n\omega}, (\alpha, \beta, \gamma, \omega)=P_n^n\tag{2}$$ + +这个公式还不完全,接下来需要考虑如何确定符号: + +$$\begin{vmatrix}0&0&\overline 1&\underline 1\\0&\overline 1&\underline 1&0\\\overline 1&\underline 1&0&0\\\underline 1&0&0&\overline 1\end{vmatrix}$$ +* 观察带有下划线的元素,它们的排列是$(4,3,2,1)$,变为$(1,2,3,4)$需要两步操作,所以应取$+$; +* 观察带有上划线的元素,它们的排列是$(3,2,1,4)$,变为$(1,2,3,4)$需要一步操作,所以应取$-$。 +* 观察其他元素,我们无法找出除了上面两种以外的排列方式,于是该行列式值为零,这是一个奇异矩阵。 + +此处引入代数余子式(cofactor)的概念,它的作用是把$n$阶行列式化简为$n-1$阶行列式。 + +于是我们把$(1)$式改写为: + +$$a_{11}(a_{22}a_{33}-a_{23}a_{32})+a_{12}(a_{21}a_{33}-a_{23}a_{31})+a_{13}(a_{21}a_{32}-a_{22}a_{31})$$ + +$$\begin{vmatrix}a_{11}&0&0\\0&a_{22}&a_{23}\\0&a_{32}&a_{33}\end{vmatrix}+\begin{vmatrix}0&a_{12}&0\\a_{21}&0&a_{23}\\a_{31}&0&a_{33}\end{vmatrix}+\begin{vmatrix}0&0&a_{13}\\a_{21}&a_{22}&0\\a_{31}&a_{32}&0\end{vmatrix}$$ + +于是,我们可以定义$a_{ij}$的代数余子式:将原行列式的第$i$行与第$j$列抹去后得到的$n-1$阶行列式记为$C_{ij}$,$i+j$为偶时时取$+$,$i+j$为奇时取$-$。 + +现在再来完善式子$(2)$:将行列式$A$沿第一行展开: + +$$\det A=a_{11}C_{11}+a_{12}C_{12}+\cdots+a_{1n}C_{1n}$$ + +到现在为止,我们了解了三种求行列式的方法: + +1. 消元,$\det A$就是主元的乘积; +2. 使用$(2)$式展开,求$n!$项之积; +3. 使用代数余子式。 + +计算例题: +$A_4=\begin{vmatrix}1&1&0&0\\1&1&1&0\\0&1&1&1\\0&0&1&1\end{vmatrix}\stackrel{沿第一行展开}{=}\begin{vmatrix}1&1&0\\1&1&1\\0&1&1\end{vmatrix}-\begin{vmatrix}1&1&0\\0&1&1\\0&1&1\end{vmatrix}=-1-0=-1$ diff --git a/docs/linalg/chapter20.md b/docs/linalg/chapter20.md new file mode 100644 index 00000000..144ccd95 --- /dev/null +++ b/docs/linalg/chapter20.md @@ -0,0 +1,53 @@ + +# 第二十讲:克拉默法则、逆矩阵、体积 + +本讲主要介绍逆矩阵的应用。 + +## 求逆矩阵 + +我们从逆矩阵开始,对于二阶矩阵有$\begin{bmatrix}a&b\\c&d\end{bmatrix}^{-1}=\frac{1}{ad-bc}\begin{bmatrix}d&-b\\-c&a\end{bmatrix}$。观察易得,系数项就是行列式的倒数,而矩阵则是由一系列代数余子式组成的。先给出公式: + +$$ +A^{-1}=\frac{1}{\det A}C^T +\tag{1} +$$ + +观察这个公式是如何运作的,化简公式得$AC^T=(\det A)I$,写成矩阵形式有$\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\\vdots&\vdots&\ddots&\vdots\\a_{n1}&a_{n2}&\cdots&a_{nn}\end{bmatrix}\begin{bmatrix}C_{11}&\cdots&C_{n1}\\C_{12}&\cdots&C_{n2}\\\vdots&\ddots&\vdots\\C_{1n}&\cdots&C_{nn}\end{bmatrix}=Res$ + +对于这两个矩阵的乘积,观察其结果的元素$Res_{11}=a_{11}C_{11}+a_{12}C_{12}+\cdots+a_{1n}C_{1n}$,这正是上一讲提到的将行列式按第一行展开的结果。同理,对$Res_{22}, \cdots, Res_{nn}$都有$Res_{ii}=\det A$,即对角线元素均为$\det A$。 + +再来看非对角线元素:回顾二阶的情况,如果用第一行乘以第二行的代数余子式$a_{11}C_{21}+a_{12}C_{22}$,得到$a(-b)+ab=0$。换一种角度看问题,$a(-b)+ab=0$也是一个矩阵的行列式值,即$A_{s}=\begin{bmatrix}a&b\\a&b\end{bmatrix}$。将$\det A_{s}$按第二行展开,也会得到$\det A_{s}=a(-b)+ab$,因为行列式有两行相等所以行列式值为零。 + +推广到$n$阶,我们来看元素$Res_{1n}=a_{11}C_{n1}+a_{12}C_{n2}+\cdots+a_{1n}C_{nn}$,该元素是第一行与最后一行的代数余子式相乘之积。这个式子也可以写成一个特殊矩阵的行列式,即矩阵$A_{s}=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{n-a1}&a_{n-12}&\cdots&a_{n-1n}\\a_{11}&a_{12}&\cdots&a_{1n}\end{bmatrix}$。计算此矩阵的行列式,将$\det A_{s}$按最后一行展开,也得到$\det A_{s}=a_{11}C_{n1}+a_{12}C_{n2}+\cdots+a_{1n}C_{nn}$。同理,行列式$A_{s}$有两行相等,其值为零。 + +结合对角线元素与非对角线元素的结果,我们得到$Res=\begin{bmatrix}\det A&0&\cdots&0\\0&\det A&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&\det A\end{bmatrix}$,也就是$(1)$等式右边的$(\det A)I$,得证。 + +## 求解$Ax=b$ + +因为我们现在有了逆矩阵的计算公式,所以对$Ax=b$有$x=A^{-1}b=\frac{1}{\det A}C^Tb$,这就是计算$x$的公式,即克莱默法则(Cramer's rule)。 + +现在来观察$x=\frac{1}{\det A}C^Tb$,我们将得到的解拆分开来,对$x$的第一个分量有$x_1=\frac{y_1}{\det A}$,这里$y_1$是一个数字,其值为$y_1=b_1C_{11}+b_2C_{21}+\cdots+b_nC_{n1}$,每当我们看到数字与代数余子式乘之积求和时,都应该联想到求行列式,也就是说$y_1$可以看做是一个矩阵的行列式,我们设这个矩阵为$B_1$。所以有$x_i=\frac{\det B_1}{\det A}$,同理有$x_2=\frac{\det B_2}{\det A}$,$x_2=\frac{\det B_2}{\det A}$。 + +而$B_1$是一个型为$\Bigg[b a_2 a_3 \cdots a_n\Bigg]$的矩阵,即将矩阵$A$的第一列变为$b$向量而得到的新矩阵。其实很容易看出,$\det B_1$可以沿第一列展开得到$y_1=b_1C_{11}+b_2C_{21}+\cdots+b_nC_{n1}$。 + +一般的,有$B_j=\Bigg[a_1 a_2 \cdots a_{j-1} b a_{j+1} \cdots a_n\Bigg]$,即将矩阵$A$的第$j$列变为$b$向量而得到的新矩阵。所以,对于解的分量有$x_j=\frac{\det B_j}{\det A}$。 + +这个公式虽然很漂亮,但是并不方便计算。 + +## 关于体积(Volume) + +先提出命题:行列式的绝对值等于一个箱子的体积。 + +来看三维空间中的情形,对于$3$阶方阵$A$,取第一行$(a_1,a_2,a_3)$,令其为三维空间中点$A_1$的坐标,同理有点$A_2, A_3$。连接这三个点与原点可以得到三条边,使用这三条边展开得到一个平行六面体,$\left\|\det A\right\|$就是该平行六面体的体积。 + +对于三阶单位矩阵,其体积为$\det I=1$,此时这个箱子是一个单位立方体。这其实也证明了前面学过的行列式性质1。于是我们想,如果能接着证明性质2、3即可证明体积与行列式的关系。 + +对于行列式性质2,我们交换两行并不会改变箱子的大小,同时行列式的绝对值也没有改变,得证。 + +现在我们取矩阵$A=Q$,而$Q$是一个标准正交矩阵,此时这个箱子是一个立方体,可以看出其实这个箱子就是刚才的单位立方体经过旋转得到的。对于标准正交矩阵,有$Q^TQ=I$,等式两边取行列式得$\det(Q^TQ)=1=\left|Q^T\right|\left|Q\right|$,而根据行列式性质10有$\left|Q^T\right|=\left|Q\right|$,所以$原式=\left|Q\right|^2=1, \left|Q\right|=\pm 1$。 + +接下来在考虑不再是“单位”的立方体,即长方体。 假设$Q$矩阵的第一行翻倍得到新矩阵$Q_2$,此时箱子变为在第一行方向上增加一倍的长方体箱子,也就是两个“标准正交箱子”在第一行方向上的堆叠。易知这个长方体箱子是原来体积的两倍,而根据行列式性质3.a有$\det Q_2=\det Q$,于是体积也符合行列式的数乘性质。 + +我们来看二阶方阵的情形,$\begin{vmatrix}a+a'&b+b'\\c&d\end{vmatrix}=\begin{vmatrix}a&b\\c&d\end{vmatrix}+\begin{vmatrix}a'&b'\\c&d\end{vmatrix}$。在二阶情况中,行列式就是一个求平行四边形面积的公式,原来我们求由四个点$(0,0), (a,b), (c,d), (a+c,b+d)$围成的四边形的面积,需要先求四边形的底边长,再做高求解,现在只需要计算$\det A=ad-bc$即可(更加常用的是求由$(0,0), (a,b), (c,d)$围成的三角形的面积,即$\frac{1}{2}ad-bc$)。也就是说,如果知道了歪箱子的顶点坐标,求面积(二阶情形)或体积(三阶情形)时,我们不再需要开方、求角度,只需要计算行列式的值就行了。 + +再多说两句我们通过好几讲得到的这个公式,在一般情形下,由点$(x_1,y_1), (x_2,y_2), (x_3,y_3)$围成的三角形面积等于$\frac{1}{2}\begin{vmatrix}x_1&y_1&1\\x_2&y_2&1\\x_3&y_3&1\end{vmatrix}$,计算时分别用第二行、第三行减去第一行化简到第三列只有一个$1$(这个操作实际作用是将三角形移动到原点),得到$\frac{1}{2}\begin{vmatrix}x_1&y_1&1\\x_2-x_1&y_2-y_1&0\\x_3-x_1&y_3-y_1&0\end{vmatrix}$,再按照第三列展开,得到三角形面积等于$\frac{(x_2-x_1)(y_3-y_1)-(x_3-x_1)(y_2-y_1)}{2}$。 diff --git a/docs/linalg/chapter21.md b/docs/linalg/chapter21.md new file mode 100644 index 00000000..6cd1f4c3 --- /dev/null +++ b/docs/linalg/chapter21.md @@ -0,0 +1,70 @@ + +# 第二十一讲:特征值和特征向量 + +## 特征值、特征向量的由来 + +给定矩阵$A$,矩阵$A$乘以向量$x$,就像是使用矩阵$A$作用在向量$x$上,最后得到新的向量$Ax$。在这里,矩阵$A$就像是一个函数,接受一个向量$x$作为输入,给出向量$Ax$作为输出。 + +在这一过程中,我们对一些特殊的向量很感兴趣,他们在输入($x$)输出($Ax$)的过程中始终保持同一个方向,这是比较特殊的,因为在大多情况下,$Ax$与$x$指向不同的方向。在这种特殊的情况下,$Ax$平行于$x$,我们把满足这个条件的$x$成为特征向量(Eigen vector)。这个平行条件用方程表示就是: + +$$Ax=\lambda x\tag{1}$$ + +* 对这个式子,我们试着计算特征值为$0$的特征向量,此时有$Ax=0$,也就是特征值为$0$的特征向量应该位于$A$的零空间中。 + + 也就是说,如果矩阵是奇异的,那么它将有一个特征值为$\lambda = 0$。 + +* 我们再来看投影矩阵$P=A(A^TA)^{-1}A^T$的特征值和特征向量。用向量$b$乘以投影矩阵$P$得到投影向量$Pb$,在这个过程中,只有当$b$已经处于投影平面(即$A$的列空间)中时,$Pb$与$b$才是同向的,此时$b$投影前后不变($Pb=1\cdot b$)。 + + 即在投影平面中的所有向量都是投影矩阵的特征向量,而他们的特征值均为$1$。 + + 再来观察投影平面的法向量,也就是投影一讲中的$e$向量。我们知道对于投影,因为$e\bot C(A)$,所以$Pe=0e$,即特征向量$e$的特征值为$0$。 + + 于是,投影矩阵的特征值为$\lambda=1, 0$。 + +* 再多讲一个例子,二阶置换矩阵$A=\begin{bmatrix}0&1\\1&0\end{bmatrix}$,经过这个矩阵处理的向量,其元素会互相交换。 + + 那么特征值为$1$的特征向量(即经过矩阵交换元素前后仍然不变)应该型为$\begin{bmatrix}1\\1\end{bmatrix}$。 + + 特征值为$-1$的特征向量(即经过矩阵交换元素前后方向相反)应该型为$\begin{bmatrix}1\\-1\end{bmatrix}$。 + +再提前透露一个特征值的性质:对于一个$n\times n$的矩阵,将会有$n$个特征值,而这些特征值的和与该矩阵对角线元素的和相同,因此我们把矩阵对角线元素称为矩阵的迹(trace)。$$\sum_{i=1}^n \lambda_i=\sum_{i=1}^n a_{ii}$$ + +在上面二阶转置矩阵的例子中,如果我们求得了一个特征值$1$,那么利用迹的性质,我们就可以直接推出另一个特征值是$-1$。 + +## 求解$Ax=\lambda x$ + +对于方程$Ax=\lambda x$,有两个未知数,我们需要利用一些技巧从这一个方程中一次解出两个未知数,先移项得$(A-\lambda I)x=0$。 + +观察$(A-\lambda I)x=0$,右边的矩阵相当于将$A$矩阵平移了$\lambda$个单位,而如果方程有解,则这个平移后的矩阵$(A-\lambda I)$一定是奇异矩阵。根据前面学到的行列式的性质,则有$$\det{(A-\lambda{I})}=0\tag{2}$$ + +这样一来,方程中就没有$x$了,这个方程也叫作特征方程(characteristic equation)。有了特征值,代回$(A-\lambda I)x=0$,继续求$(A-\lambda I)$的零空间即可。 + +* 现在计算一个简单的例子,$A=\begin{bmatrix}3&1\\1&3\end{bmatrix}$,再来说一点题外话,这是一个对称矩阵,我们将得到实特征值,前面还有置换矩阵、投影矩阵,矩阵越特殊,则我们得到的特征值与特征向量也越特殊。看置换矩阵中的特征值,两个实数$1, -1$,而且它们的特征向量是正交的。 + + 回到例题,计算$\det{(A-\lambda{I})}=\begin{vmatrix}3-\lambda&1\\1&3-\lambda\end{vmatrix}$,也就是对角矩阵平移再取行列式。原式继续化简得$(3-\lambda)^2-1=\lambda^2-6\lambda+8=0, \lambda_1=4,\lambda_2=2$。可以看到一次项系数$-6$与矩阵的迹有关,常数项与矩阵的行列式有关。 + + 继续计算特征向量,$A-4I=\begin{bmatrix}-1&1\\1&-1\end{bmatrix}$,显然矩阵是奇异的(如果是非奇异说明特征值计算有误),解出矩阵的零空间$x_1=\begin{bmatrix}1\\1\end{bmatrix}$;同理计算另一个特征向量,$A-2I=\begin{bmatrix}1&1\\1&1\end{bmatrix}$,解出矩阵的零空间$x_2=\begin{bmatrix}1\\-1\end{bmatrix}$。 + + 回顾前面转置矩阵的例子,对矩阵$A'=\begin{bmatrix}0&1\\1&0\end{bmatrix}$有$\lambda_1=1, x_1=\begin{bmatrix}1\\1\end{bmatrix}, \lambda_2=-1, x_2=\begin{bmatrix}-1\\1\end{bmatrix}$。看转置矩阵$A'$与本例中的对称矩阵$A$有什么联系。 + + 易得$A=A'+3I$,两个矩阵特征值相同,而其特征值刚好相差$3$。也就是如果给一个矩阵加上$3I$,则它的特征值会加$3$,而特征向量不变。这也很容易证明,如果$Ax=\lambda x$,则$(A+3I)x=\lambda x+3x=(\lambda+3)x$,所以$x$还是原来的$x$,而$\lambda$变为$\lambda+3$。 + +接下来,看一个关于特征向量认识的误区:已知$Ax=\lambda x, Bx=\alpha x$,则有$(A+B)x=(\lambda+\alpha)x$,当$B=3I$时,在上例中我们看到,确实成立,但是如果$B$为任意矩阵,则推论**不成立**,因为这两个式子中的特征向量$x$并不一定相同,所以两个式子的通常情况是$Ax=\lambda x, By=\alpha y$,它们也就无从相加了。 + +* 再来看旋转矩阵的例子,旋转$90^\circ$的矩阵$Q=\begin{bmatrix}\cos 90&-\sin 90\\\sin 90&\cos 90\end{bmatrix}=\begin{bmatrix}0&-1\\1&0\end{bmatrix}$(将每个向量旋转$90^\circ$,用$Q$表示因为旋转矩阵是正交矩阵中很重要的例子)。 + + 上面提到特征值的一个性质:特征值之和等于矩阵的迹;现在有另一个性质:特征值之积等于矩阵的行列式。$$\prod_{i=1}^n\lambda_i=\det A$$ + + 对于$Q$矩阵,有$\begin{cases}\lambda_1+\lambda_2&=0\\\lambda_1\cdot\lambda_2&=1\end{cases}$,再来思考特征值与特征向量的由来,哪些向量旋转$90^\circ$后与自己平行,于是遇到了麻烦,并没有这种向量,也没有这样的特征值来满足前面的方程组。 + + 我们来按部就班的计算,$\det(Q-\lambda I)=\begin{vmatrix}\lambda&-1\\1&\lambda\end{vmatrix}=\lambda^2+1=0$,于是特征值为$\lambda_1=i, \lambda_2=-i$,我们看到这两个值满足迹与行列式的方程组,即使矩阵全是实数,其特征值也可能不是实数。本例中即出现了一对共轭负数,我们可以说,如果矩阵越接近对称,那么特征值就是实数。如果矩阵越不对称,就像本例,$Q^T=-Q$,这是一个反对称的矩阵,于是我得到了纯虚的特征值,这是极端情况,通常我们见到的矩阵是介于对称与反对称之间的。 + + 于是我们看到,对于好的矩阵(置换矩阵)有实特征值及正交的特征向量,对于不好的矩阵($90^\circ$旋转矩阵)有纯虚的特征值。 + +* 再来看一个更糟的情况,$A=\begin{bmatrix}3&1\\0&3\end{bmatrix}$,这是一个三角矩阵,我们可以直接得出其特征值,即对角线元素。来看如何得到这一结论的:$\det(A-\lambda I)=\begin{vmatrix}3-\lambda&1\\0&3-\lambda\end{vmatrix}=(3-\lambda)^2=0$,于是$\lambda_1=3, \lambda_2=3$。而我们说这是一个糟糕的状况,在于它的特征向量。 + + 带入特征值计算特征向量,带入$\lambda_1=3$得$(A-\lambda I)x=\begin{bmatrix}0&1\\0&0\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}$,算出一个特征值$x_1=\begin{bmatrix}1\\0\end{bmatrix}$,当我们带入第二个特征值$\lambda_1=3$时,我们无法得到另一个与$x_1$线性无关的特征向量了。 + + 而本例中的矩阵$A$是一个退化矩阵(degenerate matrix),重复的特征值在特殊情况下可能导致特征向量的短缺。 + +这一讲我们看到了足够多的“不好”的矩阵,下一讲会介绍一般情况下的特征值与特征向量。 diff --git a/docs/linalg/chapter22.md b/docs/linalg/chapter22.md new file mode 100644 index 00000000..494b1983 --- /dev/null +++ b/docs/linalg/chapter22.md @@ -0,0 +1,72 @@ + +# 第二十二讲:对角化和$A$的幂 + +## 对角化矩阵 + +上一讲我们提到关键方程$Ax=\lambda x$,通过$\det(A-\lambda I)=0$得到特征向量$\lambda$,再带回关键方程算出特征向量$x$。 + +在得到特征值与特征向量后,该如何使用它们?我们可以利用特征向量来对角化给定矩阵。 + +有矩阵$A$,它的特征向量为$x_1, x_2, \cdots, x_n$,使用特征向量作为列向量组成一个矩阵$S=\Bigg[x_1x_2\cdots x_n\Bigg]$,即特征向量矩阵, 再使用公式$$S^{-1}AS=\Lambda\tag{1}$$将$A$对角化。注意到公式中有$S^{-1}$,也就是说特征向量矩阵$S$必须是可逆的,于是我们需要$n$个线性无关的特征向量。 + +现在,假设$A$有$n$个线性无关的特征向量,将它们按列组成特征向量矩阵$S$,则$AS=A\Bigg[x_1x_2\cdots x_n\Bigg]$,当我们分开做矩阵与每一列相乘的运算时,易看出$Ax_1$就是矩阵与自己的特征向量相乘,其结果应该等于$\lambda_1x_1$。那么$AS=\Bigg[(\lambda_1x_1)(\lambda_2x_2)\cdots(\lambda_nx_n)\Bigg]$。可以进一步化简原式,使用右乘向量按列操作矩阵的方法,将特征值从矩阵中提出来,得到$\Bigg[x_1x_2\cdots x_n\Bigg]\begin{bmatrix}\lambda_1&0&\cdots&0\\0&\lambda_2&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&\lambda_n\end{bmatrix}=S\Lambda$。 + +于是我们看到,从$AS$出发,得到了$S\Lambda$,特征向量矩阵又一次出现了,后面接着的是一个对角矩阵,即特征值矩阵。这样,再继续左乘$S^{-1}$就得到了公式$(1)$。当然,所以运算的前提条件是特征向量矩阵$S$可逆,即矩阵$A$有$n$个线性无关的特征向量。这个式子还要另一种写法,$A=S\Lambda S^{-1}$。 + +我们来看如何应用这个公式,比如说要计算$A^2$。 + +* 先从$Ax=\lambda x$开始,如果两边同乘以$A$,有$A^2x=\lambda Ax=\lambda^2x$,于是得出结论,对于矩阵$A^2$,其特征值也会取平方,而特征向量不变。 +* 再从$A=S\Lambda S^{-1}$开始推导,则有$A^2=S\Lambda S^{-1}S\Lambda S^{-1}=S\Lambda^2S^{-1}$。同样得到特征值取平方,特征向量不变。 + +两种方法描述的是同一个现象,即对于矩阵幂运算$A^2$,其特征向量不变,而特征值做同样的幂运算。对角矩阵$\Lambda^2=\begin{bmatrix}\lambda_1^2&0&\cdots&0\\0&\lambda_2^2&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&\lambda_n^2\end{bmatrix}$。 + +特征值和特征向量给我们了一个深入理解矩阵幂运算的方法,$A^k=S\Lambda^kS^{-1}$。 + +再来看一个矩阵幂运算的应用:如果$k\to\infty$,则$A^k\to 0$(趋于稳定)的条件是什么?从$S\Lambda^kS^{-1}$易得,$|\lambda_i|<1$。再次强调,所有运算的前提是矩阵$A$存在$n$个线性无关的特征向量。如果没有$n$个线性无关的特征向量,则矩阵就不能对角化。 + +关于矩阵可对角化的条件: + +* 如果一个矩阵有$n$个互不相同的特征值(即没有重复的特征值),则该矩阵具有$n$个线性无关的特征向量,因此该矩阵可对角化。 +* 如果一个矩阵的特征值存在重复值,则该矩阵可能具有$n$个线性无关的特征向量。比如取$10$阶单位矩阵,$I_{10}$具有$10$个相同的特征值$1$,但是单位矩阵的特征向量并不短缺,每个向量都可以作为单位矩阵的特征向量,我们很容易得到$10$个线性无关的特征向量。当然这里例子中的$I_{10}$的本来就是对角矩阵,它的特征值直接写在矩阵中,即对角线元素。 + + 同样的,如果是三角矩阵,特征值也写在对角线上,但是这种情况我们可能会遇到麻烦。矩阵$A=\begin{bmatrix}2&1\\0&2\end{bmatrix}$,计算行列式值$\det(A-\lambda I)=\begin{vmatrix}2-\lambda&1\\0&2-\lambda\end{vmatrix}=(2-\lambda)^2=0$,所以特征值为$\lambda_1=\lambda_2=2$,带回$Ax=\lambda x$得到计算$\begin{bmatrix}0&1\\0&0\end{bmatrix}$的零空间,我们发现$x_1=x_2=\begin{bmatrix}1\\0\end{bmatrix}$,代数重度(algebraic multiplicity,计算特征值重复次数时,就用代数重度,就是它作为多项式根的次数,这里的多项式就是$(2-\lambda)^2$)为$2$,这个矩阵无法对角化。这就是上一讲的退化矩阵。 + +我们不打算深入研究有重复特征值的情形。 + +## 求$u_{k+1}=Au_k$ + +从$u_1=Au_0$开始,$u_2=A^2u_0$,所有$u_k=A^ku_0$。下一讲涉及微分方程(differential equation),会有求导的内容,本讲先引入简单的差分方程(difference equation)。本例是一个一阶差分方程组(first order system)。 + +要解此方程,需要将$u_0$展开为矩阵$A$特征向量的线性组合,即$u_0=c_1x_1+c_2x_2+\cdots+c_nx_n=\Bigg[x_1x_2\cdots x_n\Bigg]\begin{bmatrix}c_1\\c_2\\\vdots\\c_n\end{bmatrix}=Sc$。于是$Au_0=c_1Ax_1+c_2Ax_2+\cdots+c_nAx_n=c_1\lambda_1x_1+c_2\lambda_2x_2+\cdots+c_n\lambda_nx_n$。继续化简原式,$Au_0=\Bigg[x_1x_2\cdots x_n\Bigg]\begin{bmatrix}\lambda_1&0&\cdots&0\\0&\lambda_2&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&\lambda_n\end{bmatrix}\begin{bmatrix}c_1\\c_2\\\vdots\\c_n\end{bmatrix}=S\Lambda c$。用矩阵的方式同样可以得到该式:$Au_0=S\Lambda S^{-1}u_0=S\Lambda S^{-1}Sc=S\Lambda c$。 + +那么如果我们要求$A^{100}u_0$,则只需要将$\lambda$变为$\lambda^{100}$,而系数$c$与特征向量$x$均不变。 + +当我们真的要计算$A^{100}u_0$时,就可以使用$S\Lambda^{100}c=c_1\lambda_1^{100}x_1+c_2\lambda_2^{100}x_2+\cdots+c_n\lambda_n^{100}x_n$。 + +接下来看一个斐波那契数列(Fibonacci sequence)的例子: + +$0,1,1,2,3,5,8,13,\cdots,F_{100}=?$,我们要求第一百项的公式,并观察这个数列是如何增长的。可以想象这个数列并不是稳定数列,因此无论如何该矩阵的特征值并不都小于一,这样才能保持增长。而他的增长速度,则有特征值来决定。 + +已知$F_{k+2}=F_{k_1}+F_{k}$,但这不是$u_{k+1}=Au_{k}$的形式,而且我们只要一个方程,而不是方程组,同时这是一个二阶差分方程(就像含有二阶导数的微分方程,希望能够化简为一阶倒数,也就是一阶差分)。 + +使用一个**小技巧**,令$u_{k}=\begin{bmatrix}F_{k+1}\\F_{k}\end{bmatrix}$,再追加一个方程组成方程组:$\begin{cases}F_{k+2}&=F_{k+1}+F_{k}\\F_{k+1}&=F_{k+1}\end{cases}$,再把方程组用矩阵表达得到$\begin{bmatrix}F_{k+2}\\F_{k+1}\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}\begin{bmatrix}F_{k+1}\\F_{k}\end{bmatrix}$,于是我们得到了$u_{k+1}=Au_{k}, A=\begin{bmatrix}1&1\\1&0\end{bmatrix}$。我们把二阶标量方程(second-order scalar problem)转化为一阶向量方程组(first-order system)。 + +我们的矩阵$A=\begin{bmatrix}1&1\\1&0\end{bmatrix}$是一个对称矩阵,所以它的特征值将会是实数,且他的特征向量将会互相正交。因为是二阶,我们可以直接利用迹与行列式解方程组$\begin{cases}\lambda_1+\lambda_2&=1\\\lambda_1\cdot\lambda_2&=-1\end{cases}$。在求解之前,我们先写出一般解法并观察$\left|A-\lambda I\right|=\begin{vmatrix}1-\lambda&1\\1&-\lambda\end{vmatrix}=\lambda^2-\lambda-1=0$,与前面斐波那契数列的递归式$F_{k+2}=F_{k+1}+F_{k}\rightarrow F_{k+2}-F_{k+1}-F_{k}=0$比较,我们发现这两个式子在项数与幂次上非常相近。 + +* 用求根公式解特征值得$\begin{cases}\lambda_1=\frac{1}{2}\left(1+\sqrt{5}\right)\approx{1.618}\\\lambda_2=\frac{1}{2}\left(1-\sqrt{5}\right)\approx{-0.618}\end{cases}$,得到两个不同的特征值,一定会有两个线性无关的特征向量,则该矩阵可以被对角化。 + +我们先来观察这个数列是如何增长的,数列增长由什么来控制?——特征值。哪一个特征值起决定性作用?——较大的一个。 + +$F_{100}=c_1\left(\frac{1+\sqrt{5}}{2}\right)^{100}+c_2\left(\frac{1-\sqrt{5}}{2}\right)^{100}\approx c_1\left(\frac{1+\sqrt{5}}{2}\right)^{100}$,由于$-0.618$在幂增长中趋近于$0$,所以近似的忽略该项,剩下较大的项,我们可以说数量增长的速度大约是$1.618$。可以看出,这种问题与求解$Ax=b$不同,这是一个动态的问题,$A$的幂在不停的增长,而问题的关键就是这些特征值。 + +* 继续求解特征向量,$A-\lambda I=\begin{bmatrix}1-\lambda&1\\1&1-\lambda\end{bmatrix}$,因为有根式且矩阵只有二阶,我们直接观察$\begin{bmatrix}1-\lambda&1\\1&1-\lambda\end{bmatrix}\begin{bmatrix}?\\?\end{bmatrix}=0$,由于$\lambda^2-\lambda-1=0$,则其特征向量为$\begin{bmatrix}\lambda\\1\end{bmatrix}$,即$x_1=\begin{bmatrix}\lambda_1\\1\end{bmatrix}, x_2=\begin{bmatrix}\lambda_2\\1\end{bmatrix}$。 + +最后,计算初始项$u_0=\begin{bmatrix}F_1\\F_0\end{bmatrix}=\begin{bmatrix}1\\0\end{bmatrix}$,现在将初始项用特征向量表示出来$\begin{bmatrix}1\\0\end{bmatrix}=c_1x_1+c_2x_2$,计算系数得$c_1=\frac{\sqrt{5}}{5}, c_2=-\frac{\sqrt{5}}{5}$。 + +来回顾整个问题,对于动态增长的一阶方程组,初始向量是$u_0$,关键在于确定$A$的特征值及特征向量。特征值将决定增长的趋势,发散至无穷还是收敛于某个值。接下来需要找到一个展开式,把$u_0$展开成特征向量的线性组合。 + +* 再下来就是套用公式,即$A$的$k$次方表达式$A^k=S\Lambda^kS^{-1}$,则有$u_{99}=Au_{98}=\cdots=A^{99}u_{0}=S\Lambda^{99}S^{-1}Sc=S\Lambda^{99}c$,代入特征值、特征向量得$u_{99}=\begin{bmatrix}F_{100}\\F_{99}\end{bmatrix}=\begin{bmatrix}\frac{1+\sqrt{5}}{2}&\frac{1-\sqrt{5}}{2}\\1&1\end{bmatrix}\begin{bmatrix}\left(\frac{1+\sqrt{5}}{2}\right)^{99}&0\\0&\left(\frac{1-\sqrt{5}}{2}\right)^{99}\end{bmatrix}\begin{bmatrix}\frac{\sqrt{5}}{5}\\-\frac{\sqrt{5}}{5}\end{bmatrix}=\begin{bmatrix}c_1\lambda_1^{100}+c_2\lambda_2^{100}\\c_1\lambda_1^{99}+c_2\lambda_2^{99}\end{bmatrix}$,最终结果为$F_{100}=c_1\lambda_1^{100}+c_2\lambda_2^{100}$。 + +* 原式的通解为$u_k=c_1\lambda^kx_1+c_2\lambda^kx_2$。 + +下一讲将介绍求解微分方程。 diff --git a/docs/linalg/chapter23.md b/docs/linalg/chapter23.md new file mode 100644 index 00000000..277a84a3 --- /dev/null +++ b/docs/linalg/chapter23.md @@ -0,0 +1,63 @@ + +# 第二十三讲:微分方程和$e^{At}$ + +## 微分方程$\frac{\mathrm{d}u}{\mathrm{d}t}=Au$ + +本讲主要讲解解一阶方程(first-order system)一阶倒数(first derivative)常系数(constant coefficient)线性方程,上一讲介绍了如何计算矩阵的幂,本讲将进一步涉及矩阵的指数形式。我们通过解一个例子来详细介绍计算方法。 + +有方程组$\begin{cases}\frac{\mathrm{d}u_1}{\mathrm{d}t}&=-u_1+2u_2\\\frac{\mathrm{d}u_2}{\mathrm{d}t}&=u_1-2u_2\end{cases}$,则系数矩阵是$A=\begin{bmatrix}-1&2\\1&-2\end{bmatrix}$,设初始条件为在$0$时刻$u(0)=\begin{bmatrix}u_1\\u_2\end{bmatrix}=\begin{bmatrix}1\\0\end{bmatrix}$。 + +* 这个初始条件的意义可以看做在开始时一切都在$u_1$中,但随着时间的推移,将有$\frac{\mathrm{d}u_2}{\mathrm{d}t}>0$,因为$u_1$项初始为正,$u_1$中的事物会流向$u_2$。随着时间的发展我们可以追踪流动的变化。 + +* 根据上一讲所学的知识,我们知道第一步需要找到特征值与特征向量。$A=\begin{bmatrix}-1&2\\1&-2\end{bmatrix}$,很明显这是一个奇异矩阵,所以第一个特征值是$\lambda_1=0$,另一个特征向量可以从迹得到$tr(A)=-3$。当然我们也可以用一般方法计算$\left|A-\lambda I\right|=\begin{vmatrix}-1-\lambda&2\\1&-2-\lambda\end{vmatrix}=\lambda^2+3\lambda=0$。 + + (教授提前剧透,特征值$\lambda_2=-3$将会逐渐消失,因为答案中将会有一项为$e^{-3t}$,该项会随着时间的推移趋近于$0$。答案的另一部分将有一项为$e^{0t}$,该项是一个常数,其值为$1$,并不随时间而改变。通常含有$0$特征值的矩阵会随着时间的推移达到稳态。) + +* 求特征向量,$\lambda_1=0$时,即求$A$的零空间,很明显$x_1=\begin{bmatrix}2\\1\end{bmatrix}$;$\lambda_2=-3$时,求$A+3I$的零空间,$\begin{bmatrix}2&2\\1&1\end{bmatrix}$的零空间为$x_2=\begin{bmatrix}1\\-1\end{bmatrix}$。 + +* 则方程组的通解为:$u(t)=c_1e^{\lambda_1t}x_1+c_2e^{\lambda_2t}x_2$,通解的前后两部分都是该方程组的纯解,即方程组的通解就是两个与特征值、特征向量相关的纯解的线性组合。我们来验证一下,比如取$u=e^{\lambda_1t}x_1$带入$\frac{\mathrm{d}u}{\mathrm{d}t}=Au$,对时间求导得到$\lambda_1e^{\lambda_1t}x_1=Ae^{\lambda_1t}x_1$,化简得$\lambda_1x_1=Ax_1$。 + + 对比上一讲,解$u_{k+1}=Au_k$时得到$u_k=c_1\lambda^kx_1+c_2\lambda^kx_2$,而解$\frac{\mathrm{d}u}{\mathrm{d}t}=Au$我们得到$u(t)=c_1e^{\lambda_1t}x_1+c_2e^{\lambda_2t}x_2$。 + +* 继续求$c_1,c_2$,$u(t)=c_1\cdot 1\cdot\begin{bmatrix}2\\1\end{bmatrix}+c_2\cdot e^{-3t}\cdot\begin{bmatrix}1\\-1\end{bmatrix}$,已知$t=0$时,$\begin{bmatrix}1\\0\end{bmatrix}=c_1\begin{bmatrix}2\\1\end{bmatrix}+c_2\begin{bmatrix}1\\-1\end{bmatrix}$($Sc=u(0)$),所以$c_1=\frac{1}{3}, c_2=\frac{1}{3}$。 + +* 于是我们写出最终结果,$u(t)=\frac{1}{3}\begin{bmatrix}2\\1\end{bmatrix}+\frac{1}{3}e^{-3t}\begin{bmatrix}1\\-1\end{bmatrix}$。 + +稳定性:这个流动过程从$u(0)=\begin{bmatrix}1\\0\end{bmatrix}$开始,初始值$1$的一部分流入初始值$0$中,经过无限的时间最终达到稳态$u(\infty)=\begin{bmatrix}\frac{2}{3}\\\frac{1}{3}\end{bmatrix}$。所以,要使得$u(t)\to 0$,则需要负的特征值。但如果特征值为复数呢?如$\lambda=-3+6i$,我们来计算$\left|e^{(-3+6i)t}\right|$,其中的$\left|e^{6it}\right|$部分为$\left|\cos 6t+i\sin 6t\right|=1$,因为这部分的模为$\cos^2\alpha+\sin^2\alpha=1$,这个虚部就在单位圆上转悠。所以只有实数部分才是重要的。所以我们可以把前面的结论改为**需要实部为负数的特征值**。实部会决定最终结果趋近于$0$或$\infty$,虚部不过是一些小杂音。 + +收敛态:需要其中一个特征值实部为$0$,而其他特征值的实部皆小于$0$。 + +发散态:如果某个特征值实部大于$0$。上面的例子中,如果将$A$变为$-A$,特征值也会变号,结果发散。 + +再进一步,我们想知道如何从直接判断任意二阶矩阵的特征值是否均小于零。对于二阶矩阵$A=\begin{bmatrix}a&b\\c&d\end{bmatrix}$,矩阵的迹为$a+d=\lambda_1+\lambda_2$,如果矩阵稳定,则迹应为负数。但是这个条件还不够,有反例迹小于$0$依然发散:$\begin{bmatrix}-2&0\\0&1\end{bmatrix}$,迹为$-1$但是仍然发散。还需要加上一个条件,因为$\det A=\lambda_1\cdot\lambda_2$,所以还需要行列式为正数。 + +总结:原方程组有两个相互耦合的未知函数,$u_1, u_2$相互耦合,而特征值和特征向量的作则就是解耦,也就是对角化(diagonalize)。回到原方程组$\frac{\mathrm{d}u}{\mathrm{d}t}=Au$,将$u$表示为特征向量的线性组合$u=Sv$,代入原方程有$S\frac{\mathrm{d}v}{\mathrm{d}t}=ASv$,两边同乘以$S^{-1}$得$\frac{\mathrm{d}v}{\mathrm{d}t}=S^{-1}ASv=\Lambda v$。以特征向量为基,将$u$表示为$Sv$,得到关于$v$的对角化方程组,新方程组不存在耦合,此时$\begin{cases}\frac{\mathrm{d}v_1}{\mathrm{d}t}&=\lambda_1v_1\\\frac{\mathrm{d}v_2}{\mathrm{d}t}&=\lambda_2v_2\\\vdots&\vdots\\\frac{\mathrm{d}v_n}{\mathrm{d}t}&=\lambda_nv_n\end{cases}$,这是一个各未知函数间没有联系的方程组,它们的解的一般形式为$v(t)=e^{\Lambda t}v(0)$,则原方程组的解的一般形式为$u(t)=e^{At}u(0)=Se^{\Lambda t}S^{-1}u(0)$。这里引入了指数部分为矩阵的形式。 + +## 指数矩阵$e^{At}$ + +在上面的结论中,我们见到了$e^{At}$。这种指数部分带有矩阵的情况称为指数矩阵(exponential matrix)。 + +理解指数矩阵的关键在于,将指数形式展开称为幂基数形式,就像$e^x=1+\frac{x^2}{2}+\frac{x^3}{6}+\cdots$一样,将$e^{At}$展开成幂级数的形式为: + +$$e^{At}=I+At+\frac{(At)^2}{2}+\frac{(At)^3}{6}+\cdots+\frac{(At)^n}{n!}+\cdots$$ + +再说些题外话,有两个极具美感的泰勒级数:$e^x=\sum \frac{x^n}{n!}$与$\frac{1}{1-x}=\sum x^n$,如果把第二个泰勒级数写成指数矩阵形式,有$(I-At)^{-1}=I+At+(At)^2+(At)^3+\cdots$,这个式子在$t$非常小的时候,后面的高次项近似等于零,所以可以用来近似$I-At$的逆矩阵,通常近似为$I+At$,当然也可以再加几项。第一个级数对我们而言比第二个级数好,因为第一个级数总会收敛于某个值,所以$e^x$总会有意义,而第二个级数需要$A$特征值的绝对值小于$1$(因为涉及矩阵的幂运算)。我们看到这些泰勒级数的公式对矩阵同样适用。 + +回到正题,我们需要证明$Se^{\Lambda t}S^{-1}=e^{At}$,继续使用泰勒级数: + +$$ +e^{At}=I+At+\frac{(At)^2}{2}+\frac{(At)^3}{6}+\cdots+\frac{(At)^n}{n!}+\cdots\\ +e^{At}=SS^{-1}+S\Lambda S^{-1}t+\frac{S\Lambda^2S^{-1}}{2}t^2+\frac{S\Lambda^3S^{-1}}{6}t^3+\cdots+\frac{S\Lambda^nS^{-1}}{n!}t^n+\cdots\\ +e^{At}=S\left(I+\Lambda t+\frac{\Lambda^2t^2}{2}+\frac{\Lambda^3t^3}{3}+\cdots+\frac{\Lambda^nt^n}{n}+\cdots\right)S^{-1}\\ +e^{At}=Se^{\Lambda t}S^{-1} +$$ + +需要注意的是,$e^{At}$的泰勒级数展开是恒成立的,但我们推出的版本却需要**矩阵可对角化**这个前提条件。 + +最后,我们来看看什么是$e^{\Lambda t}$,我们将$e^{At}$变为对角矩阵就是因为对角矩阵简单、没有耦合,$e^{\Lambda t}=\begin{bmatrix}e^{\lambda_1t}&0&\cdots&0\\0&e^{\lambda_2t}&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&e^{\lambda_nt}\end{bmatrix}$。 + +有了$u(t)=Se^{\Lambda t}S^{-1}u(0)$,再来看矩阵的稳定性可知,所有特征值的实部均为负数时矩阵收敛,此时对角线上的指数收敛为$0$。如果我们画出复平面,则要使微分方程存在稳定解,则特征值存在于复平面的左侧(即实部为负);要使矩阵的幂收敛于$0$,则特征值存在于单位圆内部(即模小于$1$),这是幂稳定区域。(上一讲的差分方程需要计算矩阵的幂。) + +同差分方程一样,我们来看二阶情况如何计算,有$y''+by'+k=0$。我们也模仿差分方程的情形,构造方程组$\begin{cases}y''&=-by'-ky\\y'&=y'\end{cases}$,写成矩阵形式有$\begin{bmatrix}y''\\y'\end{bmatrix}=\begin{bmatrix}-b&-k\\1&0\end{bmatrix}\begin{bmatrix}y'\\y\end{bmatrix}$,令$u'=\begin{bmatrix}y''\\y'\end{bmatrix}, \ u=\begin{bmatrix}y'\\y\end{bmatrix}$。 + +继续推广,对于$5$阶微分方程$y'''''+by''''+cy'''+dy''+ey'+f=0$,则可以写作$\begin{bmatrix}y'''''\\y''''\\y'''\\y''\\y'\end{bmatrix}=\begin{bmatrix}-b&-c&-d&-e&-f\\1&0&0&0&0\\0&1&0&0&0\\0&0&1&0&0\\0&0&0&1&0\end{bmatrix}\begin{bmatrix}y''''\\y'''\\y''\\y'\\y\end{bmatrix}$,这样我们就把一个五阶微分方程化为$5\times 5$一阶方程组了,然后就是求特征值、特征向量了步骤了。 diff --git a/docs/linalg/chapter24.md b/docs/linalg/chapter24.md new file mode 100644 index 00000000..d8962650 --- /dev/null +++ b/docs/linalg/chapter24.md @@ -0,0 +1,68 @@ + +# 第二十四讲:马尔科夫矩阵、傅里叶级数 + +## 马尔科夫矩阵 + +马尔科夫矩阵(Markov matrix)是指具有以下两个特性的矩阵: + +1. 矩阵中的所有元素**大于等于**$0$;(因为马尔科夫矩阵与概率有关,而概率是非负的。) +2. 每一列的元素之和为$1$ + +对于马尔科夫矩阵,我们关心幂运算过程中的稳态(steady state)。与上一讲不同,指数矩阵关系特征值是否为$0$,而幂运算要达到稳态需要特征值为$1$。 + +根据上面两条性质,我们可以得出两个推论: + +1. 马尔科夫矩阵必有特征值为$1$; +2. 其他的特征值的绝对值皆小于$1$。 + +使用第二十二讲中得到的公式进行幂运算$u_k=A^ku_0=S\Lambda^kS^{-1}u_0=S\Lambda^kS^{-1}Sc=S\Lambda^kc=c_1\lambda_1^kx_1+c_2\lambda_2^kx_2+\cdots+c_n\lambda_n^kx_n$,从这个公式很容易看出幂运算的稳态。比如我们取$\lambda_1=1$,其他的特征值绝对值均小于$1$,于是在经过$k$次迭代,随着时间的推移,其他项都趋近于$0$,于是在$k\to\infty$时,有稳态$u_k=c_1x_1$,这也就是初始条件$u_0$的第$1$个分量。 + +我们来证明第一个推论,取$A=\begin{bmatrix}0.1&0.01&0.3\\0.2&0.99&0.3\\0.7&0&0.4\end{bmatrix}$,则$A-I=\begin{bmatrix}-0.9&0.01&0.3\\0.2&-0.01&0.3\\0.7&0&-0.6\end{bmatrix}$。观察$A-I$易知其列向量中元素之和均为$0$,因为马尔科夫矩阵的性质就是各列向量元素之和为$1$,现在我们从每一列中减去了$1$,所以这是很自然的结果。而如果列向量中元素和为$0$,则矩阵的任意行都可以用“零减去其他行之和”表示出来,即该矩阵的行向量线性相关。 + +用以前学过的子空间的知识描述,当$n$阶方阵各列向量元素之和皆为$1$时,则有$\begin{bmatrix}1\\1\\\vdots\\1\end{bmatrix}$在矩阵$A-I$左零空间中,即$(A-I)^T$行向量线性相关。而$A$特征值$1$所对应的特征向量将在$A-I$的零空间中,因为$Ax=x\rightarrow(A-I)x=0$。 + +另外,特征值具有这样一个性质:矩阵与其转置的特征值相同。因为我们在行列式一讲了解了性质10,矩阵与其转置的行列式相同,那么如果$\det(A-\lambda I)=0$,则有$\det(A-\lambda I)^T=0$,根据矩阵转置的性质有$\det(A^T-\lambda I^T)=0$,即$\det(A^T-\lambda I)=0$。这正是$A^T$特征值的计算式。 + +然后计算特征值$\lambda_1=1$所对应的特征向量,$(A-I)x_1=0$,得出$x_1=\begin{bmatrix}0.6\\33\\0.7\end{bmatrix}$,特征向量中的元素皆为正。 + +接下来介绍马尔科夫矩阵的应用,我们用麻省和加州这两个州的人口迁移为例: + +$\begin{bmatrix}u_{cal}\\u_{mass}\end{bmatrix}_{k+1}\begin{bmatrix}0.9&0.2\\0.1&0.8\end{bmatrix}\begin{bmatrix}u_{cal}\\u_{mass}\end{bmatrix}_k$,元素非负,列和为一。这个式子表示每年有$10%$的人口从加州迁往麻省,同时有$20%$的人口从麻省迁往加州。注意使用马尔科夫矩阵的前提条件是随着时间的推移,矩阵始终不变。 + +设初始情况$\begin{bmatrix}u_{cal}\\u_{mass}\end{bmatrix}_0=\begin{bmatrix}0\\1000\end{bmatrix}$,我们先来看第一次迁徙后人口的变化情况:$\begin{bmatrix}u_{cal}\\u_{mass}\end{bmatrix}_1=\begin{bmatrix}0.9&0.2\\0.1&0.8\end{bmatrix}\begin{bmatrix}0\\1000\end{bmatrix}=\begin{bmatrix}200\\800\end{bmatrix}$,随着时间的推移,会有越来越多的麻省人迁往加州,而同时又会有部分加州人迁往麻省。 + +计算特征值:我们知道马尔科夫矩阵的一个特征值为$\lambda_1=1$,则另一个特征值可以直接从迹算出$\lambda_2=0.7$。 + +计算特征向量:带入$\lambda_1=1$求$A-I$的零空间有$\begin{bmatrix}-0.1&0.2\\0.1&-0.2\end{bmatrix}$,则$x_1=\begin{bmatrix}2\\1\end{bmatrix}$,此时我们已经可以得出无穷步后稳态下的结果了。$u_{\infty}=c_1\begin{bmatrix}2\\1\end{bmatrix}$且人口总数始终为$1000$,则$c_1=\frac{1000}{3}$,稳态时$\begin{bmatrix}u_{cal}\\u_{mass}\end{bmatrix}_{\infty}=\begin{bmatrix}\frac{2000}{3}\\\frac{1000}{3}\end{bmatrix}$。注意到特征值为$1$的特征向量元素皆为正。 + +为了求每一步的结果,我们必须解出所有特征向量。带入$\lambda_2=0.7$求$A-0.7I$的零空间有$\begin{bmatrix}0.2&0.2\\0.1&0.1\end{bmatrix}$,则$x_2=\begin{bmatrix}-1\\1\end{bmatrix}$。 + +通过$u_0$解出$c_1, c_2$,$u_k=c_11^k\begin{bmatrix}2\\1\end{bmatrix}+c_20.7^k\begin{bmatrix}-1\\1\end{bmatrix}$,带入$k=0$得$u_0=\begin{bmatrix}0\\1000\end{bmatrix}=c_1\begin{bmatrix}2\\1\end{bmatrix}+c_2\begin{bmatrix}-1\\1\end{bmatrix}$,解出$c_1=\frac{1000}{3}, c_2=\frac{2000}{3}$。 + +另外,有时人们更喜欢用行向量,此时将要使用行向量乘以矩阵,其行向量各分量之和为$1$。 + +## 傅里叶级数 + +在介绍傅里叶级数(Fourier series)之前,先来回顾一下投影。 + +设$q_1,q_2,\cdots q_n$为一组标准正交基,则向量$v$在该标准正交基上的展开为$v=x_1q_1+x_2q_2+\cdots+x_nq_n$,此时我们想要得到各系数$x_i$的值。比如求$x_1$的值,我们自然想要消掉除$x_1q_1$外的其他项,这时只需要等式两边同乘以$q_1^T$,因为的$q_i$向量相互正交且长度为$1$,则$q_i^Tq_j=0, q_i^2=1$所以原式变为$q_1^Tv=x_1$。 + +写为矩阵形式有$\Bigg[q_1\ q_2\ \cdots\ q_n\Bigg]\begin{bmatrix}x_1\\x_2\\\vdots\\x_n\end{bmatrix}=v$,即$Qx=v$。所以有$x=Q^{-1}v$,而在第十七讲我们了解到标准正交基有$Q^T=Q^{-1}$,所以我们不需要计算逆矩阵可直接得出$x=Q^Tv$。此时对于$x$的每一个分量有$x_i=q_i^Tv$。 + +接下来介绍傅里叶级数。先写出傅里叶级数的展开式: + +$$ +f(x)=a_0+a_1\cos x+b_1\sin x+a_2\cos 2x+b_2\sin 2x+\cdots +$$ + +傅里叶发现,如同将向量$v$展开(投影)到向量空间的一组标准正交基中,在函数空间中,我们也可以做类似的展开。将函数$f(x)$投影在一系列相互正交的函数中。函数空间中的$f(x)$就是向量空间中的$v$;函数空间中的$1,\cos x,\sin x,\cos 2x,\sin 2x,\cdots$就是向量空间中的$q_1,q_2,\cdots,q_n$;不同的是,函数空间是无限维的而我们以前接触到的向量空间通常是有限维的。 + +再来介绍何为“函数正交”。对于向量正交我们通常使用两向量内积(点乘)为零判断。我们知道对于向量$v,w$的内积为$v^Tw=v_1w_1+v_2w_2+\cdots+v_nw_n=0$,也就是向量的每个分量之积再求和。而对于函数$f(x)\cdot g(x)$内积,同样的,我们需要计算两个函数的每个值之积而后求和,由于函数取值是连续的,所以函数内积为: + +$$f^Tg=\int f(x)g(x)\mathrm{d}x$$ + +在本例中,由于傅里叶级数使用正余弦函数,它们的周期都可以算作$2\pi$,所以本例的函数点积可以写作$f^Tg=\int_0^{2\pi}f(x)g(x)\mathrm{d}x$。我来检验一个内积$\int_0^{2\pi}\sin{x}\cos{x}\mathrm{d}x=\left.\frac{1}{2}\sin^2x\right|_0^{2\pi}=0$,其余的三角函数族正交性结果可以参考[傅里叶级数](https://zh.wikipedia.org/wiki/%E5%82%85%E9%87%8C%E5%8F%B6%E7%BA%A7%E6%95%B0)的“希尔伯特空间的解读”一节。 + +最后我们来看$\cos x$项的系数是多少($a_0$是$f(x)$的平均值)。同向量空间中的情形一样,我们在等式两边同时做$\cos x$的内积,原式变为$\int_0^{2\pi}f(x)\cos x\mathrm{d}x=a_1\int_0^{2\pi}\cos^2x\mathrm{d}x$,因为正交性等式右边仅有$\cos x$项不为零。进一步化简得$a_1\pi=\int_0^{2\pi}f(x)\cos x\mathrm{d}x\rightarrow a_1=\frac{1}{\pi}\int_0^{2\pi}f(x)\cos x\mathrm{d}x$。 + +于是,我们把函数$f(x)$展开到了函数空间的一组标准正交基上。 diff --git a/docs/linalg/chapter25.md b/docs/linalg/chapter25.md new file mode 100644 index 00000000..530e8496 --- /dev/null +++ b/docs/linalg/chapter25.md @@ -0,0 +1,44 @@ + +# 第二十五讲:复习二 + +* 我们学习了正交性,有矩阵$Q=\Bigg[q_1\ q_2\ \cdots\ q_n\Bigg]$,若其列向量相互正交,则该矩阵满足$Q^TQ=I$。 +* 进一步研究投影,我们了解了Gram-Schmidt正交化法,核心思想是求法向量,即从原向量中减去投影向量$E=b-P, P=Ax=\frac{A^Tb}{A^TA}\cdot A$。 +* 接着学习了行列式,根据行列式的前三条性质,我们拓展出了性质4-10。 +* 我们继续推导出了一个利用代数余子式求行列式的公式。 +* 又利用代数余子式推导出了一个求逆矩阵的公式。 +* 接下来我们学习了特征值与特征向量的意义:$Ax=\lambda x$,进而了解了通过$\det(A-\lambda I)=0$求特征值、特征向量的方法。 +* 有了特征值与特征向量,我们掌握了通过公式$AS=\Lambda S$对角化矩阵,同时掌握了求矩阵的幂$A^k=S\Lambda^kS^{-1}$。 + +微分方程不在本讲的范围内。下面通过往年例题复习上面的知识。 + +1. *求$a=\begin{bmatrix}2\\1\\2\end{bmatrix}$的投影矩阵$P$*:$\Bigg($由$a\bot(b-p)\rightarrow A^T(b-A\hat x)=0$得到$\hat x=\left(A^TA\right)^{-1}A^Tb$,求得$p=A\hat x=A\left(A^TA\right)^{-1}A^Tb=Pb$最终得到$P\Bigg)$$\underline{P=A\left(A^TA\right)^{-1}A^T}\stackrel{a}=\frac{aa^T}{a^Ta}=\frac{1}{9}\begin{bmatrix}4&2&4\\2&1&2\\4&2&4\end{bmatrix}$。 + + *求$P$矩阵的特征值*:观察矩阵易知矩阵奇异,且为秩一矩阵,则其零空间为$2$维,所以由$Px=0x$得出矩阵的两个特征向量为$\lambda_1=\lambda_2=0$;而从矩阵的迹得知$trace(P)=1=\lambda_1+\lambda_2+\lambda_3=0+0+1$,则第三个特征向量为$\lambda_3=1$。 + + *求$\lambda_3=1$的特征向量*:由$Px=x$我们知道经其意义为,$x$过矩阵$P$变换后不变,又有$P$是向量$a$的投影矩阵,所以任何向量经过$P$变换都会落在$a$的列空间中,则只有已经在$a$的列空间中的向量经过$P$的变换后保持不变,即其特征向量为$x=a=\begin{bmatrix}2\\1\\2\end{bmatrix}$,也就是$Pa=a$。 + + *有差分方程$u_{k+1}=Pu_k,\ u_0=\begin{bmatrix}9\\9\\0\end{bmatrix}$,求解$u_k$*:我们先不急于解出特征值、特征向量,因为矩阵很特殊(投影矩阵)。首先观察$u_1=Pu_0$,式子相当于将$u_0$投影在了$a$的列空间中,计算得$u_1=a\frac{a^Tu_0}{a^Ta}=3a=\begin{bmatrix}6\\3\\6\end{bmatrix}$(这里的$3$相当于做投影时的系数$\hat x$),其意义为$u_1$在$a$上且距离$u_0$最近。再来看看$u_2=Pu_1$,这个式子将$u_1$再次投影到$a$的列空间中,但是此时的$u_1$已经在该列空间中了,再次投影仍不变,所以有$u_k=P^ku_0=Pu_0=\begin{bmatrix}6\\3\\6\end{bmatrix}$。 + + 上面的解法利用了投影矩阵的特殊性质,如果在一般情况下,我们需要使用$AS=S\Lambda\rightarrow A=S\Lambda S^{-1} \rightarrow u_{k+1}=Au_k=A^{k+1}u_0, u_0=Sc\rightarrow u_{k+1}=S\Lambda^{k+1}S^{-1}Sc=S\Lambda^{k+1}c$,最终得到公式$A^ku_0=c_1\lambda_1^kx_1+c_2\lambda_2^kx_2+\cdots+c_n\lambda_n^kx_n$。题中$P$的特殊性在于它的两个“零特征值”及一个“一特征值”使得式子变为$A^ku_0=c_3x_3$,所以得到了上面结构特殊的解。 + +2. *将点$(1,4),\ (2,5),\ (3,8)$拟合到一条过零点的直线上*:设直线为$y=Dt$,写成矩阵形式为$\begin{bmatrix}1\\2\\3\end{bmatrix}D=\begin{bmatrix}4\\5\\8\end{bmatrix}$,即$AD=b$,很明显$D$不存在。利用公式$A^TA\hat D=A^Tb$得到$14D=38,\ \hat D=\frac{38}{14}$,即最佳直线为$y=\frac{38}{14}t$。这个近似的意义是将$b$投影在了$A$的列空间中。 + +3. *求$a_1=\begin{bmatrix}1\\2\\3\end{bmatrix}\ a_2=\begin{bmatrix}1\\1\\1\end{bmatrix}$的正交向量*:找到平面$A=\Bigg[a_1,a_2\Bigg]$的正交基,使用Gram-Schmidt法,以$a_1$为基准,正交化$a_2$,也就是将$a_2$中平行于$a_1$的分量去除,即$a_2-xa_1=a_2-\frac{a_1^Ta_2}{a_1^Ta_1}a_1=\begin{bmatrix}1\\1\\1\end{bmatrix}-\frac{6}{14}\begin{bmatrix}1\\2\\3\end{bmatrix}$。 + +4. *有$4\times 4$矩阵$A$,其特征值为$\lambda_1,\lambda_2,\lambda_3,\lambda_4$,则矩阵可逆的条件是什么*:矩阵可逆,则零空间中只有零向量,即$Ax=0x$没有非零解,则零不是矩阵的特征值。 + + *$\det A^{-1}$是什么*:$\det A^{-1}=\frac{1}{\det A}$,而$\det A=\lambda_1\lambda_2\lambda_3\lambda_4$,所以有$\det A^{-1}=\frac{1}{\lambda_1\lambda_2\lambda_3\lambda_4}$。 + + *$trace(A+I)$的迹是什么*:我们知道$trace(A)=a_{11}+a_{22}+a_{33}+a_{44}=\lambda_1+\lambda_2+\lambda_3+\lambda_4$,所以有$trace(A+I)=a_{11}+1+a_{22}+1+a_{33}+1+a_{44}+1=\lambda_1+\lambda_2+\lambda_3+\lambda_4+4$。 + +5. *有矩阵$A_4=\begin{bmatrix}1&1&0&0\\1&1&1&0\\0&1&1&1\\0&0&1&1\end{bmatrix}$,求$D_n=?D_{n-1}+?D_{n-2}$*:求递归式的系数,使用代数余子式将矩阵安第一行展开得$\det A_4=1\cdot\begin{vmatrix}1&1&0\\1&1&1\\0&1&1\end{vmatrix}-1\cdot\begin{vmatrix}1&1&0\\0&1&1\\0&1&1\end{vmatrix}=1\cdot\begin{vmatrix}1&1&0\\1&1&1\\0&1&1\end{vmatrix}-1\cdot\begin{vmatrix}1&1\\1&1\end{vmatrix}=\det A_3-\det A_2$。则可以看出有规律$D_n=D_{n-1}-D_{n-2}, D_1=1, D_2=0$。 + + 使用我们在差分方程中的知识构建方程组$\begin{cases}D_n&=D_{n-1}-D_{n-2}\\D_{n-1}&=D_{n-1}\end{cases}$,用矩阵表达有$\begin{bmatrix}D_n\\D_{n-1}\end{bmatrix}=\begin{bmatrix}1&-1\\1&0\end{bmatrix}\begin{bmatrix}D_{n-1}\\D_{n-2}\end{bmatrix}$。计算系数矩阵$A_c$的特征值,$\begin{vmatrix}1-\lambda&1\\1&-\lambda\end{vmatrix}=\lambda^2-\lambda+1=0$,解得$\lambda_1=\frac{1+\sqrt{3}i}{2},\lambda_2=\frac{1-\sqrt{3}i}{2}$,特征值为一对共轭复数。 + + 要判断递归式是否收敛,需要计算特征值的模,即实部平方与虚部平方之和$\frac{1}{4}+\frac{3}{4}=1$。它们是位于单位圆$e^{i\theta}$上的点,即$\cos\theta+i\sin\theta$,从本例中可以计算出$\theta=60^\circ$,也就是可以将特征值写作$\lambda_1=e^{i\pi/3},\lambda_2=e^{-i\pi/3}$。注意,从复平面单位圆上可以看出,这些特征值的六次方将等于一:$e^{2\pi i}=e^{2\pi i}=1$。继续深入观察这一特性对矩阵的影响,$\lambda_1^6=\lambda^6=1$,则对系数矩阵有$A_c^6=I$。则系数矩阵$A_c$服从周期变化,既不发散也不收敛。 + +6. *有这样一类矩阵$A_4=\begin{bmatrix}0&1&0&0\\1&0&2&0\\0&2&0&3\\0&0&3&0\end{bmatrix}$,求投影到$A_3$列空间的投影矩阵*:有$A_3=\begin{bmatrix}0&1&0\\1&0&2\\0&2&0\end{bmatrix}$,按照通常的方法求$P=A\left(A^TA\right)A^T$即可,但是这样很麻烦。我们可以考察这个矩阵是否可逆,因为如果可逆的话,$\mathbb{R}^4$空间中的任何向量都会位于$A_4$的列空间,其投影不变,则投影矩阵为单位矩阵$I$。所以按行展开求行列式$\det A_4=-1\cdot-1\cdot-3\cdot-3=9$,所以矩阵可逆,则$P=I$。 + + *求$A_3$的特征值及特征向量*:$\left|A_3-\lambda I\right|=\begin{vmatrix}-\lambda&1&0\\1&-\lambda&2\\0&2&-\lambda\end{vmatrix}=-\lambda^3+5\lambda=0$,解得$\lambda_1=0,\lambda_2=\sqrt 5,\lambda_3=-\sqrt 5$。 + + 我们可以猜测这一类矩阵的规律:奇数阶奇异,偶数阶可逆。 diff --git a/docs/linalg/chapter26.md b/docs/linalg/chapter26.md new file mode 100644 index 00000000..2ec2e920 --- /dev/null +++ b/docs/linalg/chapter26.md @@ -0,0 +1,40 @@ + +# 第二十六讲:对称矩阵及正定性 + +## 对称矩阵 + +前面我们学习了矩阵的特征值与特征向量,也了解了一些特殊的矩阵及其特征值、特征向量,特殊矩阵的特殊性应该会反映在其特征值、特征向量中。如马尔科夫矩阵,有一特征值为$1$,本讲介绍(实)对称矩阵。 + +先提前介绍两个对称矩阵的特性: + +1. 特征值为实数;(对比第二十一讲介绍的旋转矩阵,其特征值为纯虚数。) +2. 特征向量相互正交。(当特征值重复时,特征向量也可以从子空间中选出相互正交正交的向量。) + +典型的状况是,特征值不重复,特征向量相互正交。 + +* 那么在通常(可对角化)情况下,一个矩阵可以化为:$A=S\varLambda S^{-1}$; +* 在矩阵对称的情况下,通过性质2可知,由特征向量组成的矩阵$S$中的列向量是相互正交的,此时如果我们把特征向量的长度统一化为$1$,就可以得到一组标准正交的特征向量。则对于对称矩阵有$A=Q\varLambda Q^{-1}$,而对于标准正交矩阵,有$Q=Q^T$,所以对称矩阵可以写为$$A=Q\varLambda Q^T\tag{1}$$ + +观察$(1)$式,我们发现这个分解本身就代表着对称,$\left(Q\varLambda Q^T\right)^T=\left(Q^T\right)^T\varLambda^TQ^T=Q\varLambda Q^T$。$(1)$式在数学上叫做谱定理(spectral theorem),谱就是指矩阵特征值的集合。(该名称来自光谱,指一些纯事物的集合,就像将特征值分解成为特征值与特征向量。)在力学上称之为主轴定理(principle axis theorem),从几何上看,它意味着如果给定某种材料,在合适的轴上来看,它就变成对角化的,方向就不会重复。 + +* 现在我们来证明性质1。对于矩阵$\underline{Ax=\lambda x}$,对于其共轭部分总有$\bar A\bar x=\bar\lambda \bar x$,根据前提条件我们只讨论实矩阵,则有$A\bar x=\bar\lambda \bar x$,将等式两边取转置有$\overline{\bar{x}^TA=\bar{x}^T\bar\lambda}$。将“下划线”式两边左乘$\bar{x}^T$有$\bar{x}^TAx=\bar{x}^T\lambda x$,“上划线”式两边右乘$x$有$\bar{x}^TAx=\bar{x}^T\bar\lambda x$,观察发现这两个式子左边是一样的,所以$\bar{x}^T\lambda x=\bar{x}^T\bar\lambda x$,则有$\lambda=\bar{\lambda}$(这里有个条件,$\bar{x}^Tx\neq 0$),证毕。 + + 观察这个前提条件,$\bar{x}^Tx=\begin{bmatrix}\bar x_1&\bar x_2&\cdots&\bar x_n\end{bmatrix}\begin{bmatrix}x_1\\x_2\\\vdots\\x_n\end{bmatrix}=\bar x_1x_1+\bar x_2x_2+\cdots+\bar x_nx_n$,设$x_1=a+ib, \bar x_1=a-ib$则$\bar x_1x_1=a^2+b^2$,所以有$\bar{x}^Tx>0$。而$\bar{x}^Tx$就是$x$长度的平方。 + + 拓展这个性质,当$A$为复矩阵,根据上面的推导,则矩阵必须满足$A=\bar{A}^T$时,才有性质1、性质2成立(教授称具有这种特征值为实数、特征向量相互正交的矩阵为“好矩阵”)。 + +继续研究$A=Q\varLambda Q^T=\Bigg[q_1\ q_2\ \cdots\ q_n\Bigg]\begin{bmatrix}\lambda_1& &\cdots& \\&\lambda_2&\cdots&\\\vdots&\vdots&\ddots&\vdots\\& &\cdots&\lambda_n\end{bmatrix}\begin{bmatrix}\quad q_1^T\quad\\\quad q_1^T\quad\\\quad \vdots \quad\\\quad q_1^T\quad\end{bmatrix}=\lambda_1q_1q_1^T+\lambda_2q_2q_2^T+\cdots+\lambda_nq_nq_n^T$,注意这个展开式中的$qq^T$,$q$是单位列向量所以$q^Tq=1$,结合我们在第十五讲所学的投影矩阵的知识有$\frac{qq^T}{q^Tq}=qq^T$是一个投影矩阵,很容易验证其性质,比如平方它会得到$qq^Tqq^T=qq^T$于是多次投影不变等。 + +**每一个对称矩阵都可以分解为一系列相互正交的投影矩阵。** + +在知道对称矩阵的特征值皆为实数后,我们再来讨论这些实数的符号,因为特征值的正负号会影响微分方程的收敛情况(第二十三讲,需要实部为负的特征值保证收敛)。用消元法取得矩阵的主元,观察主元的符号,**主元符号的正负数量与特征向量的正负数量相同**。 + +## 正定性 + +如果对称矩阵是“好矩阵”,则正定矩阵(positive definite)是其一个更好的子类。正定矩阵指特征值均为正数的矩阵(根据上面的性质有矩阵的主元均为正)。 + +举个例子,$\begin{bmatrix}5&2\\2&3\end{bmatrix}$,由行列式消元知其主元为$5,\frac{11}{5}$,按一般的方法求特征值有$\begin{vmatrix}5-\lambda&2\\2&3-lambda\end{vmatrix}=\lambda^2-8\lambda+11=0, \lambda=4\pm\sqrt 5$。 + +正定矩阵的另一个性质是,所有子行列式为正。对上面的例子有$\begin{vmatrix}5\end{vmatrix}=5, \begin{vmatrix}5&2\\2&3\end{vmatrix}=11$。 + +我们看到正定矩阵将早期学习的的消元主元、中期学习的的行列式、后期学习的特征值结合在了一起。 diff --git a/docs/linalg/chapter27.md b/docs/linalg/chapter27.md new file mode 100644 index 00000000..318be20a --- /dev/null +++ b/docs/linalg/chapter27.md @@ -0,0 +1,64 @@ + +# 第二十七讲:复数矩阵和快速傅里叶变换 + +本讲主要介绍复数向量、复数矩阵的相关知识(包括如何做复数向量的点积运算、什么是复数对称矩阵等),以及傅里叶矩阵(最重要的复数矩阵)和快速傅里叶变换。 + +## 复数矩阵运算 + +先介绍复数向量,我们不妨换一个字母符号来表示:$z=\begin{bmatrix}z_1\\z_2\\\vdots\\z_n\end{bmatrix}$,向量的每一个分量都是复数。此时$z$不再属于$\mathbb{R}^n$实向量空间,它现在处于$\mathbb{C}^n$复向量空间。 + +### 计算复向量的模 + +对比实向量,我们计算模只需要计算$\left|v\right|=\sqrt{v^Tv}$即可,而如果对复向量使用$z^Tz$则有$z^Tz=\begin{bmatrix}z_1&z_2&\cdots&z_n\end{bmatrix}\begin{bmatrix}z_1\\z_2\\\vdots\\z_n\end{bmatrix}=z_1^2+z_2^2+\cdots+z_n^2$,这里$z_i$是复数,平方后虚部为负,求模时本应相加的运算变成了减法。(如向量$\begin{bmatrix}1&i\end{bmatrix}$,右乘其转置后结果为$0$,但此向量的长度显然不是零。) + +根据上一讲我们知道,应使用$\left|z\right|=\sqrt{\bar{z}^Tz}$,即$\begin{bmatrix}\bar z_1&\bar z_2&\cdots&\bar z_n\end{bmatrix}\begin{bmatrix}z_1\\z_2\\\vdots\\z_n\end{bmatrix}$,即使用向量共轭的转置乘以原向量即可。(如向量$\begin{bmatrix}1&i\end{bmatrix}$,右乘其共轭转置后结果为$\begin{bmatrix}1&-i\end{bmatrix}\begin{bmatrix}1\\i\end{bmatrix}=2$。) + +我们把共轭转置乘以原向量记为$z^Hz$,$H$读作埃尔米特(人名为Hermite,形容词为Hermitian) + +### 计算向量的内积 + +有了复向量模的计算公式,同理可得,对于复向量,内积不再是实向量的$y^Tx$形式,复向量内积应为$y^Hx$。 + +### 对称性 + +对于实矩阵,$A^T=A$即可表达矩阵的对称性。而对于复矩阵,我们同样需要求一次共轭$\bar{A}^T=A$。举个例子$\begin{bmatrix}2&3+i\\3-i&5\end{bmatrix}$是一个复数情况下的对称矩阵。这叫做埃尔米特矩阵,有性质$A^H=A$。 + +### 正交性 + +在第十七讲中,我们这样定义标准正交向量:$q_i^Tq_j=\begin{cases}0\quad i\neq j\\1\quad i=j\end{cases}$。现在,对于复向量我们需要求共轭:$\bar{q}_i^Tq_j=q_i^Hq_j=\begin{cases}0\quad i\neq j\\1\quad i=j\end{cases}$。 + +第十七讲中的标准正交矩阵:$Q=\Bigg[q_1\ q_2\ \cdots\ q_n\Bigg]$有$Q^TQ=I$。现在对于复矩阵则有$Q^HQ=I$。 + +就像人们给共轭转置起了个“埃尔米特”这个名字一样,正交性(orthogonal)在复数情况下也有了新名字,酉(unitary),酉矩阵(unitary matrix)与正交矩阵类似,满足$Q^HQ=I$的性质。而前面提到的傅里叶矩阵就是一个酉矩阵。 + +## 傅里叶矩阵 + +$n$阶傅里叶矩阵$F_n=\begin{bmatrix}1&1&1&\cdots&1\\1&w&w^2&\cdots&w^{n-1}\\1&w^2&w^4&\cdots&w^{2(n-1)}\\\vdots&\vdots&\vdots&\ddots&\vdots\\1&w^{n-1}&w^{2(n-1)}&\cdots&w^{(n-1)^2}\end{bmatrix}$,对于每一个元素有$(F_n)_{ij}=w^{ij}\quad i,j=0,1,2,\cdots,n-1$。矩阵中的$w$是一个非常特殊的值,满足$w^n=1$,其公式为$w=e^{i2\pi/n}$。易知$w$在复平面的单位圆上,$w=\cos\frac{2\pi}{n}+i\sin\frac{2\pi}{n}$。 + +在傅里叶矩阵中,当我们计算$w$的幂时,$w$在单位圆上的角度翻倍。比如在$6$阶情形下,$w=e^{2\pi/6}$,即位于单位圆上$60^\circ$角处,其平方位于单位圆上$120^\circ$角处,而$w^6$位于$1$处。从开方的角度看,它们是$1$的$6$个六次方根,而一次的$w$称为原根。 + +* 我们现在来看$4$阶傅里叶矩阵,先计算$w$有$w=i,\ w^2=-1,\ w^3=-i,\ w^4=1$,$F_4=\begin{bmatrix}1&1&1&1\\1&i&i^2&i^3\\1&i^2&i^4&i^6\\1&i^3&i^6&i^9\end{bmatrix}=\begin{bmatrix}1&1&1&1\\1&i&-1&-i\\1&-1&1&-1\\1&-i&-1&i\end{bmatrix}$。 + + 矩阵的四个列向量正交,我们验证一下第二列和第四列,$\bar{c_2}^Tc_4=1-0+1-0=0$,正交。不过我们应该注意到,$F_4$的列向量并不是标准的,我们可以给矩阵乘上系数$\frac{1}{2}$(除以列向量的长度)得到标准正交矩阵$F_4=\frac{1}{2}\begin{bmatrix}1&1&1&1\\1&i&-1&-i\\1&-1&1&-1\\1&-i&-1&i\end{bmatrix}$。此时有$F_4^HF_4=I$,于是该矩阵的逆矩阵也就是其共轭转置$F_4^H$。 + +## 快速傅里叶变换(Fast Fourier transform/FFT) + +对于傅里叶矩阵,$F_6,\ F_3$、$F_8,\ F_4$、$F_{64},\ F_{32}$之间有着特殊的关系。 + +举例,有傅里叶矩阵$F_64$,一般情况下,用一个列向量右乘$F_{64}$需要约$64^2$次计算,显然这个计算量是比较大的。我们想要减少计算量,于是想要分解$F_{64}$,联系到$F_{32}$,有$\Bigg[F_{64}\Bigg]=\begin{bmatrix}I&D\\I&-D\end{bmatrix}\begin{bmatrix}F_{32}&0\\0&F_{32}\end{bmatrix}\begin{bmatrix}1&&\cdots&&&0&&\cdots&&\\0&&\cdots&&&1&&\cdots&&\\&1&\cdots&&&&0&\cdots&&\\&0&\cdots&&&&1&\cdots&&\\&&&\ddots&&&&&\ddots&&\\&&&\ddots&&&&&\ddots&&\\&&&\cdots&1&&&&\cdots&0\\&&&\cdots&0&&&&\cdots&1\end{bmatrix}$。 + +我们分开来看等式右侧的这三个矩阵: + +* 第一个矩阵由单位矩阵$I$和对角矩阵$D=\begin{bmatrix}1&&&&\\&w&&&\\&&w^2&&\\&&&\ddots&\\&&&&w^{31}\end{bmatrix}$组成,我们称这个矩阵为修正矩阵,显然其计算量来自$D$矩阵,对角矩阵的计算量约为$32$即这个修正矩阵的计算量约为$32$,单位矩阵的计算量忽略不计。 + +* 第二个矩阵是两个$F_{32}$与零矩阵组成的,计算量约为$2\times 32^2$。 + +* 第三个矩阵通常记为$P$矩阵,这是一个置换矩阵,其作用是讲前一个矩阵中的奇数列提到偶数列之前,将前一个矩阵从$\Bigg[x_0\ x_1\ \cdots\Bigg]$变为$\Bigg[x_0\ x_2\ \cdots\ x_1\ x_3\ \cdots\Bigg]$,这个置换矩阵的计算量也可以忽略不计。(这里教授似乎在黑板上写错了矩阵,可以参考[FFT](https://math.berkeley.edu/~berlek/classes/CLASS.110/LECTURES/FFT)、[How the FFT is computed](http://vmm.math.uci.edu/ODEandCM/PDF_Files/FFT_Appendix_K.pdf)做进一步讨论。) + +所以我们把$64^2$复杂度的计算化简为$2\times 32^2+32$复杂度的计算,我们可以进一步化简$F_{32}$得到与$F_{16}$有关的式子$\begin{bmatrix}I_{32}&D_{32}\\I_{32}&-D_{32}\end{bmatrix}\begin{bmatrix}I_{16}&D_{16}&&\\I_{16}&-D_{16}&&\\&&I_{16}&D_{16}\\&&I_{16}&-D_{16}\end{bmatrix}\begin{bmatrix}F_{16}&&&\\&F_{16}&&\\&&F_{16}&\\&&&F_{16}\end{bmatrix}\begin{bmatrix}P_{16}&\\&P_{16}\end{bmatrix}\Bigg[\ P_{32}\ \Bigg]$。而$32^2$的计算量进一步分解为$2\times 16^2+16$的计算量,如此递归下去我们最终得到含有一阶傅里叶矩阵的式子。 + +来看化简后计算量,$2\left(2\left(2\left(2\left(2\left(2\left(1\right)^2+1\right)+2\right)+4\right)+8\right)+16\right)+32$,约为$6\times 32=\log_264\times \frac{64}{2}$,算法复杂度为$\frac{n}{2}\log_2n$。 + +于是原来需要$n^2$的运算现在只需要$\frac{n}{2}\log_2n$就可以实现了。不妨看看$n=10$的情况,不使用FFT时需要$n^2=1024\times 1024$次运算,使用FFT时只需要$\frac{n}{2}\log_2n=5\times 1024$次运算,运算量大约是原来的$\frac{1}{200}$。 + +下一讲将继续介绍特征值、特征向量及正定矩阵。 diff --git a/docs/linalg/chapter28.md b/docs/linalg/chapter28.md new file mode 100644 index 00000000..3f4caadb --- /dev/null +++ b/docs/linalg/chapter28.md @@ -0,0 +1,49 @@ + +# 第二十八讲:正定矩阵和最小值 + +本讲我们会了解如何完整的测试一个矩阵是否正定,测试$x^TAx$是否具有最小值,最后了解正定的几何意义——椭圆(ellipse)和正定性有关,双曲线(hyperbola)与正定无关。另外,本讲涉及的矩阵均为实对称矩阵。 + +## 正定性的判断 + +我们仍然从二阶说起,有矩阵$A=\begin{bmatrix}a&b\\b&d\end{bmatrix}$,判断其正定性有以下方法: + +1. 矩阵的所有特征值大于零则矩阵正定:$\lambda_1>0,\ \lambda_2>0$; +2. 矩阵的所有顺序主子阵(leading principal submatrix)的行列式(即顺序主子式,leading principal minor)大于零则矩阵正定:$a>0,\ ac-b^2>0$; +3. 矩阵消元后主元均大于零:$a>0,\ \frac{ac-b^2}{a}>0$; +4. $x^TAx>0$; + +大多数情况下使用4来定义正定性,而用前三条来验证正定性。 + +来计算一个例子:$A=\begin{bmatrix}2&6\\6&?\end{bmatrix}$,在$?$处填入多少才能使矩阵正定? + +* 来试试$18$,此时矩阵为$A=\begin{bmatrix}2&6\\6&18\end{bmatrix}$,$\det A=0$,此时的矩阵成为半正定矩阵(positive semi-definite)。矩阵奇异,其中一个特征值必为$0$,从迹得知另一个特征值为$20$。矩阵的主元只有一个,为$2$。 + + 计算$x^TAx$,得$\begin{bmatrix}x_1&x_2\end{bmatrix}\begin{bmatrix}2&6\\6&18\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=2x_1^2+12x_1x_2+18x_2^2$这样我们得到了一个关于$x_1,x_2$的函数$f(x_1,x_2)=2x_1^2+12x_1x_2+18x_2^2$,这个函数不再是线性的,在本例中这是一个纯二次型(quadratic)函数,它没有线性部分、一次部分或更高次部分($Ax$是线性的,但引入$x^T$后就成为了二次型)。 + + 当$?$取$18$时,判定1、2、3都是“刚好不及格”。 + +* 我们可以先看“一定不及格”的样子,令$?=7$,矩阵为$A=\begin{bmatrix}2&6\\6&7\end{bmatrix}$,二阶顺序主子式变为$-22$,显然矩阵不是正定的,此时的函数为$f(x_1,x_2)=2x_1^2+12x_1x_2+7x_2^2$,如果取$x_1=1,x_2=-1$则有$f(1,-1)=2-12+7<0$。 + + 如果我们把$z=2x^2+12xy+7y^2$放在直角坐标系中,图像过原点$z(0,0)=0$,当$y=0$或$x=0$或$x=y$时函数为开口向上的抛物线,所以函数图像在某些方向上是正值;而在某些方向上是负值,比如$x=-y$,所以函数图像是一个马鞍面(saddle),$(0,0,0)$点称为鞍点(saddle point),它在某些方向上是极大值点,而在另一些方向上是极小值点。(实际上函数图像的最佳观测方向是沿着特征向量的方向。) + +* 再来看一下“一定及格”的情形,令$?=20$,矩阵为$A=\begin{bmatrix}2&6\\6&20\end{bmatrix}$,行列式为$\det A=4$,迹为$trace(A)=22$,特征向量均大于零,矩阵可以通过测试。此时的函数为$f(x_1,x_2)=2x_1^2+12x_1x_2+20x_2^2$,函数在除$(0,0)$外处处为正。我们来看看$z=2x^2+12xy+20y^2$的图像,式子的平方项均非负,所以需要两个平方项之和大于中间项即可,该函数的图像为抛物面(paraboloid)。在$(0,0)$点函数的一阶偏导数均为零,二阶偏导数均为正(马鞍面的一阶偏导数也为零,但二阶偏导数并不均为正,所以),函数在改点取极小值。 + + 在微积分中,一元函数取极小值需要一阶导数为零且二阶导数为正$\frac{\mathrm{d}u}{\mathrm{d}x}=0, \frac{\mathrm{d}^2u}{\mathrm{d}x^2}>0$。在线性代数中我们遇到了了多元函数$f(x_1,x_2,\cdots,x_n)$,要取极小值需要二阶偏导数矩阵为正定矩阵。 + + 在本例中(即二阶情形),如果能用平方和的形式来表示函数,则很容易看出函数是否恒为正,$f(x,y)=2x^2+12xy+20y^2=2\left(x+3y\right)^2+2y^2$。另外,如果是上面的$?=7$的情形,则有$f(x,y)=2(x+3y)^2-11y^2$,如果是$?=18$的情形,则有$f(x,y)=2(x+3y)^2$。 + + 如果令$z=1$,相当于使用$z=1$平面截取该函数图像,将得到一个椭圆曲线。另外,如果在$?=7$的马鞍面上截取曲线将得到一对双曲线。 + + 再来看这个矩阵的消元,$\begin{bmatrix}2&6\\6&20\end{bmatrix}=\begin{bmatrix}1&0\\-3&1\end{bmatrix}\begin{bmatrix}2&6\\0&2\end{bmatrix}$,这就是$A=LU$,可以发现矩阵$L$中的项与配平方中未知数的系数有关,而主元则与两个平方项外的系数有关,这也就是为什么正数主元得到正定矩阵。 + + 上面又提到二阶导数矩阵,这个矩阵型为$\begin{bmatrix}f_{xx}&f_{xy}\\f_{yx}&f_{yy}\end{bmatrix}$,显然,矩阵中的主对角线元素(纯二阶导数)必须为正,并且主对角线元素必须足够大来抵消混合导数的影响。同时还可以看出,因为二阶导数的求导次序并不影响结果,所以矩阵必须是对称的。现在我们就可以计算$n\times n$阶矩阵了。 + +接下来计算一个三阶矩阵,$A=\begin{bmatrix}2&-1&0\\-1&2&-1\\0&-1&2\end{bmatrix}$,它是正定的吗?函数$x^TAx$是多少?函数在原点去最小值吗?图像是什么样的? + +* 先来计算矩阵的顺序主子式,分别为$2,3,4$;再来计算主元,分别为$2,\frac{3}{2},\frac{4}{3}$;计算特征值,$\lambda_1=2-\sqrt 2,\lambda_2=2,\lambda_3=2+\sqrt 2$。 +* 计算$x^TAx=2x_1^2+2x_2^2+2x_3^2-2x_1x_2-2x_2x_3$。 +* 图像是四维的抛物面,当我们在$f(x_1,x_2,x_3)=1$处截取该面,将得到一个椭圆体。一般椭圆体有三条轴,特征值的大小决定了三条轴的长度,而特征向量的方向与三条轴的方向相同。 + +现在我们将矩阵$A$分解为$A=Q\Lambda Q^T$,可以发现上面说到的各种元素都可以表示在这个分解的矩阵中,我们称之为主轴定理(principal axis theorem),即特征向量说明主轴的方向、特征值说明主轴的长度。 + +$A=Q\Lambda Q^T$是特征值相关章节中最重要的公式。 diff --git a/docs/linalg/chapter29.md b/docs/linalg/chapter29.md new file mode 100644 index 00000000..dded418d --- /dev/null +++ b/docs/linalg/chapter29.md @@ -0,0 +1,56 @@ + +# 第二十九讲:相似矩阵和若尔当形 + +在本讲的开始,先接着上一讲来继续说一说正定矩阵。 + +* 正定矩阵的逆矩阵有什么性质?我们将正定矩阵分解为$A=S\Lambda S^{-1}$,引入其逆矩阵$A^{-1}=S\Lambda^{-1}S^{-1}$,我们知道正定矩阵的特征值均为正值,所以其逆矩阵的特征值也必为正值(即原矩阵特征值的倒数)所以,正定矩阵的逆矩阵也是正定的。 + +* 如果$A,\ B$均为正定矩阵,那么$A+B$呢?我们可以从判定$x^T(A+B)x$入手,根据条件有$x^TAx>0,\ x^TBx>0$,将两式相加即得到$x^T(A+B)x>0$。所以正定矩阵之和也是正定矩阵。 + +* 再来看有$m\times n$矩阵$A$,则$A^TA$具有什么性质?我们在投影部分经常使用$A^TA$,这个运算会得到一个对称矩阵,这个形式的运算用数字打比方就像是一个平方,用向量打比方就像是向量的长度平方,而对于矩阵,有$A^TA$正定:在式子两边分别乘向量及其转置得到$x^TA^TAx$,分组得到$(Ax)^T(Ax)$,相当于得到了向量$Ax$的长度平方,则$|Ax|^2\geq0$。要保证模不为零,则需要$Ax$的零空间中仅有零向量,即$A$的各列线性无关($rank(A)=n$)即可保证$|Ax|^2>0$,$A^TA$正定。 + +* 另外,在矩阵数值计算中,正定矩阵消元不需要进行“行交换”操作,也不必担心主元过小或为零,正定矩阵具有良好的计算性质。 + +接下来进入本讲的正题。 + +## 相似矩阵 + +先列出定义:矩阵$A,\ B$对于某矩阵$M$满足$B=M^{-1}AM$时,成$A,\ B$互为相似矩阵。 + +对于在对角化一讲(第二十二讲)中学过的式子$S^{-1}AS=\Lambda$,则有$A$相似于$\Lambda$。 + +* 举个例子,$A=\begin{bmatrix}2&1\\1&2\end{bmatrix}$,容易通过其特征值得到相应的对角矩阵$\Lambda=\begin{bmatrix}3&0\\0&1\end{bmatrix}$,取$M=\begin{bmatrix}1&4\\0&1\end{bmatrix}$,则$B=M^{-1}AM=\begin{bmatrix}1&-4\\0&1\end{bmatrix}\begin{bmatrix}2&1\\1&2\end{bmatrix}\begin{bmatrix}1&4\\0&1\end{bmatrix}=\begin{bmatrix}-2&-15\\1&6\end{bmatrix}$。 + + 我们来计算这几个矩阵的的特征值(利用迹与行列式的性质),$\lambda_{\Lambda}=3,\ 1$、$\lambda_A=3,\ 1$、$\lambda_B=3,\ 1$。 + +所以,相似矩阵有相同的特征值。 + +* 继续上面的例子,特征值为$3,\ 1$的这一族矩阵都是相似矩阵,如$\begin{bmatrix}3&7\\0&1\end{bmatrix}$、$\begin{bmatrix}1&7\\0&3\end{bmatrix}$,其中最特殊的就是$\Lambda$。 + +现在我们来证明这个性质,有$Ax=\lambda x,\ B=M^{-1}AM$,第一个式子化为$AMM^{-1}x=\lambda x$,接着两边同时左乘$M^{-1}$得$M^{-1}AMM^{-1}x=\lambda M^{-1}x$,进行适当的分组得$\left(M^{-1}AM\right)M^{-1}x=\lambda M^{-1}x$即$BM^{-1}x=\lambda M^{-1}x$。 + +$BM^{-1}=\lambda M^{-1}x$可以解读成矩阵$B$与向量$M^{-1}x$之积等于$\lambda$与向量$M^{-1}x$之积,也就是$B$的仍为$\lambda$,而特征向量变为$M^{-1}x$。 + +以上就是我们得到的一族特征值为$3,\ 1$的矩阵,它们具有相同的特征值。接下来看特征值重复时的情形。 + +* 特征值重复可能会导致特征向量短缺,来看一个例子,设$\lambda_1=\lambda_2=4$,写出具有这种特征值的矩阵中的两个$\begin{bmatrix}4&0\\0&4\end{bmatrix}$,$\begin{bmatrix}4&1\\0&4\end{bmatrix}$。其实,具有这种特征值的矩阵可以分为两族,第一族仅有一个矩阵$\begin{bmatrix}4&0\\0&4\end{bmatrix}$,它只与自己相似(因为$M^{-1}\begin{bmatrix}4&0\\0&4\end{bmatrix}M=4M^{-1}IM=4I=\begin{bmatrix}4&0\\0&4\end{bmatrix}$,所以无论$M$如何取值该对角矩阵都只与自己相似);另一族就是剩下的诸如$\begin{bmatrix}4&1\\0&4\end{bmatrix}$的矩阵,它们都是相似的。在这个“大家族”中,$\begin{bmatrix}4&1\\0&4\end{bmatrix}$是“最好”的一个矩阵,称为若尔当形。 + +若尔当形在过去是线性代数的核心知识,但现在不是了(现在是下一讲的奇异值分解),因为它并不容易计算。 + +* 继续上面的例子,我们在在出几个这一族的矩阵$\begin{bmatrix}4&1\\0&4\end{bmatrix},\ \begin{bmatrix}5&1\\-1&3\end{bmatrix},\ \begin{bmatrix}4&0\\17&4\end{bmatrix}$,我们总是可以构造出一个满足$trace(A)=8,\ \det A=16$的矩阵,这个矩阵总是在这一个“家族”中。 + +## 若尔当形 + +再来看一个更加“糟糕”的矩阵: + +* 矩阵$\begin{bmatrix}0&1&0&0\\0&0&1&0\\0&0&0&0\\0&0&0&0\end{bmatrix}$,其特征值为四个零。很明显矩阵的秩为$2$,所以其零空间的维数为$4-2=2$,即该矩阵有两个特征向量。可以发现该矩阵在主对角线的上方有两个$1$,在对角线上每增加一个$1$,特征向量个个数就减少一个。 + +* 令一个例子,$\begin{bmatrix}0&1&0&0\\0&0&0&0\\0&0&0&1\\0&0&0&0\end{bmatrix}$,从特征向量的数目看来这两个矩阵是相似的,其实不然。 + + 若尔当认为第一个矩阵是由一个$3\times 3$的块与一个$1\times 1$的块组成的 $\left[\begin{array}{ccc|c}0&1&0&0\\0&0&0&0\\0&0&0&1\\\hline0&0&0&0\end{array}\right]$,而第二个矩阵是由两个$2\times 2$矩阵组成的$\left[\begin{array}{cc|cc}0&1&0&0\\0&0&0&0\\\hline0&0&0&1\\0&0&0&0\end{array}\right]$,这些分块被称为若尔当块。 + +若尔当块的定义型为$J_i=\begin{bmatrix}\lambda_i&1&&\cdots&\\&\lambda_i&1&\cdots&\\&&\lambda_i&\cdots&\\\vdots&\vdots&\vdots&\ddots&\\&&&&\lambda_i\end{bmatrix}$,它的对角线上只为同一个数,仅有一个特征向量。 + +所有有,每一个矩阵$A$都相似于一个若尔当矩阵,型为$J=\left[\begin{array}{c|c|c|c}J_1&&&\\\hline&J_2&&\\\hline&&\ddots&\\\hline&&&J_d\end{array}\right]$。注意,对角线上方还有$1$。若尔当块的个数即为矩阵特征值的个数。 + +在矩阵为“好矩阵”的情况下,$n$阶矩阵将有$n$个不同的特征值,那么它可以对角化,所以它的若尔当矩阵就是$\Lambda$,共$n$个特征向量,有$n$个若尔当块。 diff --git a/docs/linalg/chapter30.md b/docs/linalg/chapter30.md new file mode 100644 index 00000000..a56bcebe --- /dev/null +++ b/docs/linalg/chapter30.md @@ -0,0 +1,59 @@ + +# 第三十讲:奇异值分解 + +本讲我们介绍将一个矩阵写为$A=U\varSigma V^T$,分解的因子分别为正交矩阵、对角矩阵、正交矩阵,与前面几讲的分解不同的是,这两个正交矩阵通常是不同的,而且这个式子可以对任意矩阵使用,不仅限于方阵、可对角化的方阵等。 + +* 在正定一讲中(第二十八讲)我们知道一个正定矩阵可以分解为$A=Q\Lambda Q^T$的形式,由于$A$对称性其特征向量是正交的,且其$\Lambda$矩阵中的元素皆为正,这就是正定矩阵的奇异值分解。在这种特殊的分解中,我们只需要一个正交矩阵$Q$就可以使等式成立。 + +* 在对角化一讲中(第二十二讲),我们知道可对角化的矩阵能够分解为$A=S\Lambda S^T$的形式,其中$S$的列向量由$A$的特征向量组成,但$S$并不是正交矩阵,所以这不是我们希望得到的奇异值分解。 + +我们现在要做的是,在$A$的**列空间**中找到一组特殊的正交基$v_1,v_2,\cdots,v_r$,这组基在$A$的作用下可以转换为$A$的**行空间**中的一组正交基$u_1,u_2,\cdots,u_r$。 + +用矩阵语言描述为$A\Bigg[v_1\ v_2\ \cdots\ v_r\Bigg]=\Bigg[\sigma_1u_1\ \sigma_2u_2\ \cdots\ \sigma_ru_r\Bigg]=\Bigg[u_1\ u_2\ \cdots\ u_r\Bigg]\begin{bmatrix}\sigma_1&&&\\&\sigma_2&&\\&&\ddots&\\&&&\sigma_n\end{bmatrix}$,即$Av_1=\sigma_1u_1,\ Av_2=\sigma_2u_2,\cdots,Av_r=\sigma_ru_r$,这些$\sigma$是缩放因子,表示在转换过程中有拉伸或压缩。而$A$的左零空间和零空间将体现在$\sigma$的零值中。 + +另外,如果算上左零、零空间,我们同样可以对左零、零空间取标准正交基,然后写为$A\Bigg[v_1\ v_2\ \cdots\ v_r\ v_{r+1}\ \cdots\ v_m\Bigg]=\Bigg[u_1\ u_2\ \cdots\ u_r\ u_{r+1}\ \cdots \ u_n\Bigg]\left[\begin{array}{c c c|c}\sigma_1&&&\\&\ddots&&\\&&\sigma_r&\\\hline&&&\begin{bmatrix}0\end{bmatrix}\end{array}\right]$,此时$U$是$m\times m$正交矩阵,$\varSigma$是$m\times n$对角矩阵,$V^T$是$n\times n$正交矩阵。 + +最终可以写为$AV=U\varSigma$,可以看出这十分类似对角化的公式,矩阵$A$被转化为对角矩阵$\varSigma$,我们也注意到$U,\ V$是两组不同的正交基。(在正定的情况下,$U,\ V$都变成了$Q$。)。进一步可以写作$A=U\varSigma V^{-1}$,因为$V$是标准正交矩阵所以可以写为$A=U\varSigma V^T$ + +计算一个例子,$A=\begin{bmatrix}4&4\\-3&3\end{bmatrix}$,我们需要找到: + +* 行空间$\mathbb{R}^2$的标准正交基$v_1,v_2$; +* 列空间$\mathbb{R}^2$的标准正交基$u_1,u_2$; +* $\sigma_1>0, \sigma_2>0$。 + +在$A=U\varSigma V^T$中有两个标准正交矩阵需要求解,我们希望一次只解一个,如何先将$U$消去来求$V$? + +这个技巧会经常出现在长方形矩阵中:求$A^TA$,这是一个对称正定矩阵(至少是半正定矩阵),于是有$A^TA=V\varSigma^TU^TU\varSigma V^T$,由于$U$是标准正交矩阵,所以$U^TU=I$,而$\varSigma^T\varSigma$是对角线元素为$\sigma^2$的对角矩阵。 + +现在有$A^TA=V\begin{bmatrix}\sigma_1&&&\\&\sigma_2&&\\&&\ddots&\\&&&\sigma_n\end{bmatrix}V^T$,这个式子中$V$即是$A^TA$的特征向量矩阵而$\varSigma^2$是其特征值矩阵。 + +同理,我们只想求$U$时,用$AA^T$消掉$V$即可。 + +我们来计算$A^TA=\begin{bmatrix}4&-3\\4&3\end{bmatrix}\begin{bmatrix}4&4\\-3&3\end{bmatrix}=\begin{bmatrix}25&7\\7&25\end{bmatrix}$,对于简单的矩阵可以直接观察得到特征向量$A^TA\begin{bmatrix}1\\1\end{bmatrix}=32\begin{bmatrix}1\\1\end{bmatrix},\ A^TA\begin{bmatrix}1\\-1\end{bmatrix}=18\begin{bmatrix}1\\-1\end{bmatrix}$,化为单位向量有$\sigma_1=32,\ v_1=\begin{bmatrix}\frac{1}{\sqrt{2}}\\\frac{1}{\sqrt{2}}\end{bmatrix},\ \sigma_2=18,\ v_2=\begin{bmatrix}\frac{1}{\sqrt{2}}\\-\frac{1}{\sqrt{2}}\end{bmatrix}$。 + +到目前为止,我们得到$\begin{bmatrix}4&4\\-3&3\end{bmatrix}=\begin{bmatrix}u_?&u_?\\u_?&u_?\end{bmatrix}\begin{bmatrix}\sqrt{32}&0\\0&\sqrt{18}\end{bmatrix}\begin{bmatrix}\frac{1}{\sqrt{2}}&\frac{1}{\sqrt{2}}\\\frac{1}{\sqrt{2}}&-\frac{1}{\sqrt{2}}\end{bmatrix}$,接下来继续求解$U$。 + +$AA^T=U\varSigma V^TV\varSigma^TU^T=U\varSigma^2U^T$,求出$AA^T$的特征向量即可得到$U$,$\begin{bmatrix}4&4\\-3&3\end{bmatrix}\begin{bmatrix}4&-3\\4&3\end{bmatrix}=\begin{bmatrix}32&0\\0&18\end{bmatrix}$,观察得$AA^T\begin{bmatrix}1\\0\end{bmatrix}=32\begin{bmatrix}1\\0\end{bmatrix},\ AA^T\begin{bmatrix}0\\1\end{bmatrix}=18\begin{bmatrix}0\\1\end{bmatrix}$。但是我们不能直接使用这一组特征向量,因为式子$AV=U\varSigma$明确告诉我们,一旦$V$确定下来,$U$也必须取能够满足该式的向量,所以此处$Av_2=\begin{bmatrix}0\\-\sqrt{18}\end{bmatrix}=u_2\sigma_2=\begin{bmatrix}0\\-1\end{bmatrix}\sqrt{18}$,则$u_1=\begin{bmatrix}1\\0\end{bmatrix},\ u_2=\begin{bmatrix}0\\-1\end{bmatrix}$。(这个问题在[本讲的官方笔记](http://ocw.mit.edu/courses/mathematics/18-06sc-linear-algebra-fall-2011/positive-definite-matrices-and-applications/singular-value-decomposition/MIT18_06SCF11_Ses3.5sum.pdf)中有详细说明。) + +* 补充:$AB$的特征值与$BA$的特征值相同,证明来自[Are the eigenvalues of AB equal to the eigenvalues of BA? (Citation needed!)](http://math.stackexchange.com/questions/124888/are-the-eigenvalues-of-ab-equal-to-the-eigenvalues-of-ba-citation-needed): + + 取$\lambda\neq 0$,$v$是$AB$在特征值取$\lambda$时的的特征向量,则有$Bv\neq 0$,并有$\lambda Bv=B(\lambda v)=B(ABv)=(BA)Bv$,所以$Bv$是$BA$在特征值取同一个$\lambda$时的特征向量。 + + 再取$AB$的特征值$\lambda=0$,则$0=\det{AB}=\det{A}\det{B}=\det{BA}$,所以$\lambda=0$也是$BA$的特征值,得证。 + +最终,我们得到$\begin{bmatrix}4&4\\-3&3\end{bmatrix}=\begin{bmatrix}1&0\\0&-1\end{bmatrix}\begin{bmatrix}\sqrt{32}&0\\0&\sqrt{18}\end{bmatrix}\begin{bmatrix}\frac{1}{\sqrt{2}}&\frac{1}{\sqrt{2}}\\\frac{1}{\sqrt{2}}&-\frac{1}{\sqrt{2}}\end{bmatrix}$。 + +再做一个例子,$A=\begin{bmatrix}4&3\\8&6\end{bmatrix}$,这是个秩一矩阵,有零空间。$A$的行空间为$\begin{bmatrix}4\\3\end{bmatrix}$的倍数,$A$的列空间为$\begin{bmatrix}4\\8\end{bmatrix}$的倍数。 + +* 标准化向量得$v_1=\begin{bmatrix}0.8\\0.6\end{bmatrix},\ u_1=\frac{1}{\sqrt{5}}\begin{bmatrix}1\\2\end{bmatrix}$。 +* $A^TA=\begin{bmatrix}4&8\\3&6\end{bmatrix}\begin{bmatrix}4&3\\8&6\end{bmatrix}=\begin{bmatrix}80&60\\60&45\end{bmatrix}$,由于$A$是秩一矩阵,则$A^TA$也不满秩,所以必有特征值$0$,则另特征值一个由迹可知为$125$。 +* 继续求零空间的特征向量,有$v_2=\begin{bmatrix}0.6\\-0,8\end{bmatrix},\ u_1=\frac{1}{\sqrt{5}}\begin{bmatrix}2\\-1\end{bmatrix}$ + +最终得到$\begin{bmatrix}4&3\\8&6\end{bmatrix}=\begin{bmatrix}1&\underline {2}\\2&\underline{-1}\end{bmatrix}\begin{bmatrix}\sqrt{125}&0\\0&\underline{0}\end{bmatrix}\begin{bmatrix}0.8&0.6\\\underline{0.6}&\underline{-0.8}\end{bmatrix}$,其中下划线部分都是与零空间相关的部分。 + +* $v_1,\ \cdots,\ v_r$是行空间的标准正交基; +* $u_1,\ \cdots,\ u_r$是列空间的标准正交基; +* $v_{r+1},\ \cdots,\ v_n$是零空间的标准正交基; +* $u_{r+1},\ \cdots,\ u_m$是左零空间的标准正交基。 + +通过将矩阵写为$Av_i=\sigma_iu_i$形式,将矩阵对角化,向量$u,\ v$之间没有耦合,$A$乘以每个$v$都能得到一个相应的$u$。 diff --git a/docs/linalg/chapter31.md b/docs/linalg/chapter31.md new file mode 100644 index 00000000..5b76af43 --- /dev/null +++ b/docs/linalg/chapter31.md @@ -0,0 +1,181 @@ + +# 第三十一讲:线性变换及对应矩阵 + +如何判断一个操作是不是线性变换?线性变换需满足以下两个要求: + +$$ +T(v+w)=T(v)+T(w)\\ +T(cv)=cT(v) +$$ + +即变换$T$需要同时满足加法和数乘不变的性质。将两个性质合成一个式子为:$T(cv+dw)=cT(v)+dT(w)$ + + + +例1,二维空间中的投影操作,$T: \mathbb{R}^2\to\mathbb{R}^2$,它可以将某向量投影在一条特定直线上。检查一下投影操作,如果我们将向量长度翻倍,则其投影也翻倍;两向量相加后做投影与两向量做投影再相加结果一致。所以投影操作是线性变换。 + +“坏”例1,二维空间的平移操作,即平面平移: + + +```python +%matplotlib inline +import matplotlib.pyplot as plt +import seaborn as sns +import numpy as np + + +fig = plt.figure() + +sp1 = plt.subplot(221) +vectors_1 = np.array([[0,0,3,2],]) +X_1, Y_1, U_1, V_1 = zip(*vectors_1) +plt.axhline(y=0, c='black') +plt.axvline(x=0, c='black') +sp1.quiver(X_1, Y_1, U_1, V_1, angles='xy', scale_units='xy', scale=1) +sp1.set_xlim(0, 10) +sp1.set_ylim(0, 5) +sp1.set_xlabel("before shifted") + +sp2 = plt.subplot(222) +vector_2 = np.array([[0,0,3,2], + [3,2,2,0], + [0,0,5,2], + [0,0,10,4]]) +X_2,Y_2,U_2,V_2 = zip(*vector_2) +plt.axhline(y=0, c='black') +plt.axvline(x=0, c='black') +sp2.quiver(X_2, Y_2, U_2, V_2, angles='xy', scale_units='xy', scale=1) +sp2.set_xlim(0, 10) +sp2.set_ylim(0, 5) +sp2.set_xlabel("shifted by horizontal 2 then double") + +sp3 = plt.subplot(223) +vectors_1 = np.array([[0,0,6,4],]) +X_1, Y_1, U_1, V_1 = zip(*vectors_1) +plt.axhline(y=0, c='black') +plt.axvline(x=0, c='black') +sp3.quiver(X_1, Y_1, U_1, V_1, angles='xy', scale_units='xy', scale=1) +sp3.set_xlim(0, 10) +sp3.set_ylim(0, 5) +sp3.set_xlabel("double the vector") + +sp4 = plt.subplot(224) +vector_2 = np.array([[0,0,6,4], + [6,4,2,0], + [0,0,8,4]]) +X_2,Y_2,U_2,V_2 = zip(*vector_2) +plt.axhline(y=0, c='black') +plt.axvline(x=0, c='black') +sp4.quiver(X_2, Y_2, U_2, V_2, angles='xy', scale_units='xy', scale=1) +sp4.set_xlim(0, 10) +sp4.set_ylim(0, 5) +sp4.set_xlabel("doubled vector shifted by horizontal 2") + +plt.subplots_adjust(hspace=0.33) +plt.draw() +``` + + +![png](img/chapter31_1_0.png) + + + +```python +plt.close(fig) +``` + +比如,上图中向量长度翻倍,再做平移,明显与向量平移后再翻倍的结果不一致。 + +有时我们也可以用一个简单的特例判断线性变换,检查$T(0)\stackrel{?}{=}0$。零向量平移后结果并不为零。 + +所以平面平移操作并不是线性变换。 + +“坏”例2,求模运算,$T(v)=\|v\|,\ T:\mathbb{R}^3\to\mathbb{R}^1$,这显然不是线性变换,比如如果我们将向量翻倍则其模翻倍,但如果我将向量翻倍取负,则其模依然翻倍。所以$T(-v)\neq -T(v)$ + +例2,旋转$45^\circ$操作,$T:\mathbb{R}^2\to\mathbb{R}^2$,也就是将平面内一个向量映射为平面内另一个向量。检查可知,如果向量翻倍,则旋转后同样翻倍;两个向量先旋转后相加,与这两个向量先相加后旋转得到的结果一样。 + +所以从上面的例子我们知道,投影与旋转都是线性变换。 + +例3,矩阵乘以向量,$T(v)=Av$,这也是一个(一系列)线性变换,不同的矩阵代表不同的线性变换。根据矩阵的运算法则有$A(v+w)=A(v)+A(w),\ A(cv)=cAv$。比如取$A=\begin{bmatrix}1&0\\0&-1\end{bmatrix}$,作用于平面上的向量$v$,会导致$v$的$x$分量不变,而$y$分量取反,也就是图像沿$x$轴翻转。 + +线性变换的核心,就是该变换使用的相应的矩阵。 + +比如我们需要做一个线性变换,将一个三维向量降至二维,$T:\mathbb{R}^3\to\mathbb{R}^2$,则在$T(v)=Av$中,$v\in\mathbb{R}^3,\ T(v)\in\mathbb{R}^2$,所以$A$应当是一个$2\times 3$矩阵。 + +如果我们希望知道线性变换$T$对整个输入空间$\mathbb{R}^n$的影响,我们可以找到空间的一组基$v_1,\ v_2,\ \cdots,\ v_n$,检查$T$对每一个基的影响$T(v_1),\ T(v_2),\ \cdots,\ T(v_n)$,由于输入空间中的任意向量都满足: + +$$v=c_1v_1+c_2v_2+\cdots+c_nv_n\tag{1}$$ + +所以我们可以根据$T(v)$推出线性变换$T$对空间内任意向量的影响,得到: + +$$T(v)=c_1T(v_1)+c_2T(v_2)+\cdots+c_nT(v_n)\tag{2}$$ + +现在我们需要考虑,如何把一个与坐标无关的线性变换变成一个与坐标有关的矩阵呢? + +在$1$式中,$c_1,c_2,\cdots,c_n$就是向量$v$在基$v_1,v_2,\cdots,v_n$上的坐标,比如分解向量$v=\begin{bmatrix}3\\2\\4\end{bmatrix}=3\begin{bmatrix}1\\0\\0\end{bmatrix}+2\begin{bmatrix}0\\1\\0\end{bmatrix}+4\begin{bmatrix}0\\0\\1\end{bmatrix}$,式子将向量$v$分解在一组标准正交基$\begin{bmatrix}1\\0\\0\end{bmatrix},\begin{bmatrix}0\\1\\0\end{bmatrix},\begin{bmatrix}0\\0\\1\end{bmatrix}$上。当然,我们也可以选用矩阵的特征向量作为基向量,基的选择是多种多样的。 + +我们打算构造一个矩阵$A$用以表示线性变换$T:\mathbb{R}^n\to\mathbb{R}^m$。我们需要两组基,一组用以表示输入向量,一组用以表示输出向量。令$v_1,v_2,\cdots,v_n$为输入向量的基,这些向量来自$\mathbb{R}^n$;$w_1,w_2,\cdots,w_m$作为输出向量的基,这些向量来自$\mathbb{R}^m$。 + +我们用二维空间的投影矩阵作为例子: + + +```python +fig = plt.figure() + +vectors_1 = np.array([[0, 0, 3, 2], + [0, 0, -2, 3]]) +X_1, Y_1, U_1, V_1 = zip(*vectors_1) +plt.axis('equal') +plt.axhline(y=0, c='black') +plt.axvline(x=0, c='black') +plt.quiver(X_1, Y_1, U_1, V_1, angles='xy', scale_units='xy', scale=1) +plt.plot([-6, 12], [-4, 8]) +plt.annotate('$v_1=w_1$', xy=(1.5, 1), xytext=(10, -20), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) +plt.annotate('$v_2=w_2$', xy=(-1, 1.5), xytext=(-60, -20), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) +plt.annotate('project line', xy=(4.5, 3), xytext=(-90, 10), textcoords='offset points', size=14, arrowprops=dict(arrowstyle="->")) + +ax = plt.gca() +ax.set_xlim(-5, 5) +ax.set_ylim(-4, 4) +ax.set_xlabel("Project Example") + +plt.draw() +``` + + +![png](img/chapter31_4_0.png) + + + +```python +plt.close(fig) +``` + +从图中可以看到,设输入向量的基为$v_1,v_2$,$v_1$就在投影上,而$v_2$垂直于投影方向,输出向量的基为$w_1,w_2$,而$v_1=w_1,v_2=w_2$。那么如果输入向量为$v=c_1v_1+c_2v_2$,则输出向量为$T(v)=c_1v_1$,也就是线性变换去掉了法线方向的分量,输入坐标为$(c_1,c_2)$,输出坐标变为$(c_1,0)$。 + +找出这个矩阵并不困难,$Av=w$,则有$\begin{bmatrix}1&0\\0&0\end{bmatrix}\begin{bmatrix}c_1\\c_2\end{bmatrix}=\begin{bmatrix}c_1\\0\end{bmatrix}$。 + +本例中我们选取的基极为特殊,一个沿投影方向,另一个沿投影法线方向,其实这两个向量都是投影矩阵的特征向量,所以我们得到的线性变换矩阵是一个对角矩阵,这是一组很好的基。 + +所以,如果我们选取投影矩阵的特征向量作为基,则得到的线性变换矩阵将是一个包含投影矩阵特征值的对角矩阵。 + +继续这个例子,我们不再选取特征向量作为基,而使用标准基$v_1=\begin{bmatrix}1\\0\end{bmatrix},v_2=\begin{bmatrix}0\\1\end{bmatrix}$,我们继续使用相同的基作为输出空间的基,即$v_1=w_1,v_2=w_2$。此时投影矩阵为$P=\frac{aa^T}{a^Ta}=\begin{bmatrix}\frac{1}{2}&\frac{1}{2}\\\frac{1}{2}&\frac{1}{2}\end{bmatrix}$,这个矩阵明显没有上一个矩阵“好”,不过这个矩阵也是一个不错的对称矩阵。 + +总结通用的计算线性变换矩阵$A$的方法: + +* 确定输入空间的基$v_1,v_2,\cdots,v_n$,确定输出空间的基$w_1,w_2,\cdots,w_m$; +* 计算$T(v_1)=a_{11}w_1+a_{21}w_2+\cdots+a_{m1}w_m$,求出的系数$a_{i1}$就是矩阵$A$的第一列; +* 继续计算$T(v_2)=a_{12}w_1+a_{22}w_2+\cdots+a_{m2}w_m$,求出的系数$a_{i2}$就是矩阵$A$的第二列; +* 以此类推计算剩余向量直到$v_n$; +* 最终得到矩阵$A=\left[\begin{array}{c|c|c|c}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{m1}&a_{m2}&\cdots&a_{mn}\\\end{array}\right]$。 + +最后我们介绍一种不一样的线性变换,$T=\frac{\mathrm{d}}{\mathrm{d}x}$: + +* 设输入为$c_1+c_2x+c_3x^3$,基为$1,x,x^2$; +* 则输出为导数:$c_2+2c_3x$,基为$1,x$; + + 所以我们需要求一个从三维输入空间到二维输出空间的线性变换,目的是求导。求导运算其实是线性变换,因此我们只要知道少量函数的求导法则(如$\sin x, \cos x, e^x$),就能求出它们的线性组合的导数。 + + 有$A\begin{bmatrix}c_1\\c_2\\c_3\end{bmatrix}=\begin{bmatrix}c_2\\2c_3\end{bmatrix}$,从输入输出的空间维数可知,$A$是一个$2\times 3$矩阵,$A=\begin{bmatrix}0&1&0\\0&0&2\end{bmatrix}$。 + +最后,矩阵的逆相当于对应线性变换的逆运算,矩阵的乘积相当于线性变换的乘积,实际上矩阵乘法也源于线性变换。 diff --git a/docs/linalg/chapter32.md b/docs/linalg/chapter32.md new file mode 100644 index 00000000..b03be3ed --- /dev/null +++ b/docs/linalg/chapter32.md @@ -0,0 +1,103 @@ + +# 第三十二讲:基变换和图像压缩 + +## 图像压缩 + +本讲我们介绍一种图片有损压缩的一种方法:JPEG。 + +假设我们有一张图片,长宽皆为$512$个像素,我们用$x_i$来表示第$i$个像素,如果是灰度照片,通常$x_i$可以在$[0,255]$上取值,也就是8 bits。对于这承载这张图片信息的向量$x$来说,有$x\in\mathbb{R}^n, n=512^2$。而如果是彩色照片,通常需要三个量来表示一个像素,则向量长度也会变为现在的三倍。 + +如此大的数据不经过压缩很难广泛传播。教学录像采用的压缩方法就是JPEG(Joint Photographic Expert Group,联合图像专家组),该方法采用的就是基变换的方式压缩图像。比如说一块干净的黑白,其附近的像素值应该非常接近,此时如果一个像素一个像素的描述黑白灰度值就太浪费空间了,所以标准基在这种情况下并不能很好的利用图片的特性。 + +我们知道,标准基是 $\begin{bmatrix}1\\0\\\vdots\\0\end{bmatrix}\begin{bmatrix}0\\1\\\vdots\\0\end{bmatrix}\cdots\begin{bmatrix}0\\0\\\vdots\\1\end{bmatrix}$,我们想寻找一个更好的基。 + +我们试试使用别的基描述图片,比如: + +* 基中含有的一个向量 $\begin{bmatrix}1&1&\cdots&1\end{bmatrix}^T$,即分量全为$1$的向量,一个向量就可以完整的给出所有“像素一致图像”的信息; +* 另一个向量 $\begin{bmatrix}1&-1&\cdots&1&-1\end{bmatrix}^T$,正负交替出现,比如描述国际象棋棋盘; +* 第三个个向量 $\begin{bmatrix}1&1&\cdots&-1&-1\end{bmatrix}^T$,一半正一半负,比如描述一半亮一半暗的图片; + +### 傅里叶基 + +现在我们来介绍傅里叶基,以$8\times 8$傅里叶基为例(这表示我们每次只处理$8\times 8$像素的一小块图像): + +$F_n=\begin{bmatrix}1&1&1&\cdots&1\\1&w&w^2&\cdots&w^{n-1}\\1&w^2&w^4&\cdots&w^{2(n-1)}\\\vdots&\vdots&\vdots&\ddots&\vdots\\1&w^{n-1}&w^{2(n-1)}&\cdots&w^{(n-1)^2}\end{bmatrix},\ w=e^{i2\pi/n},\ n=8$,我们不需要深入$8$阶傅里叶基的细节,先看看使用傅里叶基的思路是怎样的。 + +每次处理$8\times 8$的一小块时,会遇到$64$个像素,也就是$64$个基向量,$64$个系数,在$64$维空间中利用傅里叶向量做基变换: + +* 输入信号$x$为$64$维向量$\xrightarrow{基变换}$输出信号$c$为$x$在傅里叶基下的$64$个系数。 + + 注意前面做的都是无损的步骤,我们只是选了$\mathbb{R}^64$的一组基,接着把信号用这组基表达出来。 + + 接下来的步骤就涉及到压缩和损失了: + + +* 一种方法是扔掉较小的系数,这叫做阈值量化(thresholding),我们设定一个阈值,任何不在阈值范围内的基向量、系数都将丢弃,虽然有信息损失,但是只要阈值设置合理,肉眼几乎无法区别压缩前后的图片。经由此步处理,向量$c$变为$\hat c$,而$\hat c$将有很多$0$。 + + 通常$\begin{bmatrix}1&1&\cdots&1\end{bmatrix}^T$向量很难被丢弃,它通常具有较大的系数。但是$\begin{bmatrix}1&-1&\cdots&1&-1\end{bmatrix}^T$向量在平滑信号中的可能性就很小了。前一个的向量称作低频信号,频率为$0$,后一个向量称作高频信号,也是我们能够得到的最高频率的信号,如果是噪音或抖动输出的就是它。 + + 比如讲课的视频图像信号,这种平滑的情形下输出的大多是低频信号,很少出现噪音。 + + +* 接着我们用这些系数$\hat c$来重构信号,用这些系数乘以对应的基向量$\hat x=\sum \hat{c}_iv_i$,但是这个求和不再是$64$项求和了,因为压缩后的系数中有很多零存在,比如说我们压缩后$\hat c$中仅有三个非零项,那么压缩比将近达到$21:1$。 + +我们再来提一下视频压缩:视频是一系列连续图像,且相近的帧非常接近,而我们的压缩算法就需要利用这个相近性质。在实际生活中,从时间与空间的角度讲,事物不会瞬间改变。 + +### 小波基 + +接下来介绍另一组基,它是傅里叶基的竞争对手,名为小波(wavelets),同样以$8\times 8$为例: +$\begin{bmatrix}1\\1\\1\\1\\1\\1\\1\\1\end{bmatrix} +\begin{bmatrix}1\\1\\1\\1\\-1\\-1\\-1\\-1\end{bmatrix} +\begin{bmatrix}1\\1\\-1\\-1\\0\\0\\0\\0\end{bmatrix} +\begin{bmatrix}0\\0\\0\\0\\1\\1\\-1\\-1\end{bmatrix} +\begin{bmatrix}1\\-1\\0\\0\\0\\0\\0\\0\end{bmatrix} +\begin{bmatrix}0\\0\\1\\-1\\0\\0\\0\\0\end{bmatrix} +\begin{bmatrix}0\\0\\0\\0\\1\\-1\\0\\0\end{bmatrix} +\begin{bmatrix}0\\0\\0\\0\\0\\0\\1\\-1\end{bmatrix}$。 + +可以看出傅里叶基中频率最高的向量为小波后四个基向量之和。 + +在标准基下的一组(按八个一组计算,$P\in\mathbb{R}^8$)像素$P=\begin{bmatrix}p_1\\p_2\\\vdots\\p_8\end{bmatrix}=c_1w_1+c_2w_2+\cdots+c_nw_n=\Bigg[w_1\ w_2\ \cdots\ w_n\Bigg]\begin{bmatrix}c_1\\c_2\\\vdots\\c_n\end{bmatrix}$,即$P=WC$,我们需要计算像素向量在另一组基下系数,所以有$C=W^{-1}P$。 + +此时我们发现,如果选取“好的基”会使得逆矩阵的求解过程变简单,所谓“好的基”: + +* 计算快; + + 我们需要大量使用$P=WC$来计算整幅图在另一个基下的表达,在傅里叶变换中我们学习了快速傅里叶变换(FFT),同样的在小波变换中也有快速小波变换(FWT); + + 另外的,我们需要计算其逆矩阵,所以这个逆矩阵计算也必须快,观察小波基不难发现基向量相互正交,假设我们已经对小波基做了标准化处理,则小波基是一组标准正交基,所以有$W^{-1}=W^T$。 + + +* 仅需少量向量即可最大限度的重现图像。 + + 因为在图像压缩时,我们会舍弃较小的系数,比如$c_5,c_6,c_7,c_8$,所以后四个的基向量都会被舍弃,重现图像时仅使用前四个基向量的线性组合,而好的基选取会在使用较少基的前提下保证图像质量不会有较大损失。 + + 题外话:JPEG2000标准会将小波基纳入压缩算法。我们上面介绍的是最简单的一组小波基,而FBI的指纹识别或JPEG2000的压缩算法纳入的是更加平滑的小波基,不会使用像上面介绍的那种直接从$1$变为$-1$的基。 + +要想继续了解小波基,可以参考一篇非常精彩的文章[能不能通俗的讲解下傅立叶分析和小波分析之间的关系?——“咚懂咚懂咚“的答案](https://www.zhihu.com/question/22864189/answer/40772083) + +## 基变换 + +前面介绍小波基的时候我们就已经做了一次基变换。 + +将目标基的向量按列组成矩阵$W$,则基变换就是$\Bigg[x\Bigg]\xrightarrow{x=Wc}\Bigg[c\Bigg]$。 + +看一个例子,有线性变换$T:\mathbb{R}^8\to\mathbb{R}^8$,在第一组基$v_1,v_2,\cdots,v_8$上计算得到矩阵$A$,在第二组基$w_1,w_2,\cdots,w_n$上计算得到矩阵$B$。先说结论,矩阵$A,B$是相似的,也就是有$B=M^{-1}AM$,而$M$就是基变换矩阵。 + +进行基变换时会发生两件事: +1. 每个向量都会有一组新的坐标,而$x=Wc$就是新旧坐标的关系; +2. 每个线性变换都会有一个新的矩阵,而$B=M^{-1}AM$就是新旧矩阵的关系。 + + 再来看什么是$A$矩阵? + + 对于第一组基$v_1,v_2,\cdots,v_8$,要完全了解线性变换$T$,只需要知道$T$作用在基的每一个向量上会产生什么结果即可。因为在这个基下的每一个向量都可以写成$x=c_1v_1+c_2v_2+\cdots+c_8v_8$的形式,所以$T(x)=c_1T(v_1)+c_2T(v_2)+\cdots+c_8T(v_8)$。 + + 而且$T(v_1)=a_{11}v_1+a_{21}v_2+\cdots+a_{81}v_8,\ T(v_2)=a_{12}v_1+a_{22}v_2+\cdots+a_{82}v_8,\ \cdots$,则矩阵$\begin{bmatrix}A\end{bmatrix}=\left[\begin{array}{c|c|c|c}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&\vdots\\a_{m1}&a_{m2}&\cdots&a_{mn}\\\end{array}\right]$ + + 这些都是上一讲结尾所涉及的知识。 + +最后我们以一个更加特殊的基收场,设$v_1,v_2,\cdots,v_n$是一组特征向量,也就是$T(v_i)=\lambda_1v_i$,那么问题就是矩阵$A$是什么? + +继续使用线性变换中学到的,输入的第一个向量$v_1$经由$T$加工后得到$\lambda_1v_1$,第二个向量$v_2\xrightarrow{T}\lambda_2v_2$,继续做下去,最终有$v_n=v_n\xrightarrow{T}\lambda_nv_n$。除了$\lambda_iv_i$外的其他基向量都变为$0$,那么矩阵$A=\begin{bmatrix}\lambda_1&&&\\&\lambda_2&&\\&&\ddots&\\&&&\lambda_n\end{bmatrix}$。 + +这是一个非常完美的基,我们在图像处理中最想要的就是这种基,但是找出像素矩阵的特征向量代价太大,所以我们找了一些代价小同时效果也不错的基,比如小波基、傅里叶基等等。 diff --git a/docs/linalg/chapter33.md b/docs/linalg/chapter33.md new file mode 100644 index 00000000..7838904b --- /dev/null +++ b/docs/linalg/chapter33.md @@ -0,0 +1,68 @@ + +# 第三十三讲:单元检测3复习 + +在上一次复习中,我们已经涉及了求特征值与特征向量(通过解方程$\det(A-\lambda I)=0$得出$\lambda$,再将$\lambda$带入$A-\lambda I$求其零空间得到$x$)。 + +接下的章节来我们学习了: + +* 解微分方程$\frac{\mathrm{d}u}{\mathrm{d}t}=Au$,并介绍了指数矩阵$e^{At}$; +* 介绍了对称矩阵的性质$A=A^T$,了解了其特征值均为实数且总是存在足量的特征向量(即使特征值重复特征向量也不会短缺,总是可以对角化);同时对称矩阵的特征向量正交,所以对称矩阵对角化的结果可以表示为$A=Q\Lambda Q^T$; +* 接着我们学习了正定矩阵; +* 然后学习了相似矩阵,$B=M^{-1}AM$,矩阵$A,B$特征值相同,其实相似矩阵是用不同的基表示相同的东西; +* 最后我们学习了奇异值分解$A=U\varSigma V^T$。 + +现在,我们继续通过例题复习这些知识点。 + +1. *解方程$\frac{\mathrm{d}u}{\mathrm{d}t}=Au=\begin{bmatrix}0&-1&0\\1&0&-1\\0&1&0\end{bmatrix}u$*。 + + 首先通过$A$的特征值/向量求通解$u(t)=c_1e^{\lambda_1t}x_1+c_2e^{\lambda_2t}x_2+c_3e^{\lambda_3t}x_3$,很明显矩阵是奇异的,所以有$\lambda_1=0$; + + 继续观察矩阵会发现$A^T=-A$,这是一个反对称矩阵(anti-symmetric)或斜对陈矩阵(skew-symmetric),这与我们在第二十一讲介绍过的旋转矩阵类似,它的特征值应该为纯虚数(特征值在虚轴上),所以我们猜测其特征值应为$0\cdot i,\ b\cdot i,\ -b\cdot i$。通过解$\det(A-\lambda I)=0$验证一下:$\begin{bmatrix}-\lambda&-1&0\\1&-\lambda&-1\\0&1&\lambda\end{bmatrix}=\lambda^3+2\lambda=0, \lambda_2=\sqrt 2i, \lambda_3=-\sqrt 2i$。 + + 此时$u(t)=c_1+c_2e^{\sqrt 2it}x_2+c_3e^{-\sqrt 2it}x_3$,$e^{\sqrt 2it}$始终在复平面单位圆上,所以$u(t)$及不发散也不收敛,它只是具有周期性。当$t=0$时有$u(0)=c_1+c_2+c_3$,如果使$e^{\sqrt 2iT}=1$即$\sqrt 2iT=2\pi i$则也能得到$u(T)=c_1+c_2+c_3$,周期$T=\pi\sqrt 2$。 + + 另外,反对称矩阵同对称矩阵一样,具有正交的特征向量。当矩阵满足什么条件时,其特征向量相互正交?答案是必须满足$AA^T=A^TA$。所以对称矩阵$A=A^T$满足此条件,同时反对称矩阵$A=-A^T$也满足此条件,而正交矩阵$Q^{-1}=Q^T$同样满足此条件,这三种矩阵的特征向量都是相互正交的。 + + 上面的解法并没有求特征向量,进而通过$u(t)=e^{At}u(0)$得到通解,现在我们就来使用指数矩阵来接方程。如果矩阵可以对角化(在本例中显然可以),则$A=S\Lambda S^{-1}, e^{At}=Se^{\Lambda t}S^{-1}=S\begin{bmatrix}e^{\lambda_1t}&&&\\&e^{\lambda_1t}&&\\&&\ddots&\\&&&e^{\lambda_1t}\end{bmatrix}S^{-1}$,这个公式在能够快速计算$S,\lambda$时很方便求解。 + +2. 已知矩阵的特征值$\lambda_1=0,\lambda_2=c,\lambda_3=2$,特征向量$x_1=\begin{bmatrix}1\\1\\1\end{bmatrix},x_2=\begin{bmatrix}1&-1&0\end{bmatrix},x_3=\begin{bmatrix}1\\1\\-2\end{bmatrix}$: + + *$c$如何取值才能保证矩阵可以对角化?*其实可对角化只需要有足够的特征向量即可,而现在特征向量已经足够,所以$c$可以取任意值。 + + *$c$如何取值才能保证矩阵对称?*我们知道,对称矩阵的特征值均为实数,且注意到给出的特征向量是正交的,有了实特征值及正交特征向量,我们就可以得到对称矩阵。 + + *$c$如何取值才能使得矩阵正定?*已经有一个零特征值了,所以矩阵不可能是正定的,但可以是半正定的,如果$c$去非负实数。 + + *$c$如何取值才能使得矩阵是一个马尔科夫矩阵?*在第二十四讲我们知道马尔科夫矩阵的性质:必有特征值等于$1$,其余特征值均小于$1$,所以$A$不可能是马尔科夫矩阵。 + + *$c$取何值才能使得$P=\frac{A}{2}$是一个投影矩阵?*我们知道投影矩阵的一个重要性质是$P^2=P$,所以有对其特征值有$\lambda^2=\lambda$,则$c=0,2$。 + + 题设中的正交特征向量意义重大,如果没有正交这个条件,则矩阵$A$不会是对称、正定、投影矩阵。因为特征向量的正交性我们才能直接去看特征值的性质。 + +3. 复习奇异值分解,$A=U\varSigma V^T$: + + 先求正交矩阵$V$:$A^TA=V\varSigma^TU^TU\varSigma V^T=V\left(\varSigma^T\varSigma\right)V^T$,所以$V$是矩阵$A^TA$的特征向量矩阵,而矩阵$\varSigma^T\varSigma$是矩阵$A^TA$的特征值矩阵,即$A^TA$的特征值为$\sigma^2$。 + + 接下来应该求正交矩阵$U$:$AA^T=U\varSigma^TV^TV\varSigma U^T=U\left(\varSigma^T\varSigma\right)U^T$,但是请注意,我们在这个式子中无法确定特征向量的符号,我们需要使用$Av_i=\sigma_iu_i$,通过已经求出的$v_i$来确定$u_i$的符号(因为$AV=U\varSigma$),进而求出$U$。 + + *已知$A=\bigg[u_1\ u_2\bigg]\begin{bmatrix}3&0\\0&2\end{bmatrix}\bigg[v_1\ v_2\bigg]^T$* + + 从已知的$\varSigma$矩阵可以看出,$A$矩阵是非奇异矩阵,因为它没有零奇异值。另外,如果把$\varSigma$矩阵中的$2$改成$-5$,则题目就不再是奇异值分解了,因为奇异值不可能为负;如果将$2$变为$0$,则$A$是奇异矩阵,它的秩为$1$,零空间为$1$维,$v_2$在其零空间中。 + +4. *$A$是正交对称矩阵,那么它的特征值具有什么特点*? + + 首先,对于对称矩阵,有特征值均为实数;然后是正交矩阵,直觉告诉我们$|\lambda|=1$。来证明一下,对于$Qx=\lambda x$,我们两边同时取模有$\|Qx\|=|\lambda|\|x\|$,而**正交矩阵不会改变向量长度**,所以有$\|x\|=|\lambda|\|x\|$,因此$\lambda=\pm1$。 + + *$A$是正定的吗?*并不一定,因为特征向量可以取$-1$。 + + *$A$的特征值没有重复吗?*不是,如果矩阵大于$2$阶则必定有重复特征值,因为只能取$\pm1$。 + + *$A$可以被对角化吗?*是的,任何对称矩阵、任何正交矩阵都可以被对角化。 + + *$A$是非奇异矩阵吗?*是的,正交矩阵都是非奇异矩阵。很明显它的特征值都不为零。 + + *证明$P=\frac{1}{2}(A+I)$是投影矩阵*。 + + 我们使用投影矩阵的性质验证,首先由于$A$是对称矩阵,则$P$一定是对称矩阵;接下来需要验证$P^2=P$,也就是$\frac{1}{4}\left(A^2+2A+I\right)=\frac{1}{2}(A+I)$。来看看$A^2$是什么,$A$是正交矩阵则$A^T=A^{-1}$,而$A$又是对称矩阵则$A=A^T=A^{-1}$,所以$A^2=I$。带入原式有$\frac{1}{4}(2A+2I)=\frac{1}{2}(A+I)$,得证。 + + 我们可以使用特征值验证,$A$的特征值可以取$\pm1$,则$A+I$的特征值可以取$0,2$,$\frac{1}{2}(A+I)$的特征值为$0,1$,特征值满足投影矩阵且它又是对称矩阵,得证。 diff --git a/docs/linalg/chapter34.md b/docs/linalg/chapter34.md new file mode 100644 index 00000000..6af0196b --- /dev/null +++ b/docs/linalg/chapter34.md @@ -0,0 +1,67 @@ + +# 第三十四讲:左右逆和伪逆 + +前面我们涉及到的逆(inverse)都是指左、右乘均成立的逆矩阵,即$A^{-1}A=I=AA^{-1}$。在这种情况下,$m\times n$矩阵$A$满足$m=n=rank(A)$,也就是满秩方阵。 + +## 左逆(left inserve) + +记得我们在最小二乘一讲(第十六讲)介绍过列满秩的情况,也就是列向量线性无关,但行向量通常不是线性无关的。常见的列满秩矩阵$A$满足$m>n=rank(A)$。 + +列满秩时,列向量线性无关,所以其零空间中只有零解,方程$Ax=b$可能有一个唯一解($b$在$A$的列空间中,此特解就是全部解,因为通常的特解可以通过零空间中的向量扩展出一组解集,而此时零空间只有列向量),也可能无解($b$不在$A$的列空间中)。 + +另外,此时行空间为$\mathbb{R}^n$,也正印证了与行空间互为正交补的零空间中只有列向量。 + +现在来观察$A^TA$,也就是在$m>n=rank(A)$的情况下,$n\times m$矩阵乘以$m\times n$矩阵,结果为一个满秩的$n\times n$矩阵,所以$A^TA$是一个可逆矩阵。也就是说$\underbrace{\left(A^TA\right)^{-1}A^T}A=I$成立,而大括号部分的$\left(A^TA\right)^{-1}A^T$称为长方形矩阵$A$的左逆 + +$$A^{-1}_{left}=\left(A^TA\right)^{-1}A^T$$ + +顺便复习一下最小二乘一讲,通过关键方程$A^TA\hat x=A^Tb$,$A^{-1}_{left}$被当做一个系数矩阵乘在$b$向量上,求得$b$向量投影在$A$的列空间之后的解$\hat x=\left(A^TA\right)^{-1}A^Tb$。如果我们强行给左逆左乘矩阵$A$,得到的矩阵就是投影矩阵$P=A\left(A^TA\right)^{-1}A^T$,来自$p=A\hat x=A\left(A^TA\right)^{-1}A^T$,它将右乘的向量$b$投影在矩阵$A$的列空间中。 + +再来观察$AA^T$矩阵,这是一个$m\times m$矩阵,秩为$rank(AA^T)=nm=rank(A)$。对称的,其左零空间中仅有零向量,即没有行向量的线性组合能够得到零向量。 + +行满秩时,矩阵的列空间将充满向量空间$C(A)=\mathbb{R}^m$,所以方程$Ax=b$总是有解集,由于消元后有$n-m$个自由变量,所以方程的零空间为$n-m$维。 + +与左逆对称,再来观察$AA^T$,在$n>m=rank(A)$的情况下,$m\times n$矩阵乘以$n\times m$矩阵,结果为一个满秩的$m\times m$矩阵,所以此时$AA^T$是一个满秩矩阵,也就是$AA^T$可逆。所以$A\underbrace{A^T\left(AA^T\right)}=I$,大括号部分的$A^T\left(AA^T\right)$称为长方形矩阵的右逆 + +$$A^{-1}_{right}=A^T\left(AA^T\right)$$ + +同样的,如果我们强行给右逆右乘矩阵$A$,将得到另一个投影矩阵$P=A^T\left(AA^T\right)A$,与上一个投影矩阵不同的是,这个矩阵的$A$全部变为$A^T$了。所以这是一个能够将右乘的向量$b$投影在$A$的行空间中。 + +前面我们提及了逆(方阵满秩),并讨论了左逆(矩阵列满秩)、右逆(矩阵行满秩),现在看一下第四种情况,$m\times n$矩阵$A$不满秩的情况。 + +## 伪逆(pseudo inverse) + +有$m\times n$矩阵$A$,满足$rank(A)\lt min(m,\ n)$,则 + +* 列空间$C(A)\in\mathbb{R}^m,\ \dim C(A)=r$,左零空间$N\left(A^T\right)\in\mathbb{R}^m,\ \dim N\left(A^T\right)=m-r$,列空间与左零空间互为正交补; +* 行空间$C\left(A^T\right)\in\mathbb{R}^n,\ \dim C\left(A^T\right)=r$,零空间$N(A)\in\mathbb{R}^n,\ \dim N(A)=n-r$,行空间与零空间互为正交补。 + +现在任取一个向量$x$,乘上$A$后结果$Ax$一定落在矩阵$A$的列空间$C(A)$中。而根据维数,$x\in\mathbb{R}^n,\ Ax\in\mathbb{R}^m$,那么我们现在猜测,输入向量$x$全部来自矩阵的行空间,而输出向量$Ax$全部来自矩阵的列空间,并且是一一对应的关系,也就是$\mathbb{R}^n$的$r$维子空间到$\mathbb{R}^m$的$r$维子空间的映射。 + +而矩阵$A$现在有这些零空间存在,其作用是将某些向量变为零向量,这样$\mathbb{R}^n$空间的所有向量都包含在行空间与零空间中,所有向量都能由行空间的分量和零空间的分量构成,变换将零空间的分量消除。但如果我们只看行空间中的向量,那就全部变换到列空间中了。 + +那么,我们现在只看行空间与列空间,在行空间中任取两个向量$x,\ y\in C(A^T)$,则有$Ax\neq Ay$。所以从行空间到列空间,变换$A$是个不错的映射,如果限制在这两个空间上,$A$可以说“是个可逆矩阵”,那么它的逆就称作伪逆,而这个伪逆的作用就是将列空间的向量一一映射到行空间中。通常,伪逆记作$A^+$,因此$Ax=(Ax),\ y=A^+(Ay)$。 + +现在我们来证明对于$x,y\in C\left(A^T\right),\ x\neq y$,有$Ax,Ay\in C(A),\ Ax\neq Ay$: + +* 反证法,设$Ax=Ay$,则有$A(x-y)=0$,即向量$x-y\in N(A)$; +* 另一方面,向量$x,y\in C\left(A^T\right)$,所以两者之差$x-y$向量也在$C\left(A^T\right)$中,即$x-y\in C\left(A^T\right)$; +* 此时满足这两个结论要求的仅有一个向量,即零向量同时属于这两个正交的向量空间,从而得到$x=y$,与题设中的条件矛盾,得证。 + +伪逆在统计学中非常有用,以前我们做最小二乘需要矩阵列满秩这一条件,只有矩阵列满秩才能保证$A^TA$是可逆矩阵,而统计中经常出现重复测试,会导致列向量线性相关,在这种情况下$A^TA$就成了奇异矩阵,这时候就需要伪逆。 + +接下来我们介绍如何计算伪逆$A^+$: + +其中一种方法是使用奇异值分解,$A=U\varSigma V^T$,其中的对角矩阵型为$\varSigma=\left[\begin{array}{c c c|c}\sigma_1&&&\\&\ddots&&\\&&\sigma_2&\\\hline&&&\begin{bmatrix}0\end{bmatrix}\end{array}\right]$,对角线非零的部分来自$A^TA,\ AA^T$比较好的部分,剩下的来自左/零空间。 + +我们先来看一下$\varSigma$矩阵的伪逆是多少,这是一个$m\times n$矩阵,$rank(\varSigma)=r$,$\varSigma^+=\left[\begin{array}{c c c|c}\frac{1}{\sigma_1}&&&\\&\ddots&&\\&&\frac{1}{\sigma_r}&\\\hline&&&\begin{bmatrix}0\end{bmatrix}\end{array}\right]$,伪逆与原矩阵有个小区别:这是一个$n\times m$矩阵。则有$\varSigma\varSigma^+=\left[\begin{array}{c c c|c}1&&&\\&\ddots&&\\&&1&\\\hline&&&\begin{bmatrix}0\end{bmatrix}\end{array}\right]_{m\times m}$,$\varSigma^+\varSigma=\left[\begin{array}{c c c|c}1&&&\\&\ddots&&\\&&1&\\\hline&&&\begin{bmatrix}0\end{bmatrix}\end{array}\right]_{n\times n}$。 + +观察$\varSigma\varSigma^+$和$\varSigma^+\varSigma$不难发现,$\varSigma\varSigma^+$是将向量投影到列空间上的投影矩阵,而$\varSigma^+\varSigma$是将向量投影到行空间上的投影矩阵。我们不论是左乘还是右乘伪逆,得到的不是单位矩阵,而是投影矩阵,该投影将向量带入比较好的空间(行空间和列空间,而不是左/零空间)。 + +接下来我们来求$A$的伪逆: + +$$A^+=V\varSigma^+U^T$$ diff --git a/docs/linalg/chapter35.md b/docs/linalg/chapter35.md new file mode 100644 index 00000000..79d5eb63 --- /dev/null +++ b/docs/linalg/chapter35.md @@ -0,0 +1,98 @@ + +# 第三十五讲:期末复习 + +依然是从以往的试题入手复习知识点。 + +1. *已知$m\times n$矩阵$A$,有$Ax=\begin{bmatrix}1\\0\\0\end{bmatrix}$无解;$Ax=\begin{bmatrix}0\\1\\0\end{bmatrix}$仅有唯一解,求关于$m,n,rank(A)$的信息。* + + 首先,最容易判断的是$m=3$;而根据第一个条件可知,矩阵不满秩,有$rn=r$。 + + *根据所求写出一个矩阵$A$的特例*:$A=\begin{bmatrix}0&0\\1&0\\0&1\end{bmatrix}$。 + + *$\det A^TA\stackrel{?}{=}\det AA^T$*:不相等,因为$A^TA$可逆而$AA^T$不可逆,所以行列式不相等。(但是对于方阵,$\det AB=\det BA$恒成立。) + + *$A^TA$可逆吗?*是,因为$r=n$,矩阵列向量线性无关,即列满秩。 + + *$AA^T$正定吗?*否,因为$AA^T$是$3\times n$矩阵与$n\times 3$矩阵之积,是一个三阶方阵,而$AA^T$秩为$2$,所以不是正定矩阵。(不过$AA^T$一定是半正定矩阵。) + + *求证$A^Ty=c$至少有一个解*:因为$A$的列向量线性无关,所以$A^T$的行向量线性无关,消元后每行都有主元,且总有自由变量,所以零空间中有非零向量,零空间维数是$m-r$(可以直接从$\dim N\left(A^T\right)=m-r$得到结论)。 + +2. *设$A=\Bigg[v_1\ v_2\ v_3\Bigg]$,对于$Ax=v_1-v_2+v_3$,求$x$。* + + 按列计算矩阵相乘,有$x=\begin{bmatrix}1\\-1\\1\end{bmatrix}$。 + + *若Ax=v_1-v_2+v_3=0,则解是唯一的吗?为什么。*如果解释唯一的,则零空间中只有零向量,而在此例中$x=\begin{bmatrix}1\\-1\\1\end{bmatrix}$就在零空间中,所以解不唯一。 + + *若$v_1,v_2,v_3$是标准正交向量,那么怎样的线性组合$c_1v_1+c_2v_2$能够最接近$v_3$?*此问是考察投影概念,由于是正交向量,所以只有$0$向量最接近$v_3$。 + +3. *矩阵$A=\begin{bmatrix}.2&.4&.3\\.4&.2&.3\\.4&.4&.4\end{bmatrix}$,求稳态。* + + 这是个马尔科夫矩阵,前两之和为第三列的两倍,奇异矩阵总有一个特征值为$0$,而马尔科夫矩阵总有一个特征值为$1$,剩下一个特征值从矩阵的迹得知为$-.2$。 + + 再看马尔科夫过程,设从$u(0)$开始,$u_k=A^ku_0, u_0=\begin{bmatrix}0\\10\\0\end{bmatrix}$。先代入特征值$\lambda_1=0,\ \lambda_2=1,\ \lambda_3=-.2$查看稳态$u_k=c_1\lambda_1^kx_1+c_2\lambda_2^kx_2+c_3\lambda_3^kx_3$,当$k\to\infty$,第一项与第三项都会消失,剩下$u_\infty=c_2x_2$。 + + 到这里我们只需求出$\lambda_2$对应的特征向量即可,带入特征值求解$(A-I)x=0$,有$\begin{bmatrix}-.8&.4&.3\\.4&-.8&.3\\.4&.4&-.6\end{bmatrix}\begin{bmatrix}?\\?\\?\end{bmatrix}=\begin{bmatrix}0\\0\\0\end{bmatrix}$,可以消元得,也可以直接观察得到$x_2=\begin{bmatrix}3\\3\\4\end{bmatrix}$。 + + 剩下就是求$c_2$了,可以通过$u_0$一一解出每个系数,但是这就需要解出每一个特征值。另一种方法,我们可以通过马尔科夫矩阵的特性知道,对于马尔科夫过程的每一个$u_k$都有其分量之和与初始值分量之和相等,所以对于$x_2=\begin{bmatrix}3\\3\\4\end{bmatrix}$,有$c_2=1$。所以最终结果是$u_\infty=\begin{bmatrix}3\\3\\4\end{bmatrix}$。 + +4. *对于二阶方阵,回答以下问题:* + + *求投影在直线$a=\begin{bmatrix}4\\-3\end{bmatrix}$上的投影矩阵*:应为$P=\frac{aa^T}{a^Ta}$。 + + *已知特征值$\lambda_1=2,\ x_1=\begin{bmatrix}1\\2\end{bmatrix}\quad \lambda_2=3,\ x_2=\begin{bmatrix}2\\1\end{bmatrix}$求原矩阵$A$*:从对角化公式得$A=S\Lambda S^{-1}=\begin{bmatrix}1&2\\2&1\end{bmatrix}\begin{bmatrix}0&0\\0&3\end{bmatrix}\begin{bmatrix}1&2\\2&1\end{bmatrix}^{-1}$,解之即可。 + + *$A$是一个实矩阵,且对任意矩阵$B$,$A$都不能分解成$A=B^TB$,给出$A$的一个例子*:我们知道$B^TB$是对称的,所以给出一个非对称矩阵即可。 + *矩阵$A$有正交的特征向量,但不是对称的,给出一个$A$的例子*:我们在三十三讲提到过,反对称矩阵,因为满足$AA^T=A^TA$而同样具有正交的特征向量,所以有$A=\begin{bmatrix}0&1\\-1&0\end{bmatrix}$或旋转矩阵$\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{bmatrix}$,这些矩阵都具有复数域上的正交特征向量组。 + +5. *最小二乘问题,因为时间的关系直接写出计算式和答案,$\begin{bmatrix}1&0\\1&1\\1&2\end{bmatrix}\begin{bmatrix}C\\D\end{bmatrix}=\begin{bmatrix}3\\4\\1\end{bmatrix}(Ax=b)$,解得$\begin{bmatrix}\hat C\\\hat D\end{bmatrix}=\begin{bmatrix}\frac{11}{3}\\-1\end{bmatrix}$。* + + *求投影后的向量$p$*:向量$p$就是向量$b$在矩阵$A$列空间中的投影,所以$p=\begin{bmatrix}p_1\\p_2\\p_3\end{bmatrix}=\begin{bmatrix}1&0\\1&1\\1&2\end{bmatrix}\begin{bmatrix}\hat C\\\hat D\end{bmatrix}$。 + + *求拟合直线的图像*:$x=0,1,2$时$y=p_1,p_2,p_2$所在的直线的图像,$y=\hat C+\hat Dx$即$y=\frac{11}{3}-x$。 + + +```python +%matplotlib inline +import matplotlib.pyplot as plt +from sklearn import linear_model +import numpy as np +import pandas as pd +import seaborn as sns + +x = np.array([0, 1, 2]).reshape((-1,1)) +y = np.array([3, 4, 1]).reshape((-1,1)) +predict_line = np.array([-1, 4]).reshape((-1,1)) + +regr = linear_model.LinearRegression() +regr.fit(x, y) +ey = regr.predict(x) + +fig = plt.figure() +plt.axis('equal') +plt.axhline(y=0, c='black') +plt.axvline(x=0, c='black') + +plt.scatter(x, y, c='r') +plt.scatter(x, regr.predict(x), s=20, c='b') +plt.plot(predict_line, regr.predict(predict_line), c='g', lw='1') +[ plt.plot([x[i], x[i]], [y[i], ey[i]], 'r', lw='1') for i in range(len(x))] + +plt.draw() +``` + + +![png](img/chapter35_1_0.png) + + + +```python +plt.close(fig) +``` + +* 接上面的题目 + + *求一个向量$b$使得最小二乘求得的$\begin{bmatrix}\hat C\\\hat D\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}$*:我们知道最小二乘求出的向量$\begin{bmatrix}\hat C\\\hat D\end{bmatrix}$使得$A$列向量的线性组合最接近$b$向量(即$b$在$A$列空间中的投影),如果这个线性组合为$0$向量(即投影为$0$),则$b$向量与$A$的列空间正交,所以可以取$b=\begin{bmatrix}1\\-2\\1\end{bmatrix}$同时正交于$A$的两个列向量。 + +# MIT线性代数的全部课程到此结束 diff --git a/docs/linalg/img/chapter01_1_0.png b/docs/linalg/img/chapter01_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..54250bb2b52d4bf25c8b407d096b15534f87724c GIT binary patch literal 8688 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 literal 0 HcmV?d00001 diff --git a/docs/linalg/img/chapter01_4_0.png b/docs/linalg/img/chapter01_4_0.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8f0ac6f19b56b29f424824faa7a46a72930b19 GIT binary patch literal 11244 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 literal 0 HcmV?d00001 diff --git a/docs/linalg/img/chapter12_1_0.png b/docs/linalg/img/chapter12_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..78226a540e776cb554cd165d25f5ab8e9e1eeb73 GIT binary patch literal 12845 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 A!vFvP literal 0 HcmV?d00001 diff --git a/docs/linalg/img/chapter12_3_0.png b/docs/linalg/img/chapter12_3_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f5dfb41b0c04a486305a4596d8c17c13000709dc GIT binary patch literal 15487 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 literal 0 HcmV?d00001 diff --git a/docs/linalg/img/chapter15_1_0.png b/docs/linalg/img/chapter15_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f109fe659793b7a3c594a5596a847a311f7b209f GIT binary patch literal 9968 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%0AldFTWBTadJ~;!Rbas3 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 literal 0 HcmV?d00001 diff --git a/docs/linalg/img/chapter15_4_0.png b/docs/linalg/img/chapter15_4_0.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0ea33fdcbe9827662611c2323cda7321d3055e GIT binary patch literal 7783 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 VPnsr(gOg&2p`NjB>A73K{|9Fnmf!#Y literal 0 HcmV?d00001 diff --git a/docs/linalg/img/chapter16_1_0.png b/docs/linalg/img/chapter16_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f74e4c38ff078250101f18f26d39acc8965410dc GIT binary patch literal 10930 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 A-2eap literal 0 HcmV?d00001 diff --git a/docs/linalg/img/chapter31_1_0.png b/docs/linalg/img/chapter31_1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1725d9b4e6ca24be36afc081bcc2e21152ed2c50 GIT binary patch literal 25744 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%0A7E;l`z?|2&7^=yL;l6m=gc_I_B|>1 zOiWBfRau{^PJj(713kp_s2qfE_THLJK?xW**aY7wWdV+?)%Nr&2s3m8@Hw3B8>86NzF0)r)oJXQuXC2^%Qu#t7<-w2F!yn2l&goV+l{7Nq64sWJ9uE?jdLC zwgR1hW_`5Kdh-uK3JxqX-3H0PQz~^HdL}0Ei(=X52d6*5Q3Y26-~RX6LbcaP#*q@> z6_iP&^rr;UqN0h;C%frePpMK$oQ^idk1$YCXZKh7&tW66b8<3*3>3M`Q|%@M4qmE6 zbe%An%Z;yPXQ1(|d#yLwa&RW915jx~25Wu1I0%}x0;uXBi`+QhD%Jb&A!KGrRZOgn zTJP!e=c`^zsyQmTZVqQhNAcbBXIs_M(TqAHMMik}`T0=r_QH=`E}dQDK^3hEyEqwk zA67%J86L(1@gKSx)a^dYOP)0(Kz|p_$}51EPp~uL+*w*BB-dau6P=_s7BR@h^P zsq#7(M~-k~UW3T)uD9iMbyOssF#lfWu2d{Lw7cgXa+y!Kxnlt%-W2LeO2u)$hEuVf zg@18zpz+!f>~E#Ol%h3(~y4Gp04kyV(Ni-kW2Aw>YO`H+U-llD0gz;lwIb3rsG zuRLz`=4lGN0H(2$(Ad#Ib8s^eZ0#(C{Ok6t<`6*k zat9))NZ$d%B%F)f`s8NTqVHO?V6!%WgvMS)VV9C=a(S+EjQ#( zYmA|m&ly;#mI8AKybKN`uvozG#sq;T*&$&`?MO)ml=4+U-_rfDH3tmOiaLKxl>hD1>v(Bpt(T}KWa;gfqS=ecnIo?B0@L#{{4I8<&XBz zr*{i=J3rKU-hpOF)6_IDAz=!wmas zw#FTq0Q47#M1Wm7ySOL>NV_~*_%xDEJr(wA7}eXR<(%8p`|XpH@tXDC`EY1}Vand! zcbc%;m{Pwws!kxY{sqmBe3ul!WfZFkAv9PIVa3wR-PMcEVH5N~kOqDS9#UGxeFGjZ zD0=9K&B8Wr1-BRxaRb?C8@L@D)+i3EMQXFF^DACn-Y`0KQX-<5fnq;I{^EEC%urjQ zq~15F5(MCnL@jC!et(6m+Y$8&8gfLSgU4|n?3g;xDS{#P2Q6!-{G=Hi50w)0YbiLO z*f%#c%zH_*a}SqTXf*|re1VlRVuDtFc3~m>G)gj#GaLxF_Hw?{gwgB%R7tQZ`G5?e z0R%A{4xn&xaY4Ys!rD3+N-!+UqL=C^uvbkuARVzBp+}QWbO#^Hmex#$vIs!WN;VqK zfkRz&x|%tB8Ju$0QuGzM=dl~~Q5w)~rkDTnYI$COh$C@3-L<{Cya2_zrbk8)^P%#; zG0viup=}K45AlZAcLG$__0jaK(XcLp1bzIO-LShGp_cRv;J2OSq5)XJEEUf z-N?v@o0}W4FM%Wjt8FuVPG0ag6E0k~5Cc6`s#IJ?5Dg-3jnJmP@;M>2ssGZV{?D%V z|Gx(d(ZkK4MS!k+0YE@8P8cP)5dzKh6)GzeFOzzwH#Q`zoKNQ9tmkhv;gU}Iwo2)9{+xR;PX2HRT$Xw_-UBhMCo#_ri_5Osx&*B^Q40_2doyE8@6 z*T(EFP;Va$o4^aus=JPUg;YL1v$C9Mp)(L7Y3QO1M)Jr3PCK{xX=%|aZSu0T*H2zD zu71j2>Mv%4z}7ZCp_7nSXJk}V3#fC5Qw63ovvusd;auSYjaromnmdWm#efCo_uFKg zaAWQ`73LaNZKi$|7K%@tSA&oPnvFJub8zU?&Wq5pK*4GbN*HvJCCUFq(=bsUgaPtq zQ|u1pWkKFUgx0X|(ip5`hZz@}w>ey@qqJ?~16(3%kKMYPqPD=%0DGST+(9POKY~DW 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 YrHb>Ai$1 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ۤ{K9rrDEEuvh=oCbY-ml_0s*&f!PQ?Nt zyqGC*{D$uC-Mb4)N-Uk6@+5+%lxW;cG>Y>>OK!vAC~QK_Gt{z`pU1+GYiWLAp;5ixw7H>S z^cf?g-r?cN1vkXz2!?vE$Mt4We&>RkHg#}l#nRHUprWFiZiNW9@Ckcu&pXIo3$N;o z6bT{SM%dr!6Ho+R6lY=#lTCOh$h%Cos2CUrkN6^p;!Fda2j+K5laR89#s%Hz;WLW=RKH~}j66ah7moIY~U z_LaTzkk%u?Qu7Ia(>o?e#Tl*g=FGlLa zqzr?6+D?eutmVp`g}jW6Q5)kXE3JtLurekhL}086tmBOquEo)~r4E8ogE`(;K?@6u zfwVviGa>X!(Ydg57hwJ&kcuE(xv;E2L6u|U!Pq057<_~{g9DF7>7_s+@D|ivpzcKJ z3A0pwd;~Ad-HI0e4g4p76Qy?vNKbW${G71VI0lafGSv_*d=mU8KoF&82CS!gM1EZs z%#TO2*xUdEn+a?)V3UB226z^OXQn^=BTiIA#KPR1_E{dmy0N25)Ee~KQYVZP*khxn znKOfx`du17V>MT&l=qLLs4{;~>k_kT+QYIt;|ohPHBpiFgYlkze${?6U+90zBLr52 zsj8^fORTC`S`PAGKhf_bMV^xxZX^7hpa0z5ePn93>yO$~2M=aVX{NDEoX#({BjV*H zOI>qp-x2bx>th1l;WUYDfUL6;_Gx%G{%#E99R*{+U9<$|-` z(-DR7@va`YB$?-*ZoaGzbqV6pM>{I4uPa$u%3@p}+-AJ4GO06CO243MZfriBl>fFb z2^aKgX}mG>xeUj|)T^f-4KJMx@Zc;H^zm2@*J)zJwO)xHOTdlaf^gL@FK`O_~Ro5Ep;DqweII5!MK+)d&qO)5wz6~&(QOC`NVIy2qIo+ zRAfKoZ^$iO;#a8YwDJ7-0JvJrb+oXZE&+v>032>3Q=9m8FTmF^_y7)o$OeBQ7i_{BU0Us7Ux_$i8S{_!y5A`75{p8N()K$5N%qU#}h_m0vRM!Y!w1 zuFai-Y`~>GSt0d=Z$VEbO8WqYI#)jRdjGiIEw6*l@Q6OoD?K;6At%=Gj3KZL`r+xsUbKHt~~wX$4` zTUcN2DuW^dOd2e)$3ac{fNR~&{L_h>c18^J_rM3YUkbik3(_;GUSRg_N?o{XD6+b& zF7QgR$JINL(l@`{Xdk^KIuRw+_>h7{Vo%^k7IR;L!sP5hg`jN?)P0eL<$TH zJmE7IyN#QBZ}g55L~5%Vrn^!5@1uB+Qe|U zTcRn3N(IxP%AnPRp@wJjpq8{)ur6^OEQ@H$kKcp{L3Kb6WUyc{)RH8?C~e|8%QCbv z_)TDAq-r>8RjjWENb`&>g+&MS#2&r|71baBF@_%U^{P#_U|Nl&*1Eks4KjY=(Hia^ltZUl)HQ~yu>Cw_|BE68VB zc9_1%&epwi=gtZLnKb$Xfw6H{@3t#S7cN}Lhdd`IC+8RQTY^bKQdwjq=fk9=6bYF< zAt52wjiC*eMVB%qH|Fl12%OKRKX99zo$b#xc~V7Kxlw$nTt_lw;Q=hyH#%BU=QCcA zpZ{**z}CyJZstQWa>3fVz~srX#}fO0t1g`uyV>}ww{+p-sqOhyRTd^DCIv5En3_r)O zrYY#}?KWkNXrFVl0dR%Wb!nA43emp3xiTCX|_ zzarE^DH3hfsi`84*RD-`y(`&QSW0pUN{fJ7&Mzu5{+9;g%y8JI0OO%7SgJ8RtE)p{ zn{&grDTP9%+WWt94ichYC-XOH0$W!6G()m2v? zgI|q4=#KavS%21xG`+ABf;p*nX15_*C>$}6Zs@H zi&*Vc=zu{*d(PA};rXW*^l||m!nXlZNIe+JOUHJ>)+)R=g$^BS#blbS~gBpwV<~4 z68KUKk{%;Rl b#paf+;SmCOb$xy4k|Tzv&+3-w;BWs03pdFZ literal 0 HcmV?d00001 diff --git a/docs/linalg/img/graph_12.png b/docs/linalg/img/graph_12.png new file mode 100644 index 0000000000000000000000000000000000000000..bf93b754c19447a6fce0c954322c6138a7e51f2a GIT binary patch literal 13386 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 literal 0 HcmV?d00001 diff --git a/docs/linalg/img/graph_15_1.png b/docs/linalg/img/graph_15_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f109fe659793b7a3c594a5596a847a311f7b209f GIT binary patch literal 9968 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%0AldFTWBTadJ~;!Rbas3 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 literal 0 HcmV?d00001 diff --git a/docs/linalg/img/graph_15_2.png b/docs/linalg/img/graph_15_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ab0ea33fdcbe9827662611c2323cda7321d3055e GIT binary patch literal 7783 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 VPnsr(gOg&2p`NjB>A73K{|9Fnmf!#Y literal 0 HcmV?d00001 diff --git a/docs/linalg/img/graph_16_1.png b/docs/linalg/img/graph_16_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb3db914ba56a3ee6cfce7eb19693c0dcee6d65 GIT binary patch literal 11025 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