References:
【基本思想】
约束条件
对于给定容量为 $n$ 的样本集 $X=\{\mathbf{x}_1,\mathbf{x}_2,\cdots,\mathbf{x}_n\}$,第 $i$ 个样本的输入 $\mathbf{x}_i$ 具有 $m$ 个特征值,即:$\mathbf{x}_i = (x_i^{(1)},x_i^{(2)},\cdots,x_i^{(m)})\in \mathbb{R}^{m}$,这 $n$ 个样本在原始空间的欧氏距离矩阵为 $D\in \mathbb{R}^{n\times n}$,其第 $i$ 行第 $j$ 列的元素 $\text{dist}_{ij}$ 为样本 $\mathbf{x}_{i}$ 到 $\mathbf{x}_j$ 的欧氏距离
低维嵌入的目标是获得样本在 $m’$ 维空间的表示 $Z=\{\mathbf{z}_1,\mathbf{z}_2,\cdots,\mathbf{z}_n\}\in\mathbb{R}^{m’\times n},m’\leq m$,且任意两个样本在 $m’$ 维空间中的欧氏距离等于原始空间中的欧氏距离,即约束条件:
令降维后样本的内积矩阵为 $B$,即:
对约束条件两边取平方,有:
内积表示
为便于讨论,令降维后的样本 $Z$ 中心化,即:
显然有矩阵 $B$ 的行列和均为 $0$,即:
由此,有:
同理,有:
进一步,对于 $\sum\limits_{i=1}^n\sum\limits_{j=1}^n \text{dist}_{ij}^2$,有:
令:
那么有:
由此可通过降维前后保持不变的距离矩阵 $D$ 中的元素来求取内积矩阵 $B$ 的元素,即:
至此为止,即获得样本在 $m’$ 维空间中的内积表示
特征值分解
现在,有了样本在 $m’$ 维空间中的内积表示 $B$,对其采用特征值分解(Eigenvalue Decomposition)的方式来获取样本在 $m’$ 维空间的表示 $Z$
令对角矩阵 $\Lambda=\text{diag}(\lambda_1,\lambda_2,\cdots,\lambda_m),\lambda_1 \geq \lambda_2 \geq \cdots \geq \lambda_m$ 表示内积矩阵 $B$ 的特征值构构成的特征矩阵,$V$ 为特征值对应的特征向量组成的特征矩阵,则内积矩阵 $B$ 可表示为:
假定 $m$ 个特征值中有 $m^*$ 个非零特征值,它们构成对角矩阵 $\Lambda_* = \text{diag}(\lambda_1 , \lambda_2 , \cdots , \lambda_{m^*})$,用 $V_{*}$ 表示对应的特征向量矩阵,那么根据 $B=Z^TZ$,可得样本在 $m’$ 维空间的表示:
在实际应用中,为了有效降维,往往仅需要降维后的距离与原始空间中的距离尽可能的接近,不必严格相等,此时通常取 $m’ \ll m$ 个最大特征值来构成对角矩阵 $\tilde{\Lambda} = \text{diag}(\lambda_1 , \lambda_2 , \cdots , \lambda_{m’})$,用 $\tilde{V}$ 表示对应的特征向量矩阵,则 $Z$ 可表示为:
【算法流程】
输入:$n$ 个样本的集合 $X=\{\mathbf{x}_1,\mathbf{x}_2,\cdots,\mathbf{x}_n\}\in \mathbb{R}^{m\times n}$,低维空间维数 $m’$
输出:样本在 $m’$ 维空间的表示 $Z = \tilde{\Lambda}^{\frac{1}{2}} \tilde{V}^T \in \mathbb{R}^{m’\times n}$,每行是一个样本在 $m’$ 维空间的坐标
算法流程:
Step1:构建距离矩阵 $D$。计算原始空间中各样本间的欧氏距离,以获取距离矩阵 $D\in \mathbb{R}^{n\times n}$,其第 $i$ 行第 $j$ 列的元素 $\text{dist}_{ij}$ 为样本 $\mathbf{x}_{i}$ 到 $\mathbf{x}_j$ 的欧氏距离
Step2:根据距离矩阵 $D$,计算 $\text{dist}_{i\cdot}^2,\text{dist}_{\cdot j}^2,\text{dist}_{\cdot\cdot}^2$
Step3:计算内积矩阵 $B$
Step4:对内积矩阵进行特征值分解
Step5:计算样本在 $m’$ 维空间的表示 $Z$。取 $\tilde{\Lambda}$ 为 $m’$ 个最大特征值所构成的对角矩阵,$\tilde{V}$ 为相应的特征向量矩阵
【sklearn 实现】
以 sklearn
中的鸢尾花数据集为例,将降维到二维空间来可视化
1 | import pandas as pd |