应用数学基础
本章对应Ian经典教材的第二章:线性代数,第三章:概率与信息论。
附:Excersize
Ex.1 线性代数练习
在上面我们已经知道线性代数在机器学习中的作用了。简单来说就是当我们有一个输入vector后,如果我们能找到一个合适的矩阵A,那么我们就能得到一个结果vector。
练习1:Prove that \(A^{T}A\) is symmetric for any \(A \in\mathbb{R}^{m \times n}\)
\(A^T\)的意思是矩阵的转置(Transpose),操作就是把一个矩阵的行和列互换,比如:
$$ A = \begin{bmatrix}
1 & 2 & 3 \
4 & 5 & 6
\end{bmatrix} $$
transpose后:
$$ A^T = \begin{bmatrix}
1 & 4 \
2 & 5 \
3 & 6
\end{bmatrix} $$
然后\(A \in \mathbb{R}^{m \times n}\)的意思是矩阵A的归属是实数(Real Numbers),然后行数x列数为\(m*n\)。组合起来就是说A是一个m行n列的矩阵,并且矩阵中的所有元素都是实数。
对于两个矩阵的乘法,计算过程就是用第一个矩阵的第一行,先和第二个矩阵的每一列相乘,得到新的矩阵的第一行;然后用第一个矩阵的第二行,再依次和第二个矩阵的每一列相乘,得到新的矩阵的第二行。也就是说新的矩阵的行数,等于第一个矩阵的行数;新的矩阵的列数,等于第二个矩阵的列数。因此矩阵的乘法是不可交换的,A x B,和B x A,是两个不同的计算过程。
我们拿上述的A和A^T来试算一下:
$$ A^T A =
\begin{bmatrix}
1 & 4 \
2 & 5 \
3 & 6
\end{bmatrix}
\begin{bmatrix}
1 & 2 & 3 \
4 & 5 & 6
\end{bmatrix} $$
计算过程:
$$ \begin{aligned}
(A^T A)_{11} &= 1\cdot1 + 4\cdot4 = 1 + 16 = 17 \
(A^T A)_{12} &= 1\cdot2 + 4\cdot5 = 2 + 20 = 22 \
(A^T A)_{13} &= 1\cdot3 + 4\cdot6 = 3 + 24 = 27 \
(A^T A)_{21} &= 2\cdot1 + 5\cdot4 = 2 + 20 = 22 \
(A^T A)_{22} &= 2\cdot2 + 5\cdot5 = 4 + 25 = 29 \
(A^T A)_{23} &= 2\cdot3 + 5\cdot6 = 6 + 30 = 36 \
(A^T A)_{31} &= 3\cdot1 + 6\cdot4 = 3 + 24 = 27 \
(A^T A)_{32} &= 3\cdot2 + 6\cdot5 = 6 + 30 = 36 \
(A^T A)_{33} &= 3\cdot3 + 6\cdot6 = 9 + 36 = 45
\end{aligned} $$
得到结果:
$$ A^T A =
\begin{bmatrix}
17 & 22 & 27 \
22 & 29 & 36 \
27 & 36 & 45
\end{bmatrix} $$
请注意观察 :
- 元素(1,2) 和 元素(2,1) 都是 22。
- 元素(1,3) 和 元素(3,1) 都是 27。
- 元素(2,3) 和 元素(3,2) 都是 36。
这个矩阵沿着对角线是完美对称的,也就是题目中所问的symmetric。
我们现在反过来,算一下A * A^T:
$$ A A^T =
\begin{bmatrix}
1 & 2 & 3 \
4 & 5 & 6
\end{bmatrix}
\begin{bmatrix}
1 & 4 \
2 & 5 \
3 & 6
\end{bmatrix} $$
逐项计算:
$$ \begin{aligned}
(AA^T)_{11} &= 1\cdot1 + 2\cdot2 + 3\cdot3 = 1 + 4 + 9 = 14 \
(AA^T)_{12} &= 1\cdot4 + 2\cdot5 + 3\cdot6 = 4 + 10 + 18 = 32 \
(AA^T)_{21} &= 4\cdot1 + 5\cdot2 + 6\cdot3 = 4 + 10 + 18 = 32 \
(AA^T)_{22} &= 4\cdot4 + 5\cdot5 + 6\cdot6 = 16 + 25 + 36 = 77
\end{aligned} $$
最终结果:
$$ A A^T =
\begin{bmatrix}
14 & 32 \
32 & 77
\end{bmatrix} $$
这个结果也是对称的,但是结果却不同。
我们要关注两件事情:
1.结果是对称的
2.先后顺序在机器学习中的应用
首先,结果是对称的,说明两个矩阵的关系是相互的。即:
- 矩阵
S的元素S[i, j]代表了 “事物i” 与 “事物j” 的关系。 - 矩阵
S的元素S[j, i]代表了 “事物j” 与 “事物i” 的关系。
对称性 S[i, j] = S[j, i] 就意味着:
i对j的影响/关系,和j对i的影响/关系是完全一样的。
也就是说:
- 如果一个矩阵描述的是“城市间的飞行距离”,那它必然是对称的。纽约到波士顿的距离,等于波士顿到纽约的距离。
- 如果一个矩阵描述的是“特征间的相关性”,那它必然是对称的。“身高”与“体重”的相关性,和“体重”与“身高”的相关性是同一个数值。
这个特性是我们用来衡量两个特征之间相关性的标准方法。
其次,假如A矩阵代表的是数据集矩阵,其每一行代表一个数据样本,比如一个病人、一栋房子、一朵花,那m行就代表我们有m个样本。然后A的每一列代表一个特征,比如房子的面积、卧室的数量,那么我们就有了n个 特征。
对于\(m*n\)的矩阵A,\(A^TA\)的含义是feature correclation matrix特征相关性矩阵,其结果是一个\(n*n\)的新矩阵,这个新矩阵衡量的是n个特征两两之间的关系。这种用法常在Linear Regression线性回归和PCA主成分分析中使用。简单来说,就是告诉我们数据集的特征之间是如何相互关联的,这是分析数据结构的基础。
而对于\(AA^T\),我们将得到一个\(m*m\)的新矩阵。这个新矩阵衡量的是样本两两之间的关系,因此视角是以样本为中心的。别忘了,我们刚才说过,m行代表的是m个样本。那么利用这种结果,我们可以找到两个样本之间特征是否相似。这个在SVMs支持向量机、Kernel Methods核方法、Clustering聚类分析中使用的比较多。
好,那现在我们理解了对称性和矩阵乘法在机器学习中的作用后,我们再来证明一下该命题。利用乘积的转置法则和转置的转置法则,我们可以得到:
练习2:
考虑以下矩阵,请找出B的singular values(奇异值):
$$ B = \begin{bmatrix}
1 & 0 \
0 & 2 \
2 & 1
\end{bmatrix} $$
singular values是线性代数中极其重要的概念,这个值能快速提取出一个矩阵的重要核心信息。比如说,你喝了一杯很好喝的鸡尾酒,假设这个鸡尾酒就是上面这个B,那么你一定想要知道这个鸡尾酒的配方是什么。比如这个鸡尾酒有如下风味:
- 风味A:香甜
- 风味B:酸涩
- 风味C:清凉
然后你给这些风味打分:
- 香甜:10分
- 酸涩:7分
- 清凉:1分
这几个分数,就是奇异值!其中香甜是这杯鸡尾酒最大的特征,其次是酸涩和清凉。换句话说,奇异值就是一个复杂事务(如一个矩阵、一张图片、一杯鸡尾酒)中各个核心组成部分的重要性排名。
以上面的矩阵B为例,他的奇异值如下:
- \(\sigma_{1} = \sqrt{7}\)
- \(\sigma_{2} = \sqrt{3}\)
这两个抽象的sigma,揭示了B矩阵这个变换的核心本质。其意义包括:
- 几何上的意义:B将二维空间 的单位圆变换成三维空间的椭圆的时候的最大和最小的 拉伸比例
- 信息的重要性和降维:如果B是一个数据集,那么第一个奇异值将代表数据的主要变化和信息
- 用途:按\(\sigma_1\)进行数据压缩,可以保留B矩阵最核心的特征
具体的用途在之后遇到时我们再详细讲解。
奇异值计算步骤通常是:
- 计算 B 的转置矩阵 BT。
- 计算 BT 与 B 的乘积,得到一个新的方阵 (BTB)。
- 计算矩阵 BTB 的特征值 (eigenvalues)。
- 将这些特征值取正平方根,得到的结果就是矩阵 B 的奇异值。
那么对于矩阵B,其转置矩阵与B的乘积:
$$ B^T B =
\begin{bmatrix}
1 & 0 & 2 \
0 & 2 & 1
\end{bmatrix}
\begin{bmatrix}
1 & 0 \
0 & 2 \
2 & 1
\end{bmatrix} $$
计算得到:
$$ \begin{bmatrix}
1\cdot1 + 0\cdot0 + 2\cdot2 & 1\cdot0 + 0\cdot2 + 2\cdot1 \
0\cdot1 + 2\cdot0 + 1\cdot2 & 0\cdot0 + 2\cdot2 + 1\cdot1
\end{bmatrix}
=
\begin{bmatrix}
5 & 2 \
2 & 5
\end{bmatrix} $$
用这个结果代入矩阵的characteristic polynomial特征多项式:
这里的p是polynomial多项式的首字母缩写,一般代表多项式。lambda是eigenvalue特征值,在这里作为一个变量存在。
这里的det是Determinant的缩写,中文是行列式。行列式是作用于一个行数和列数相等的矩阵的函数,他会计算出一个标量。这个标量浓缩了关于这个矩阵变换的很多重要信息。正因如此,我们才在一开始需要通过计算B转置和B的乘积,来得到一个方阵。
对于一个2x2的矩阵,det就是主对角线(从左上角到右下角)上元素的乘积,减去副对角线上元素的乘积。3x3和更大的矩阵,则需要更多不同的技巧,这里就不赘述了。我们只要记住,我们可以用det操作得到一个方阵的特征多项式并找到这个方阵的奇异值就可以了。具体的计算我们可以依赖NumPy库来完成:
import numpy as np
M = np.array([
[4, 2, 1, 0],
[1, 3, 2, 1],
[0, 1, 5, 2],
[2, 3, 1, 1]
])
# 3. 调用 np.linalg.det() 函数计算行列式
# 无论矩阵是2x2, 4x4, 还是100x100,调用的函数都是同一个
determinant_value = np.linalg.det(M)
# 4. 打印出原始矩阵和计算结果
print("创建的4x4矩阵 M:")
print(M)
print("\n计算出的行列式 det(M):")
print(determinant_value)
其中\(I\)是单位矩阵,我们现在可以得到这个特征多项式了:
$$ \det !\left(
\begin{bmatrix}
5 & 2 \
2 & 5
\end{bmatrix}
- \lambda
\begin{bmatrix}
1 & 0 \
0 & 1
\end{bmatrix}
\right)
=
\det !\begin{bmatrix}
5 - \lambda & 2 \
2 & 5 - \lambda
\end{bmatrix} $$
得到该特征多项式后,我们可以把让该多项式等于0,即可得到特征多项式的特征值:
得到两个特征值后,我们就可以得到奇异值了。奇异值是两个特征值的平方根(严格来说,奇异值是\(A^TA\)的特征值开方,而对于对称正定矩阵,\(A^TA=A^2\),所以奇异值就是特征值的正平方根),因此:
$$ \sigma_1 = \sqrt{\lambda_1} = \sqrt{7},
\quad
\sigma_2 = \sqrt{\lambda_2} = \sqrt{3} $$
Ex.2 链式法则练习
练习1: Consider the function
where
$$ a, b \in\mathbb{R},
\quad
\sigma(t) = \frac{1}{1 + e^{-t}} \quad for
\quad t \in\mathbb{R}. $$
首先我们来看一下这个函数f(x, y) = σ(ax + by),这是一个接收x和y两个变量作为输入的函数。他的计算过程是两步:
- 先计算
ax + by。这在机器学习里叫做输入的 线性组合 (a和b可以看作是权重)。 - 然后将这个结果作为输入,传递给另一个函数
σ。σ在这里被称为 激活函数 (Activation Function) 。
然后再看一下 σ(t),这个函数有一个非常著名的名字,叫 Sigmoid 函数 ,也叫 Logistic 函数。它的作用是把任何一个实数 t(无论多大或多小)都压缩到 (0, 1) 这个区间内。因为这个特性,它经常在机器学习中被用来表示概率。
所以,整个函数 f(x,y) 的意思就是:接收输入 x 和 y,用权重 a 和 b 进行加权求和,然后用 Sigmoid 函数处理这个和,得到一个 0到1 之间的最终输出。
(a) Show that
解答:
$$ \frac{d}{dt}\sigma(t)
= \frac{d}{dt}\left(\frac{1}{1+e^{-t}}\right) $$
这个结论在机器学习中非常有名且非常常用,因为它让求导(也就是求梯度)变得非常方便。
(b) Using the result you showed in part(a) and the chain rule, compute \(\frac{\partial f}{\partial x}\) and \(\frac{\partial f}{\partial y}\).
我们来计算函数 \(f(x, y) = \sigma(ax + by)\) 对 \(x\) 和 \(y\) 的偏导数。
首先计算 \(\frac{\partial f}{\partial x}\)。这是一个复合函数,为了应用链式法则,我们视内层的线性部分 \(ax + by\) 为一个整体,并记作 \(z\)。这样函数就变成了 \(f = \sigma(z)\)。
根据链式法则,\(f\) 对 \(x\) 的导数等于外层函数对 \(z\) 的导数与内层函数对 \(x\) 的导数的乘积:
$$ \frac{\partial f}{\partial x}
= \frac{d\sigma}{dz} \cdot\frac{\partial z}{\partial x} $$
我们知道第一问的结论是 \(\frac{d\sigma}{dz} = \sigma(z)\big(1 - \sigma(z)\big)\),同时,内层函数对 \(x\) 的偏导数是 \(\frac{\partial z}{\partial x} = a\)。
将这两部分相乘,我们得到:
$$ \frac{\partial f}{\partial x}
= \sigma(z)\big(1 - \sigma(z)\big) \cdot a $$
最后,我们将 \(z = ax + by\) 代回,并整理成您提供的最终格式:
$$ \frac{\partial f}{\partial x}
= \boxed{a \, \sigma(ax + by)\big[1 - \sigma(ax + by)\big]} $$
计算对 \(y\) 的偏导数 \(\frac{\partial f}{\partial y}\) 的过程完全同理。链式法则的应用如下:
$$ \frac{\partial f}{\partial y}
= \frac{d\sigma}{dz} \cdot\frac{\partial z}{\partial y} $$
其中,外层函数的导数部分不变,我们只需计算内层函数对 \(y\) 的偏导数,即 \(\frac{\partial z}{\partial y} = b\)。
将它们相乘得到:
$$ \frac{\partial f}{\partial y}
= \sigma(z)\big(1 - \sigma(z)\big) \cdot b $$
同样地,将 \(z = ax + by\) 代回,我们得到关于 \(y\) 的最终偏导数:
$$ \frac{\partial f}{\partial y}
= \boxed{b \, \sigma(ax + by)\big[1 - \sigma(ax + by)\big]} $$
练习2:
For
$$ \mathbf{x} =
\begin{bmatrix}
x_{1} \
\vdots \
x_{n}
\end{bmatrix}
\in\mathbb{R}^n $$
define
Compute the partial derivative \(\frac{\partial r}{\partial x_i}\) for a generic coordinate \(i \in \{1, \ldots, n\}\)
解答:
这道题定义了一个向量x,该向量由n个分量组成。然后定义了一个函数r(x),其计算方式是将向量x的每一个分量都进行平方,然后将所有结果相加。数学表达式为:
$$ r(\mathbf{x}) = \sum_{j=1}^{n} x_j^2
= x_1^2 + x_2^2 + \cdots + x_n^2 $$
这个函数实际上计算的是向量 x 的欧几里得范数(即向量长度)的平方。
而题目要求我们来计算函数r相对于其任意一个分量\(x_i\)的偏导数(partial derivative)。
在计算偏导数\(\frac{\partial r}{\partial x_i}\)的时候,我们要将除了\(x_i\)之外的其他所有分量都当作常数来处理,因此对于上述展开的r(x),很显然,如果除了\(x_i\)之外的其他分量都被视为常数,那么这些常数在求导的过程中会变为0,也即:
$$ \frac{\partial}{\partial x_i}(x_j^2) = 0
\quad (\text{对于所有 } j \ne i) $$
那么根据幂函数的求导法则($\frac{d}{dx} x^k = k x^{k-1} $),我们可以得到
由于其他项都是0,因此:
练习3:
Let $\mathbf{w} \in\mathbb{R}^n $ be a constant vector and define the scalar function
$$ s(\mathbf{x}) = \mathbf{w}^\top\mathbf{x}
= \sum_{j=1}^{n} w_j x_j $$
Compute \(\frac{\partial s}{\partial x_i}\) for a generic coordinate \(i \in \{1, \ldots, n\}\)
解答:
这道题的意思就是给你一个固定的 n 维向量 w 和一个变量 n 维向量 x 。用这两个向量的点积定义了一个函数 s(x)。现在请你求出这个函数 s 相对于变量向量 x 的第 i 个分量 xi 的偏导数。
比如假设 n=3,那么:
*\(w=w1,w2,w3\)(三个固定的数)
- \(x=x1,x2,x3\) (三个变量)
- \(s(\mathbf{x}) = w_1 x_1 + w_2 x_2 + w_3 x_3\)
我们要求的就是用一个通用的表达式来代表\(\frac{\partial s}{\partial x_i}\)。
那么对于这种题,其实我们把函数s(x)展开来写就很清晰了:
现在对上面展开的式子求导:
利用导数的加法法则,我们可以对每一项分别求导:
$$ \frac{\partial s}{\partial x_i}
= \frac{\partial}{\partial x_i}(w_1 x_1)
-
\frac{\partial}{\partial x_i}(w_2 x_2)
-
\cdots
-
\frac{\partial}{\partial x_i}(w_i x_i)
-
\cdots
-
\frac{\partial}{\partial x_i}(w_n x_n) $$
和练习2类似,当我们对wi求导的时候,非wi的项目在求导中都被视为常数,因此求导后是0.
而对于wi的目标项,可以得到:
$$ \frac{\partial}{\partial x_i}(w_i x_i)
= w_i \cdot\frac{\partial}{\partial x_i}(x_i)
= w_i \cdot1
= w_i $$
所以:
Ex.3 概率论练习
An incoming email is spam with prior \(p(S)=0.2\) and not spam with \(p(\bar{S}) = 0.8\).
Two independent filters flag spam:
annd \(F_1, F_2\) are inndependent given the class \((S or \bar{S})\).
(a) What is the probability that both filters flag an email as spam?
首先,我们把题目给出的所有信息翻译成通俗的语言:
p(S) = 0.2: "S" 代表 "Spam" (垃圾邮件)。这句话的意思是,在没有任何其他信息的情况下,一封随机收到的邮件是 垃圾邮件的概率为20% 。这是 先验概率* 。
p(S̄) = 0.8: "S̄" 代表 "Not Spam" (非垃圾邮件)。一封邮件 不是垃圾邮件的概率为80%* 。同样是先验概率。
接下来是关于两个垃圾邮件过滤器(Filter 1 和 Filter 2)的信息:
p(F₁=1 | S) = 0.9: F₁=1 表示“过滤器1将邮件标记为垃圾邮件”。这句话的意思是:如果一封邮件确实是*垃圾邮件,那么过滤器1有90%的概率能正确地把它标记出来(这是过滤器1的“召回率”或“真阳性率”)。
p(F₁=1 | S̄) = 0.1: 如果一封邮件不是*垃圾邮件,过滤器1仍然有10%的概率会错误地把它标记为垃圾邮件(这是过滤器1的“假阳性率”)。
p(F₂=1 | S) = 0.8: 如果一封邮件确实是*垃圾邮件,过滤器2有80%的概率能正确标记它。
p(F₂=1 | S̄) = 0.05: 如果一封邮件不是*垃圾邮件,过滤器2有5%的概率会错误标记它。
最后一句关键信息:
F₁, F₂ are independent given the class (S or S̄): 这叫做 条件独立 。意思是:一旦我们确定了一封邮件的真实类别(是垃圾邮件,或不是),那么两个过滤器的判断就 互不影响* 。
- 例如,对于一封已知的垃圾邮件,过滤器1是否标记它,和过滤器2是否标记它,是两个可以相乘的独立概率事件。
这一小问问的是:“ 两个过滤器同时把一封邮件标记为垃圾邮件的总概率是多少? ”
这里的关键点在于,这个问题并没有告诉你这封邮件 本身到底是不是垃圾邮件 。所以,要计算这个总概率,你必须考虑两种可能发生并导致这个结果的 互斥场景 :
场景一* :这封邮件 确实是垃圾邮件(S)** ,并且两个过滤器都正确地标记了它。
场景二* :这封邮件 其实不是垃圾邮件(S̄)** ,但两个过滤器都犯了错误,同时标记了它。
这道题最终想让你计算的,就是 场景一发生的概率 + 场景二发生的概率 。这背后运用的原理就是我们之前提过的 全概率公式 。
我们可以分别计算两个场景的概率,然后得到答案:
场景一:
邮件是垃圾邮件(S),并且两个filter都标记了它。我们计算这个特定场景发生的联合概率: \(P(A \cap S)\),根据条件概率的定义,我们知道:
由于\(P(S)\)是已知的先验概率,为0.2。\(P(A \mid S)\)指的是“在一封确认为垃圾邮件的邮件中,两个filter都标记它的概率”。因为题目已经说明两个filter条件独立,所以我们可以将他们相乘:
代入数值得到:
场景一的总概率便得到了:
同理,场景二的总概率\(P(A \cap \bar{S})\)也可以用同样的方法得到:
把两个互斥场景的概率相加,即得到总概率:
(b) Given that both filters flag an email, what is the probability of the email being spam? (You can leave your answer as an unsimplified fraction.)
在上一问,我们算出了被两个filter同时标记为垃圾邮件的概率。而这一问问的则是,对于那些已经被两个filter同时标记的邮件,其为真垃圾邮件的比例是多少。这是一个后验概率。
回忆一下贝叶斯公式:
在这道题中:
- Y = 邮件真的是垃圾邮件(S)
- X = 邮件被两个filters同时标记(我们之前称之为事件A)
所以代入到贝叶斯公式中,可以得到 :
翻译一下就是:
P(邮件是垃圾 | 被两个滤镜标记) = P(邮件是垃圾 并且 被两个滤镜标记) / P(被两个滤镜标记)
在第一问中,我们已经知道:
- \(P(A) = 0.148\)
- \(P(A \cap S)=0.144\)
代入可得:
.