图像数据集降维的方法
降维是图像学中将图像高维数据转化为低维特征向量的技术,其核心是通过提取流形本征结构降低计算复杂度并提升识别精度。本文介绍几种降维方法。
文章目录
PCA
PCA是一种线性正交变换,将数据投影到方差最大的正交方向上。其核心思想是:找到一组正交基,使得数据在这些基上构成的子空间的投影具有最大方差。
数学过程
假设数据集包含N个样本,每个样本有D个特征。即 X = [ x 1 , . . . , x N ] T , x i ∈ R D , X ∈ R N × D X=[x_1,...,x_N]^T,x_i\in\mathbb{R}^D,X\in\mathbb{R}^{N\times D} X=[x1,...,xN]T,xi∈RD,X∈RN×D。
目标是降维到K维,即 Y = [ y 1 , . . . , y N ] T , y i ∈ R K , Y ∈ R N × K Y=[y_1,...,y_N]^T,y_i\in\mathbb{R}^K,Y\in\mathbb{R}^{N\times K} Y=[y1,...,yN]T,yi∈RK,Y∈RN×K
-
数据中心化
首先计算数据均值 μ = 1 N ∑ i = 1 N x i \mu=\frac{1}{N}\sum_{i=1}^Nx_i μ=N1∑i=1Nxi,每个样本的特征减去该样本的均值,即 X ˉ = X − I N μ \bar{X}=X-\mathbb{I}_{N}\mu Xˉ=X−INμ
-
计算协方差矩阵
即 C = 1 N − 1 X ˉ T X ˉ C=\frac{1}{N-1}\bar{X}^T\bar{X} C=N−11XˉTXˉ,其中 C ∈ R D × D C\in\mathbb{R}^{D\times D} C∈RD×D为协方差矩阵。
-
最大化方差
假设将 x ˉ i \bar{x}_i xˉi投影在基为 w = w 1 , . . . , w K w={w_1,...,w_K} w=w1,...,wK上的子空间, w k ∈ R D , ∥ w ∥ = 1 w_k\in\mathbb{R}^D,\|w\|=1 wk∈RD,∥w∥=1,即 z i = w T x ˉ i z_i=w^T\bar{x}_i zi=wTxˉi。则方差
V a r ( z i ) = 1 N − 1 ∑ i = 1 N z i 2 = 1 N − 1 ∑ i = 1 N ( w T x ˉ i ) 2 = w T C w Var(z_i)=\frac{1}{N-1}\sum_{i=1}^N z_i^2=\frac{1}{N-1}\sum_{i=1}^N(w^T\bar{x}_i)^2=w^TCw Var(zi)=N−11i=1∑Nzi2=N−11i=1∑N(wTxˉi)2=wTCw
从而要最大化方差,只需要求解约束问题
max w w T C w s . t . w T w = 1 \max_w w^TCw \qquad s.t. w^Tw=1 wmaxwTCws.t.wTw=1
利用拉格朗日乘子法,则有拉格朗日函数
L ( w , λ ) = w T C w − λ ( w T w − 1 ) L(w,\lambda)=w^TCw-\lambda(w^Tw-1) L(w,λ)=wTCw−λ(wTw−1)
对 w w w求导
∂ L ( w , λ ) ∂ w = 2 C w − 2 λ w = 0 \frac{\partial L(w,\lambda)}{\partial w}=2Cw-2\lambda w=0 ∂w∂L(w,λ)=2Cw−2λw=0
从而有 w w w为 C C C的特征向量, λ \lambda λ为 C C C的特征值。故 max w w T C w = max w λ w T w \max_w w^TCw=\max_w \lambda w^T w maxwwTCw=maxwλwTw,这说明 w w w为 C C C中最大K个特征值对应的特征向量。 -
特征值分解并投影
对 C C C进行特征值分解,即 C = V Λ V T C=V\Lambda V^T C=VΛVT,其中 V V V为 C C C的特征向量组成的矩阵, Λ \Lambda Λ为 C C C的特征值组成的对角矩阵。则 C C C的最大K个特征值对应的特征向量为 V V V的前K列 V K = [ v 1 , . . . , v K ] V_K=[v_1,...,v_K] VK=[v1,...,vK]。
从而 y i = V K T x ˉ i y_i=V_K^T\bar{x}_i yi=VKTxˉi,即 Y = X ˉ V K Y=\bar{X}V_K Y=XˉVK
MNIST数据集
在MNIST数据集中,每个样本为28x28的灰度图像,共784个特征。现在我们将其降到2维。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import fetch_openml
from sklearn.preprocessing import StandardScaler
# 加载MNIST数据集
mnist = fetch_openml('mnist_784', version=1, as_frame=False)
X, y = mnist.data, mnist.target.astype(int)
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 应用PCA降维到2D
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 绘制2D散点图
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='tab10', s=5)
plt.colorbar(scatter, ticks=range(10))
plt.title('PCA of MNIST Dataset')
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.show()

