泛函导数
当处理从函数到实数的映射的泛函时,我们经常需要理解输入函数的小变化如何影响输出值。这个概念通过泛函导数得到体现。
定义
泛函导数衡量由于其参数函数的小变化而导致的泛函变化。如果你熟悉普通的导数 —— 你找出一个函数因为它的变量小变化而如何变化 —— 泛函导数是泛函和函数的类似物。
对于依赖于函数 \( f(x) \) 的泛函 \( F[f] \),在点 \( y \) 的泛函导数表示为:
\[\frac{\delta F[f]}{\delta f(y)}\]计算步骤
要计算泛函导数,按照以下步骤:
- 引入变分: 考虑小的变分 \( \epsilon \eta(x) \) 使函数变为 \( f(x) \to f(x) + \epsilon \eta(x) \),其中 \( \epsilon \) 是一个小参数。
- 用变分表示泛函: 用变化后的函数 \( f(x) + \epsilon \eta(x) \) 重写泛函 \( F[f] \)。这会使泛函成为关于 \( \epsilon \) 的函数,即 \( F[\epsilon] \)。
- 泰勒展开: 围绕 \( \epsilon = 0 \),对 \( F[\epsilon] \) 作泰勒展开。
- 提取泛函导数: 泰勒展开中 \( \epsilon \) 的线性项的系数,给出了泛函导数。
对于标准函数 \( g \),围绕 \( \epsilon = 0 \) 的泰勒展开为:
\[g(\epsilon) = g(0) + \epsilon g'(0) + \frac{\epsilon^2}{2!} g''(0) + \dots\]将这个概念应用于我们的泛函变化,我们得到:
\[F[\epsilon] = F[0] + \epsilon \left. \frac{dF}{d\epsilon} \right|_{\epsilon=0} + O(\epsilon^2)\]例子
让我们使用一个简单的例子来遍历这个过程。
考虑泛函:
\[F[f] = \int_{a}^{b} f(x)^2 \, dx\]我们的目标是找到泛函导数 \( \frac{\delta F[f]}{\delta f(y)} \)。
首先,我们引入变分: \( f(x) \to f(x) + \epsilon \eta(x) \),并且将泛函 \( F \) 表示为:
\[F[\epsilon] = \int_{a}^{b} (f(x) + \epsilon \eta(x))^2 \, dx\]之后,我们围绕 \( \epsilon = 0 \),对 \( F \) 做泰勒展开。 \( F[\epsilon] \) 在 \( \epsilon = 0 \) 时,等价于 \( F[f] \)。关于 \( \epsilon \) 的微分如下:
\[\left. \frac{dF}{d\epsilon} \right|_{\epsilon=0} = \int_{a}^{b} 2f(x) \eta(x) \, dx\]最后,我们提取泛函导数:
\[\frac{\delta F[f]}{\delta f(y)} = 2f(y)\]此结果告诉我们,泛函 \( F \) 在点 \( y \) 的方向上最快地增加是函数 \( 2f(y) \)。
马尔可夫链
定义
随机过程(很多随机变量的有序排列 \({ X_i }\))如果满足下面的性质,则被成为马尔可夫过程:
\[\begin{aligned} P_{ij} &= \Pr\left\{X_{n+1}=j \vert X_n=i, X_{n-1}=i_{n-1}, \dots, X_0=i_0\right\} \\[1em] &= \Pr\left\{ X_{n+1} = j \vert X_n=i \right\} \end{aligned}\]换言之,在时刻 \(i\) 的状态 \(X_i\) 确定了马尔可夫链的未来状态。
与马尔可夫链相关的问题中,最困难的部分通常是,
- 如何选择合适的状态空间;
- 如何定义转移概率。
重要的矩阵
Markov Chain 的性质由它的转移矩阵(Transition Matrix)描述,表示 \(M\) 个状态之间转移的概率:
\[\begin{aligned} \mathbf{P} &= P_{ij} \\[1em] &= \begin{bmatrix} p_{11} & p_{12} & \cdots & p_{1M} \\ p_{21} & p_{22} & \cdots & p_{2M} \\ \vdots & \vdots & \vdots & \vdots \\ p_{M1} & p_{M2} & \cdots & p_{MM} \end{bmatrix} \end{aligned}\]此外,我们也通过首次到达时间(first passage time)矩阵,或者击中时间(hitting time)矩阵 \(\mathbf{T}\),来描述马尔可夫链的长期行为:
\[\mathbf{T} = T_{ij} = \min(n: X_n = j \vert X_0 = i)\]每个元素 \(T_{ij}\) 表示从状态 \(i\) 到状态 \(j\) 所需的最小步数 \(n\)。
状态的分类
可达(accessible)
- 存在一个正整数 \(n\) 使得从状态 \(i\) 到 \(j\) 的转移概率大于零
- \(\exists n: P_{ij}^n > 0\)
- \(\Pr(T_{ij} < \infty) > 0\)
相通(communicate)
- 从 \(i\)到 \(j\) 以及从 \(j\) 到 \(i\) 都可达
- \(\forall j: \Pr(T_{ij} < \infty) > 0 \Rightarrow \Pr(T_{ji}) = 1\)
常返(recurrent)
- 如果从状态 \(i\) 出发,最终以概率 1 返回到状态 \(i\)。
- \(\Pr(T_{ii} < \infty) = 1\)
- \(P_i = \lim_{n\rightarrow\infty} \Pr(X_n = i \vert X_0 = i) = 1\)
暂态(transient)
- 如果一个状态不是常返状态,那么它就是暂态状态。
- 从暂态状态出发,有可能永远不返回到该状态。
- \(P_i = \lim_{n\rightarrow\infty} \Pr(X_n = i \vert X_0 = i) < 1\)
吸收态(absorbing)
- 不能离开的状态。
- \( P_{ii} = 1 \) and \( P_{ij} = 0 \ \forall j \neq i \)
- 拥有吸收态的马尔可夫链,被成为吸收的。
例子
- 从状态 1 开始,状态 4 可达;但是反过来不成立。
- 状态 1 和 状态 3 相通。
- 状态 4 是常返状态;其他是暂态。
单纯形
定义
在 \( \mathbb{R}^K \) 中的单纯形是所有点 \( p \) 的集合,使得:
- 每个组件 \( p_k \)都是非负的:对于所有 \( k \),都有 \( p_k \geq 0 \)。
- 组件的总和为一:\( \sum_{k=1}^{K} p_k = 1 \)。
数学上,这可以表示为:
\[\Delta^{K-1} = \{ p \in \mathbb{R}^K : p_k \geq 0, \sum_{k=1}^{K} p_k = 1 \}\]几何解释
- 在 \( \mathbb{R}^2 \)(2D 空间)中,单纯形是一个线段。
- 在 \( \mathbb{R}^3 \)(3D 空间)中,它是一个三角形。
- 在 \( \mathbb{R}^4 \) 中,它是一个四面体。
- 以此类推…
与概率的关系
单纯形与概率分布有着密切的关系:
- \( (K-1) \)-维单纯形中的一个点对应于 \( K \) 个结果上的概率分布。
- 例如,在 \( \mathbb{R}^3 \) 中,单纯形中的一个点可以表示三个事件上的概率分布。
单纯复合体
单纯复合体是由顶点、线段、三角形及其 \( n-\)维对应物组成的集合。它是单纯形概念的推广,可以表示由各种维度的单纯形填充的空间。
核范数与谱范数
核范数
对于矩阵\( A \),其核范数(Nuclear Norm 或者 Trace Norm,通常记作 \( |A|_* \))是其奇异值的总和。
使用Numpy的Python示例:
import numpy as np
def compute_nuclear_norm(A):
singular_values = np.linalg.svd(A, compute_uv=False)
return np.sum(singular_values)
A = np.array([[1, 2], [3, 4], [5, 6]])
print(compute_nuclear_norm(A))
核范数最小化的伪代码:
核范数可以作为矩阵秩在优化问题中的凸替代。
function NuclearNormMinimization(A, mask):
使用零初始化矩阵 X
当未达到收敛条件:
# 梯度步骤: 逼近已知条目
基于A的条目(mask为True的地方)更新X
# 收缩步骤: 促进低秩
对X应用SVD并缩小奇异值
return X
谱范数
对于矩阵 \( A \),其谱范数(spectral norm, 通常记作 \( |A|_2 \))是其最大的奇异值。
使用 Numpy 的 Python 示例:
import numpy as np
def compute_spectral_norm(A):
singular_values = np.linalg.svd(A, compute_uv=False)
return np.max(singular_values)
A = np.array([[1, 2], [3, 4], [5, 6]])
print(compute_spectral_norm(A))
带有谱范数约束的优化的伪代码:
谱范数可以用作优化问题中的约束,以界定矩阵的“大小”或“效果”。
function SpectralNormConstrainedOptimization(A, gamma):
使用零初始化矩阵 X
当未达到收敛条件:
# 梯度步骤: 逼近目标
更新 X
# 投影步骤: 确保谱范数约束
如果 SpectralNorm(X) > gamma:
缩放X以满足谱范数 <= gamma
return X
半定规划(SDP)
核范数和谱范数都可以整合到形式化为 SDP 的优化问题中。
带有核范数最小化的SDP的伪代码:
function SDPWithNuclearNorm(A):
初始化半定矩阵 Y
当未达到收敛条件:
# 梯度步骤: 逼近数据拟合
基于A更新Y
# 收缩步骤: 促进结构
对Y应用某些操作以鼓励所需结构
return Y
多重比较
统计中,\( P \) 值的含义是 null 假设为真的概率是 \( 1-P \)。
如果我们以 \( P=0.05 \) 来判断 null 假设的成立与否,那么我们的「每一次」判断都有 5% 的概率出错——我们测试出来的每一个「统计学显著的差异」都有 5% 的出错几率。
如果我们在一个项目中同时做了 \( n \) 个统计学检验。那么我们「所有检验结果都为真」的概率是 \( (1-P)^n \) ——在 \(n\) 很大的时候,我们几乎注定会出错!
下面介绍的两个方法都用与减轻 multiple comparison 的副作用。它们的大概作用都是「降低 false positive」的几率。不过这也会同时增加我们的 false negative 的概率。
我们是否要「主动降低 false positive 概率」呢?这个取决于「代价」,需要我们自己定夺。
什么都不做
很多人建议,什么都不要做:把实验中用到的所有分析结果,以及 p 值都报道出来。这让阅读实验报告的人能够理解,有 5% 的结论可能是错的。
如果实验是预先设计,并且严格按照计划执行和分析的,我们通常也不需要做额外的 correction。「按照计划」是指我们没有「为了降低 p 值」而增加样本数目。
Bonferroni correction
这个小节参考了这个网站Bonferroni Correction 的要点:以 \( P^\prime \) 作为新的 \( P \) 值,\( P^\prime = P / n \)
这个方法的缺点是,如果我们有很多统计学分析(\( n = 1000 \)),那么我们的 \( P^\prime \) 会很小:这回让我们把很多「不符合」null 假设的比较设定为 null 假设。换言之,我们会产生很多的 false negative。
此外,我们还面临着「历史」的问题:如果我们在 10 年前分析了 100 个样品,我们「现在」的统计分析是否需要将那 100 个分析算在我们的 \( n \) 里?——这个问题没有统一的答案。
Benjamini–Hochberg procedure
这个小节参考了这个网站在 Bonferroni Correction 外,另外一个方法是控制 false discovery rate。它的具体做法是
- 计算出所有统计分析的 \( P \) 值
- 将 P 值由小到大「排序」。我们假设某一个实验的排序结果为 \( i \) (\( i=1 \) 表示 \( P \) 值最小的结果)。
- 我们人工选择一个 \( Q \) 值,这个值被称为 false discovery rate。
- 对于「每一个」统计分析结果,我们它对应的 \( (i/m)Q \)
上面的结果之后,我们会得到两列数据
| 实验序号 | P 值 | (i/m)Q |
|---|---|---|
| 1 | 0.001 | 0.01 |
| 2 | 0.008 | 0.02 |
| 3 | 0.039 | 0.03 |
| 4 | 0.041 | 0.04 |
| 5 | 0.042 | 0.05 |
| 6 | 0.060 | 0.06 |
| 7 | 0.074 | 0.07 |
| … | … | … |
我们取这样的 \( P \) 值作为差异显著的判断标准:最大的,小于 \( (i/m)Q \) 的 \( P \)。
对应上面的表格,我们会选择「第五行」数据对应的 \( P \) 值,0.042,作为我们的判断标准。
有的时候,我们把 \( P (m / i) \) 称为 Benjamini-Hochberg adjusted P value。只要它小于我们设定的 \( Q \),我们就认为这个结果是显著的。
这个方法会导致一个奇怪的结论:如果我们分析了 1000 个结果,其中最大的 \( P \) 值是 0.24,最小的 \( P \) 值是 0.1。按照这个小节的方法,我们会拒绝所有的 null 假设(认为我们的样品有统计学显著性),即使它们的 \( P \) 值都大于 0.05。
这其实也是合理的:如果我们想要接受 1000 个 null 假设,我们最大的 \( P \) 值应该挺大的——在 0.9 左右。
与 Bonferroni 方法相比,这个方法不会产生「当统计检验数目 \( n \) 很大时,接受所有的 null 假设」的情况。
对于 \( Q \) 值,0.1 或者 0.2 是很严格的标准了——有时候有人会用 0.05,这可能是此人混淆了 \( Q \) 值与 $P$ 值。
注意:这个方法默认所有的测试都是「相互独立」的。如果我们是比较一个 control 组和其他很多实验组,这个方法是不适用的。举例而言,如果 control > A && A > B 那么 control 一定大于 B。
Prism 里的方法
在软件 Prism 里,我们可以选择 Bonferroni, Tukey, Dunnett 或者 Dunn 等方法。它们有类似之处:都会报告一个 adjusted P 值。我们得到的 adjusted P 的含义是
对我们的「某一个」统计检验,我们寻找一个「最小的」P 值,把这个值应用在我们多重比较 (family) 里,我们能认为「某一个」检验不符合 null 假设。
什么时候用什么
- 比较一个 control 和其他样本的均值: Dunnett’s method
- 比较所有样本的均值:Tukey method
- 比较我们主观选择的一些样本:Bonferroni / Šídák method
SVD
公式
SVD 一般是这样写的
\[\begin{align} \bf{A_{m \times n}} = \bf{U_{m \times n}} \; \Sigma_{n \times n} \; \bf{V_{n \times n}} \end{align}\]其中,\( \bf{U} \) 和 \( \bf{V} \) 都是酉矩阵,它们表示旋转操作,同时它们的行/列都是标准正交基(基向量的长度为 1,两两正交)。
SVD 和特征向量/特征值
我们想要得到的其实是类似于「特征值」的东西,对于方阵 \( \bf{X} \),它的特征值 \( \upsilon \) 满足
\[\mathbf{X} \mathbf{\upsilon} = \lambda \mathbf{\upsilon}\]对于不是方阵的 \( A \),我们能找到两个类似于特征值的东西(\( \bf{v} \), \( \bf{u} \)),叫做「一个奇异向量」。对应的数值 \( \sigma \) 叫做「一个奇异值」:
\[\begin{align} \bf{A^T} u &= \sigma \bf{v} & \bf{u}\text{: 左奇异向量} \\ \bf{A} v &= \sigma \bf{u} & \bf{v} \text{: 右奇异向量} \end{align}\]如果我们给上面的公式左右分别左乘上 \( \bf{A} \) 和 \( \bf{A^T} \),我们得到
\[\begin{aligned} \bf{AA^T} u &= \sigma \bf{Av}\\ &= \sigma^2 \bf{u} &(\bf{u} \text{ 是} \bf{AA^T} \text{ 的特征值})\\[1em] \bf{A^TA} v &= \sigma \bf{u}\\ &= \sigma^2 \bf{v} & (\bf{v} \text{ 是} \bf{A^TA} \text{ 的特征值})\\ \end{aligned}\]在这里,我知考虑了实数矩阵——如果考虑复数的话,我需要计算 \( \bf{A} \) 的共轭转置 \( \bf{A^\ast} \)。
奇异向量和 SVD
公式 (1) 中的 \( \bf{U} \) 和 \( \bf{V} \) 是所有包含了所有左/右奇异向量的矢量空间的标准正交基。而公式 (1) 中的 \( \Sigma \) 则表示了每个奇异向量对应的奇异值。
让我们重新审视公式 (1)
\[\begin{align} \bf{A} &= \bf{U} \bf{\Sigma} \bf{V^T} \end{align}\]我们可以把它稍微改写成
\[\begin{aligned} \bf{A} = \bf{U} \bf{\Sigma} \bf{V^T} \bf{I} \end{aligned}\]其中,\( \bf{I} \) 是标准正交基。上面的公式告诉了我们怎么把 \( \bf{I} \) 变成 \( \bf{A} \):我们首先把 \( \bf{I} \) 映射到右奇异基向量(旋转);按照奇异值大小缩放各个基向量;再把结果映射到左奇异基向量(旋转)。
SVD 中的小知识点
- \( \Sigma \) 中的奇异值的「有序集合」被称为矩阵的「谱」spectrum。
- 奇异值之间的差影响着解的稳定性
- 最大和最小的奇异值绝对值之间的比率(条件数)影响着一个迭代求解器找到矩阵解的速度。
PCA
PCA 的目的
我们使用 PCA 来压缩数据。假设我们有 \( m \) 个属于 \( \mathbb{R}^d \) 列向量:\( \bf{x_1}, \dots \bf{x_m} \),我们用一个矩阵 \( \mathbf{x}\in\mathbb{R}^{d, m} \) 来描述所有的数据点。我们希望找到一个矩阵 \( \mathbf{W} \in \mathbb{R}^{d, n} \),来将 \( \bf{x} \) 映射到低维空间:
\[\begin{align} \mathbf{y} &= \mathbf{Wx} & (\ \mathbf{y} \in \mathbb{R}^n, n < d) \end{align}\]同样,我们也需要另一个矩阵 \( \mathbf{U} \in \mathbb{R}^{n, d} \) 来将 \( \bf{y} \) 还原为一个「同原始 \( \bf{x} \) 接近」的 \( \bf{\tilde{x}} \)。我们通过让两者「尽量接近」来确定最好的 \( \bf{U} \) 和 \( \bf{W} \):
\[\begin{align} \underset{ \mathbf{W}\in\mathbb{R}^{n, d},\ \mathbf{U}\in\mathbb{R}^{d, n} }{\operatorname{argmin}} \sum_{i=1}^{m}{\left\| \mathbf{x}_i - \mathbf{UWx}_i \right\|^2} \end{align}\]找到 U 和 W
我们首先可以证明,我们想要的,符合公式 (6) 的, \( \bf{U} \) 与 \( \bf{W} \) 满足下面的性质(其实就是说,这两个都是旋转矩阵)
- \( \bf{U} \) 的列向量相互正交,即 \( \bf U^\top U= \)I
- \( \bf W = U^\top \)
根据上面的辅助定理,我们可以把公式 (6) 重新写成
\[\begin{align} \underset{ \mathbf{W}\in\mathbb{R}^{n, d},\ \mathbf{U}\in\mathbb{R}^{d, n} }{\operatorname{argmin}} \sum_{i=1}^{m}{\left\| \mathbf{x}_i - \mathbf{UU^\top x}_i \right\|^2} \end{align}\]我们可以把需要 minimise 的部分写成
\[\begin{aligned} \left\| \mathbf{x}-U U^{\top} \mathbf{x} \right\|^{2} &=\|\mathbf{x}\|^{2}-2 \mathbf{x}^{\top} U U^{\top} \mathbf{x}+\mathbf{x}^{\top} U U^{\top} U U^{\top} \mathbf{x} \\ &=\|\mathbf{x}\|^{2}-\mathbf{x}^{\top} U U^{\top} \mathbf{x} \\ &=\|\mathbf{x}\|^{2}-\operatorname{trace} \left(U^{\top} \mathbf{x} \mathbf{x}^{\top} U \right) \end{aligned}\]其中,\( \text{trace} \) 的意思是对对角项求和,是一个线性算符,这让我们可以最终把公式 (6) 写成
\[\underset{U \in \mathbb{R}^{d, n} : U^{\top} U=I}{\operatorname{argmax}} \operatorname{trace} \left( U^{\top} \sum_{i=1}^{m} \mathbf{x}_{i} \mathbf{x}_{i}^{\top} U \right)\]向量微分算子
Del 算子或稱 Nabla 算子,在中文中也叫向量微分算子、劈形算子、倒三角算子,符号为 \( \nabla \)。
Nabla 主要的作用就是用来简写「散度」、「梯度」和「旋度」。我们可以把它看成一个向量。
三维空间中
\[\nabla = \vec{e}_{x} \frac{\partial}{\partial x} + \vec{e}_{y} \frac{\partial}{\partial y} + \vec{e}_{z} \frac{\partial}{\partial z} = \left( \frac{\partial}{\partial x}, \frac{\partial}{\partial y}, \frac{\partial}{\partial z} \right)\]n 维空间中
\[\nabla =\sum_{i=1}^{n} \vec{e}_{i} \frac{\partial}{\partial x_{i}} =\left( \frac{\partial}{\partial x_{1}}, \cdots, \frac{\partial}{\partial x_{n}} \right)\]散度
-
记号: \( \nabla \cdot \mathbf{A} \)
-
维度: \( \mathbb{R}^n \rightarrow \mathbb{R} \)
-
意义:散度描述的是向量场里一个点是汇聚点还是发源点,形象地说,就是这包含这一点的一个微小体元中的向量是“向外”居多还是“向内”居多。
-
分量表示
梯度
-
记号:\( \nabla \mathbf{A} \)
-
维度:\( \mathbb{R}^n \rightarrow \mathbb{R}^n \)
- 意义:
- 方向:多元函数的某一个点上,最大增长的「方向」
- 大小:多元函数的某一个点上,最大增长的「增长率」
- 分量表示
旋度
- 记号:\( \nabla \times \mathbf{A} \)
- 维度:\( \mathbb{R}^n \rightarrow \mathbb{R}^n \)
- 意义:在向量场每个点上,点的旋度表示为一个向量。这个向量的特性(长度和方向)刻画了在这个点上的旋转。
- 分量表示:
拉普拉斯算符
矢量拉普拉斯算符(vector Laplacian)作用在 矢量场 上,返回一个矢量。类似地,标量拉普拉斯算符(scalar Laplacian)作用在 标量场 上,返回一个标量。
作用在 矢量场 \( \mathbf{A} \) 的 矢量拉普拉斯算符 写成 \( \nabla^2 \),定义为
\[\nabla^2 = \nabla(\nabla \cdot \mathbf{A}) - \nabla\times(\nabla \times \mathbf{A})\]在 笛卡尔坐标系 下,上面的定义可以被(极大地)简化为
\[\nabla^2\mathbf{A} = \left( \nabla^2 A_x, \nabla^2 A_y, \nabla^2 A_z \right)\]其中,\( A_x, A_y, A_z \) 是矢量场 \( \mathbf{A} \) 的分量