泛函导数

当处理从函数到实数的映射的泛函时,我们经常需要理解输入函数的小变化如何影响输出值。这个概念通过泛函导数得到体现。

定义

泛函导数衡量由于其参数函数的小变化而导致的泛函变化。如果你熟悉普通的导数 —— 你找出一个函数因为它的变量小变化而如何变化 —— 泛函导数是泛函和函数的类似物。

对于依赖于函数 \( f(x) \) 的泛函 \( F[f] \),在点 \( y \) 的泛函导数表示为:

\[\frac{\delta F[f]}{\delta f(y)}\]

计算步骤

要计算泛函导数,按照以下步骤:

  1. 引入变分: 考虑小的变分 \( \epsilon \eta(x) \) 使函数变为 \( f(x) \to f(x) + \epsilon \eta(x) \),其中 \( \epsilon \) 是一个小参数。
  2. 用变分表示泛函: 用变化后的函数 \( f(x) + \epsilon \eta(x) \) 重写泛函 \( F[f] \)。这会使泛函成为关于 \( \epsilon \) 的函数,即 \( F[\epsilon] \)。
  3. 泰勒展开: 围绕 \( \epsilon = 0 \),对 \( F[\epsilon] \) 作泰勒展开。
  4. 提取泛函导数: 泰勒展开中 \( \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\) 确定了马尔可夫链的未来状态。

与马尔可夫链相关的问题中,最困难的部分通常是,

  1. 如何选择合适的状态空间;
  2. 如何定义转移概率。

重要的矩阵

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)

相通(communicate)

常返(recurrent)

暂态(transient)

吸收态(absorbing)

例子

%3 1 1 2 2 1->2 0.5 4 4 1->4 0.5 2->1 0.5 2->4 0.25 3 3 2->3 0.25 4->4 1 3->2 0.4 3->4 0.2 3->3 0.4

单纯形

定义

在 \( \mathbb{R}^K \) 中的单纯形是所有点 \( p \) 的集合,使得:

数学上,这可以表示为:

\[\Delta^{K-1} = \{ p \in \mathbb{R}^K : p_k \geq 0, \sum_{k=1}^{K} p_k = 1 \}\]

几何解释

与概率的关系

单纯形与概率分布有着密切的关系:

单纯复合体

单纯复合体是由顶点、线段、三角形及其 \( 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。它的具体做法是

  1. 计算出所有统计分析的 \( P \) 值
  2. 将 P 值由小到大「排序」。我们假设某一个实验的排序结果为 \( i \) (\( i=1 \) 表示 \( P \) 值最小的结果)。
  3. 我们人工选择一个 \( Q \) 值,这个值被称为 false discovery rate。
  4. 对于「每一个」统计分析结果,我们它对应的 \( (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 假设。

什么时候用什么

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 中的小知识点

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} \) 满足下面的性质(其实就是说,这两个都是旋转矩阵)

  1. \( \bf{U} \) 的列向量相互正交,即 \( \bf U^\top U= \)I
  2. \( \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)\]

散度

\[\begin{aligned} \nabla \cdot \mathbf{A} &= \operatorname{div} \mathbf{A} \\ &= \left( \frac{\partial}{\partial x}, \frac{\partial}{\partial y}, \frac{\partial}{\partial z} \right) \cdot (A_x, A_y, A_z)\\[0.5em] &= \frac{\partial A_{x}}{\partial x}+\frac{\partial A_{y}}{\partial y}+\frac{\partial A_{z}}{\partial z} \end{aligned}\]

梯度

\[\begin{aligned} \nabla \mathbf{A} &= \text{grad}\,\mathbf{A} = \mathbf{J}_\mathbf{A} \\[0.5em] &= \left( \frac{\partial \textbf{A}}{\partial x}, \frac{\partial \textbf{A}}{\partial y}, \frac{\partial \textbf{A}}{\partial z} \right)\\[0.5em] &= \left( \frac{\partial A_i}{ \partial x_j} \right)_{ij} \end{aligned}\]

旋度

\[\begin{aligned} \operatorname{curl} \mathbf{A} &=\boldsymbol{\nabla} \times \mathbf{A}\\[1em] &=\left(\frac{\partial A_{z}}{\partial y}-\frac{\partial A_{y}}{\partial z}\right) \mathbf{i}+\left(\frac{\partial A_{x}}{\partial z}-\frac{\partial A_{z}}{\partial x}\right) \mathbf{j}+\left(\frac{\partial A_{y}}{\partial x}-\frac{\partial A_{x}}{\partial y}\right) \mathbf{k}\\[1em] &=\left|\begin{array}{ccc}{\mathbf{i}} & {\mathbf{j}} & {\mathbf{k}} \\ {\frac{\partial}{\partial x}} & {\frac{\partial}{\partial y}} & {\frac{\partial}{\partial z}} \\ {A_{x}} & {A_{y}} & {A_{z}}\end{array}\right| \end{aligned}\]

拉普拉斯算符

矢量拉普拉斯算符(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} \) 的分量

其他

\[\begin{aligned} (\mathbf{A} \cdot \nabla) \mathbf{B} &= \left( A_i \frac{\partial}{\partial x_i} \right) B_j \\ &= A_i \left( \frac{ \partial B_{\color{tomato}{j}} }{ \partial x_{\color{teal}{i}} } \right) \\[1em] \mathbf{A} \cdot \nabla \mathbf{B} &= \mathbf{A} \cdot \mathbf{J}_\mathbf{B} \\ &= A_i \left( \frac{ \partial B_{\color{teal}{i}} }{ \partial x_{\color{tomato}{j}} } \right) \end{aligned}\]

更多矢量微积分的记号