可以看到没有很好的分开不同的数字
t-SNE
t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非线性降维算法,主要用于高维数据的可视化。它由 Laurens van der Maaten 和 Geoffrey Hinton 在 2008 年提出,特别适合将高维数据(如图像、文本、基因数据等)映射到二维或三维空间,以便人类直观地观察数据的结构和聚类情况。
数学过程
假设数据集包含N个样本,每个样本有D个特征。即 X = [ x 1 , . . . , x N ] T , x i ∈ R D , X ∈ R N × D X=[x_1,...,x_N]^T,x_i\in\mathbb{R}^D,X\in\mathbb{R}^{N\times D} X=[x1,...,xN]T,xi∈RD,X∈RN×D。
目标是降维到K维,即 Y = [ y 1 , . . . , y N ] T , y i ∈ R K , Y ∈ R N × K Y=[y_1,...,y_N]^T,y_i\in\mathbb{R}^K,Y\in\mathbb{R}^{N\times K} Y=[y1,...,yN]T,yi∈RK,Y∈RN×K
高维空间相似度计算(P矩阵构建)
- 条件概率 p j ∣ i p_{j|i} pj∣i
t-SNE首先在高维空间中计算相似度。对于每个点 x i x_i xi,定义以 x i x_i xi为中心的高斯分布,计算 x j x_j xj出现在 x i x_i xi附近的条件概率:
p j ∣ i = exp ( − ∥ x i − x j ∥ 2 / 2 σ i 2 ) ∑ k ≠ i exp ( − ∥ x i − x k ∥ 2 / 2 σ i 2 ) p_{j|i} = \frac{\exp(-\|x_i - x_j\|^2 / 2\sigma_i^2)}{\sum_{k \neq i} \exp(-\|x_i - x_k\|^2 / 2\sigma_i^2)} pj∣i=∑k=iexp(−∥xi−xk∥2/2σi2)exp(−∥xi−xj∥2/2σi2)
其中:
- ∥ x i − x j ∥ 2 \|x_i - x_j\|^2 ∥xi−xj∥2是欧氏距离的平方
- σ i \sigma_i σi是高斯分布的标准差,对每个点 x i x_i xi单独确定
- 对称化概率 p i j p_{ij} pij
原始SNE使用有向的条件概率,但t-SNE将其对称化,定义联合概率:
p i j = p j ∣ i + p i ∣ j 2 N p_{ij} = \frac{p_{j|i} + p_{i|j}}{2N} pij=2Npj∣i+pi∣j
这样, p i j = p j i p_{ij} = p_{ji} pij=pji,且 ∑ i ≠ j p i j = 1 \sum_{i \neq j} p_{ij} = 1 ∑i=jpij=1。对称化有助于减少计算复杂度并提高稳定性。
- 困惑度(Perplexity)与 σ i \sigma_i σi的确定
困惑度定义为:
P e r p ( P i ) = 2 H ( P i ) Perp(P_i) = 2^{H(P_i)} Perp(Pi)=2H(Pi)
其中 H ( P i ) = − ∑ j p j ∣ i log 2 p j ∣ i H(P_i) = -\sum_j p_{j|i} \log_2 p_{j|i} H(Pi)=−∑jpj∣ilog2pj∣i是概率分布 P i P_i Pi的香农熵。
困惑度实际上衡量了有效邻域大小,值越大表示考虑更多邻居。t-SNE通过二分搜索为每个点 x i x_i xi找到合适的 σ i \sigma_i σi,使得 P e r p ( P i ) Perp(P_i) Perp(Pi)等于用户指定的困惑度值。
低维空间相似度计算(Q矩阵构建)
在低维空间中,t-SNE使用自由度为1的t分布(即Cauchy分布)而非高斯分布来计算相似度:
q i j = ( 1 + ∥ y i − y j ∥ 2 ) − 1 ∑ k ≠ l ( 1 + ∥ y k − y l ∥ 2 ) − 1 q_{ij} = \frac{(1 + \|y_i - y_j\|^2)^{-1}}{\sum_{k \neq l} (1 + \|y_k - y_l\|^2)^{-1}} qij=∑k=l(1+∥yk−yl∥2)−1(1+∥yi−yj∥2)−1
这里的关键区别:
- 分子使用 ( 1 + ∥ y i − y j ∥ 2 ) − 1 (1 + \|y_i - y_j\|^2)^{-1} (1+∥yi−yj∥2)−1而非高斯分布
- 分母是所有点对的相似度之和
使用t分布(长尾分布)的主要原因是解决"拥挤问题"(crowding problem)——高维空间中距离适中的点在低维表示中往往过于拥挤。t分布的长尾特性使远距离点在低维空间中可以相距更远。
目标函数:KL散度最小化
t-SNE的目标是找到低维表示 Y Y Y,使 P P P和 Q Q Q尽可能相似。使用KL散度作为衡量标准:
C = K L ( P ∣ ∣ Q ) = ∑ i ≠ j p i j log p i j q i j C = KL(P||Q) = \sum_{i \neq j} p_{ij} \log \frac{p_{ij}}{q_{ij}} C=KL(P∣∣Q)=i=j∑pijlogqijpij
KL散度是非对称的,对 P P P中大的 p i j p_{ij} pij值赋予更高权重。这意味着t-SNE更关注保留数据的局部结构(即相似点之间的关系),而对远距离点的精确表示要求较低。
为了最小化KL散度,我们需要计算其关于低维表示 y i y_i yi的梯度。这是t-SNE优化的核心。
- KL散度重写
首先,将KL散度重写为:
C = ∑ i ≠ j p i j log p i j − ∑ i ≠ j p i j log q i j C = \sum_{i \neq j} p_{ij} \log p_{ij} - \sum_{i \neq j} p_{ij} \log q_{ij} C=i=j∑pijlogpij−i=j∑pijlogqij
由于第一项与 Y Y Y无关,优化问题简化为最大化 ∑ i ≠ j p i j log q i j \sum_{i \neq j} p_{ij} \log q_{ij} ∑i=jpijlogqij。
- 梯度计算
对 y i y_i yi求偏导:
∂ C ∂ y i = 4 ∑ j ( p i j − q i j ) ( y i − y j ) ( 1 + ∥ y i − y j ∥ 2 ) − 1 \frac{\partial C}{\partial y_i} = 4 \sum_j (p_{ij} - q_{ij}) (y_i - y_j) (1 + \|y_i - y_j\|^2)^{-1} ∂yi∂C=4j∑(pij−qij)(yi−yj)(1+∥yi−yj∥2)−1
推导过程:SNE与t-SNE梯度的推导
随后使用梯度下降法最小化KL散度。
应用于MNIST数据集
在MNIST数据集中,每个样本为28x28的灰度图像,共784个特征。现在我们将其降到2维。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn.datasets import fetch_openml
# 加载MNIST数据集
mnist = fetch_openml('mnist_784', version=1, as_frame=False)
X, y = mnist.data, mnist.target.astype(int)
# 应用t-SNE降维到2D
tsne = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X)
# 绘制2D散点图
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='tab10', s=5)
plt.colorbar(scatter, ticks=range(10))
plt.title('t-SNE of MNIST Dataset')
plt.xlabel('t-SNE Component 1')
plt.ylabel('t-SNE Component 2')
plt.show()

可以看到基本分开了各类数字。
UMAP
UMAP的核心思想是:数据位于高维空间中的低维流形上,且该流形具有均匀的黎曼度量。UMAP通过构建高维数据的模糊拓扑表示来捕捉这种结构。
数学过程
假设数据集包含N个样本,每个样本有D个特征。即 X = [ x 1 , . . . , x N ] T , x i ∈ R D , X ∈ R N × D X=[x_1,...,x_N]^T,x_i\in\mathbb{R}^D,X\in\mathbb{R}^{N\times D} X=[x1,...,xN]T,xi∈RD,X∈RN×D。
目标是降维到K维,即 Y = [ y 1 , . . . , y N ] T , y i ∈ R K , Y ∈ R N × K Y=[y_1,...,y_N]^T,y_i\in\mathbb{R}^K,Y\in\mathbb{R}^{N\times K} Y=[y1,...,yN]T,yi∈RK,Y∈RN×K
高维空间拓扑结构构建(模糊单纯复形)
- 局部距离缩放参数
对于每个点 x i x_i xi:
- 找到其 k k k个最近邻( k k k为
n_neighbors参数) - 令 ρ i = min { d ( x i , x j ) ∣ j ∈ N k ( i ) } \rho_i = \min\{d(x_i, x_j) | j \in \mathcal{N}_k(i)\} ρi=min{d(xi,xj)∣j∈Nk(i)},即 x i x_i xi到其第 k k k个最近邻的距离
- 确定局部距离缩放参数 σ i \sigma_i σi,使得:
∑ j ∈ N k ( i ) exp ( − d ( x i , x j ) − ρ i σ i ) = log 2 ( k + 1 ) \sum_{j \in \mathcal{N}_k(i)} \exp\left(-\frac{d(x_i, x_j) - \rho_i}{\sigma_i}\right) = \log_2(k+1) j∈Nk(i)∑exp(−σid(xi,xj)−ρi)=log2(k+1)
这个方程确保了在 x i x_i xi周围的局部区域内,有大约 k k k个有意义的连接。 σ i \sigma_i σi通过数值方法(如二分法)求解。
- 高维模糊集相似度
在高维空间中,定义点 i i i和 j j j之间的模糊集相似度:
π i j = { exp ( − d ( x i , x j ) − ρ i σ i ) if d ( x i , x j ) ≥ ρ i 1 if d ( x i , x j ) < ρ i \pi_{ij} = \begin{cases} \exp\left(-\frac{d(x_i, x_j) - \rho_i}{\sigma_i}\right) & \text{if } d(x_i, x_j) \geq \rho_i \\ 1 & \text{if } d(x_i, x_j) < \rho_i \end{cases} πij={exp(−σid(xi,xj)−ρi)1if d(xi,xj)≥ρiif d(xi,xj)<ρi
π i j \pi_{ij} πij表示在高维流形上,点 i i i和 j j j属于同一局部邻域的"可能性"。注意:
- π i j ∈ [ 0 , 1 ] \pi_{ij} \in [0,1] πij∈[0,1]
- π i j \pi_{ij} πij是非对称的( π i j ≠ π j i \pi_{ij} \neq \pi_{ji} πij=πji)
- 对称化相似度
UMAP使用T-范数(T-norm)对相似度进行对称化,通常选择概率T-范数:
p i j = π i j + π j i − π i j ⋅ π j i p_{ij} = \pi_{ij} + \pi_{ji} - \pi_{ij} \cdot \pi_{ji} pij=πij+πji−πij⋅πji
这等价于:
p i j = 1 − ( 1 − π i j ) ( 1 − π j i ) p_{ij} = 1 - (1 - \pi_{ij})(1 - \pi_{ji}) pij=1−(1−πij)(1−πji)
对称化后的 p i j p_{ij} pij表示 i i i和 j j j在高维流形上连接的总体可能性,并设置 p i i = 0 p_{ii} = 0 pii=0(无自连接)
低维空间相似度计算
在低维空间中,UMAP使用连续的相似度函数来近似高维的模糊拓扑结构。
- 低维相似度函数
定义低维空间中点 i i i和 j j j的相似度:
μ i j = 1 1 + a ⋅ ∥ y i − y j ∥ 2 b \mu_{ij} = \frac{1}{1 + a \cdot \|y_i - y_j\|^{2b}} μij=1+a⋅∥yi−yj∥2b1
其中 a a a和 b b b是超参数,通过拟合以下方程确定:
∑ i ≠ j 1 1 + a ⋅ d i j 2 b = N 2 ⋅ min_dist − b \sum_{i \neq j} \frac{1}{1 + a \cdot d_{ij}^{2b}} = \frac{N}{2} \cdot \text{min\_dist}^{-b} i=j∑1+a⋅dij2b1=2N⋅min_dist−b
这里:
- d i j d_{ij} dij是低维空间中标准化的距离
min_dist是用户指定的参数,控制聚类的紧密度(通常0.001-0.5)
- 对称化低维相似度
与高维空间类似,定义低维空间的对称相似度:
q i j = μ i j + μ j i − μ i j ⋅ μ j i q_{ij} = \mu_{ij} + \mu_{ji} - \mu_{ij} \cdot \mu_{ji} qij=μij+μji−μij⋅μji
但实际实现中,由于 μ i j \mu_{ij} μij已是对称函数( ∥ y i − y j ∥ = ∥ y j − y i ∥ \|y_i - y_j\| = \|y_j - y_i\| ∥yi−yj∥=∥yj−yi∥),所以通常简化为:
q i j = 1 1 + a ⋅ ∥ y i − y j ∥ 2 b q_{ij} = \frac{1}{1 + a \cdot \|y_i - y_j\|^{2b}} qij=1+a⋅∥yi−yj∥2b1
目标函数:交叉熵最小化
UMAP的目标是找到低维表示 Y Y Y,使高维拓扑结构 p i j p_{ij} pij与低维拓扑结构 q i j q_{ij} qij尽可能匹配。与t-SNE使用KL散度不同,UMAP最小化交叉熵:
C = ∑ i ≠ j [ p i j log ( p i j q i j ) + ( 1 − p i j ) log ( 1 − p i j 1 − q i j ) ] C = \sum_{i \neq j} \left[ p_{ij} \log\left(\frac{p_{ij}}{q_{ij}}\right) + (1-p_{ij}) \log\left(\frac{1-p_{ij}}{1-q_{ij}}\right) \right] C=i=j∑[pijlog(qijpij)+(1−pij)log(1−qij1−pij)]
应用于MNIST数据集
在MNIST数据集中,每个样本为28x28的灰度图像,共784个特征。现在我们将其降到2维。

可以看到,UMAP方法对MNIST数据集划分的最好。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)