news 2026/9/12 3:47:40

局部线性嵌入LLE:流形学习的原理、推导与NumPy实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
局部线性嵌入LLE:流形学习的原理、推导与NumPy实现

做流形学习的相关研究或课程作业时,局部线性嵌入(Locally Linear Embedding,LLE)这个名字总是绕不过去。它和 Isomap 一起被认为是流形学习领域的开山之作,2000 年发表在Science上时,给当时被 PCA 这类线性方法主导的降维领域带来了完全不同的思路。即便后来 t-SNE、UMAP 火遍大模型时代,LLE 这套"局部线性、全局非线性"的建模思路依然值得花时间去吃透——很多深度生成模型里的流形假设,源头就在这里。

这篇内容我会顺着一条完整的链路展开:先讲清楚 LLE 背后的几何直觉,再逐步拆解算法的每一步数学推导,然后给一份可以运行的 NumPy 实现,最后把参数选择和应用中容易踩的坑一次性说完。无论你是刚接触机器学习的初学者,还是在准备考试或面试,都能从中拿到可以直接用的东西。

1. LLE 到底在解决什么问题:从一张卷起的曲面说起

1.1 流形假设:高维数据的内在维度往往是低的

先抛一个反直觉的结论:绝大多数高维数据,其实并没有占据整个高维空间。一张 64×64 的人脸灰度图,像素维度是 4096 维,但人脸图在空间中只落在一个远比 4096 维狭窄的"曲面"上——决定这张脸长什么样的,可能只是身份、角度、光照这几个因素。这个低维曲面在数学上就叫"流形",数据本质上是躺在流形上采样得到的。

这就是流形假设:我们观测到的高维数据,其内在的自由度(本征维度)很低,只是被嵌入到了高维空间里。降维的本质,就是把这个流形展开,恢复出数据点之间的内在坐标关系。但问题在于,这个流形往往是"卷曲"的。最经典的例子就是瑞士卷(Swiss roll):二维平面卷成了三维空间里的螺旋结构。你用 PCA 去压缩它,展开后不同卷层被压在一起,完全看不出结构;但人类肉眼看到那个三维螺旋时,很容易理解"这张卷饼本来是一张长方形纸条"。

这引出一个关键问题:高维空间中的欧氏距离能不能代表数据点之间的真实关系?答案是不能。瑞士卷上相距很远的两个点(比如不同卷层上的两点),在三维欧氏距离下可能比同一卷层上相隔更远的两个点还要近,但它们在"展开后的内在坐标"上其实差得很远。欧氏距离是"穿过卷层"的直线,而我们要的是"沿着卷面"的距离(测地距离)。这就是为什么线性降维方法在流形数据上会失效。

1.2 全局非线性,局部线性——LLE 的核心直觉

Isomap 的解决思路是把测地距离近似成近邻图上的最短路径,然后用经典 MDS 保距离;LLE 则换了一个更巧妙的切入点:全局虽然非线性,但局部可以近似看成线性的

这个直觉非常朴素,你可以拿地球做类比。球面是典型的非线性流形,但你在脚下画一个小圆圈,地面可以当作平面;在小范围内,欧氏几何是成立的。同理,瑞士卷在一个足够小的邻域内,也近似是一块平面上的点。平面片之间怎么拼接、怎么旋转、拉伸,决定了整个流形的几何形状。LLE 做的事,就是先在小邻域内用线性方式刻画几何,再把所有局部信息拼成一个全局的坐标框架。

这里的数学基础是切空间。流形上每个点附近都有一个近似的线性切空间,只要邻域选得足够小,切空间就能很好地逼近流形本身。LLE 不直接去估计切空间基,而是用一种更"懒"的方式——用邻居点的线性组合去重建目标点,把重建权重当作局部几何的编码。每一个点的局部几何特征,都浓缩在它的近邻如何组合出它这个信息里。

1.3 权重为什么能"移植"到低维空间

LLE 最精彩的设计在于:如果流形局部是线性的,那么每个点的局部重建权重在一系列变换下是不变的

具体说,假设高维空间里点 $x_i$ 能被它的邻居 $x_j$ 线性重建,权重是 $w_i$,那么在局部是线性的前提下,把这个邻域整体做平移、旋转、缩放(甚至更一般的线性变换),重建权重不会变。举个例子:你用一个平行四边形去拟合一个点,把这个平行四边形整体旋转 30 度、放大两倍,重心和顶点的相对关系没有变。

因此,如果我们在高维空间算出了一组重建权重 $w_i$,就可以认为这组权重刻画的是数据在流形上的内在几何结构,而不是某个特定坐标系下的产物。接着去低维空间找一组新坐标 $y_i$,让同样的权重能在低维空间也成立——这样找到的低维坐标,自然就保留了高维流形的局部几何。这就是 LLE 的全部核心思想。

2. 三步走:LLE 算法的完整流程与推导

2.1 预处理:初始化与输入输出

LLE 的输入是一个高维数据集 $X = [x_1, x_2, \ldots, x_N]^T \in \mathbb{R}^{N \times D}$,其中 $N$ 是样本数,$D$ 是原始特征维度。输出是低维嵌入 $Y = [y_1, y_2, \ldots, y_N]^T \in \mathbb{R}^{N \times d}$,其中 $d \ll D$ 是目标维度。

在实际操作中,如果 $D$ 很大,比如图像数据直接拉平后可能有几万维,建议先做一次 PCA 把维度降到一个合理的范围(比如 100 维以内)。这不是 LLE 本身的要求,而是出于计算效率和数值稳定性的考虑:在大维度下计算近邻矩阵和局部协方差矩阵,不仅慢,而且容易出现奇异。原论文 LLE 在人脸上实验时,也是先用 PCA 把 4096 维压到约 80 维再做近邻计算的。

另外一个容易忽略的点:如果特征之间的量纲差别很大,比如一列是像素值(0-255),另一列是面积(0-1),欧氏距离会被量纲大的特征主导,近邻结果没有意义。所以做 LLE 前,先做标准化是很常见的操作。

2.2 第一步:寻找每个点的 K 个近邻

对每一个数据点 $x_i$,用欧氏距离在原始空间中找到它的 $K$ 个最近邻居。这看起来不起眼,实际上这一步直接决定后续所有结果的质量。

近邻搜索在数据量小的时候可以直接暴力计算两两距离矩阵:

import numpy as np from sklearn.neighbors import NearestNeighbors def find_neighbors(X, K): # 返回每个点的 K 个近邻索引(不包含自身) nn = NearestNeighbors(n_neighbors=K + 1) nn.fit(X) _, indices = nn.kneighbors(X) return indices[:, 1:] # 去掉自身

注意为什么要 $K+1$:因为每个点自己跟自己距离为 0 一定是最近邻,需要排除。数据量大时可以用KDTreeBallTree加速,但在 $D$ 较高时这些树结构的优势会退化,暴力法反而更稳定。所以实际项目中,如果 $N$ 在一万以下,直接算距离矩阵就够了。

K 的取值直接控制"局部线性"成立的尺度:太小,邻域内没有足够的信息来稳定求解权重,容易对噪声过拟合;太大,邻域跨越了流形的弯曲部分,局部线性假设不再成立,这就是"大 K 导致嵌入结果塌缩"的常见原因。一个经验法则是取K = 2*dK = 10*d之间,但最终要以可视化结果为准。

2.3 第二步:求解局部重建权重

假设每个点都能由其近邻的线性组合来近似:

$$x_i \approx \sum_{j \in \mathcal{N}(i)} w_{ij} x_j$$

权重 $w_{ij}$ 需要满足两个约束:一是归一化约束 $\sum_j w_{ij} = 1$,也就是权重和为 1,确保重建在平移下保持不变;二是当 $j$ 不是 $i$ 的邻居时 $w_{ij} = 0$。

最小化局部重建误差:

$$\min_{w_i} \left| x_i - \sum_{j \in \mathcal{N}(i)} w_{ij} x_j \right|^2 \quad \text{s.t.} \quad \sum_j w_{ij} = 1$$

这个优化问题有闭式解,推导过程放在下一章详细展开。先把结论写在这里:定义局部协方差矩阵

$$G^{(i)}_{jk} = (x_i - x_j)^T (x_i - x_k)$$

则权重可以写成

$$w_{ij} = \frac{\sum_k (G^{(i)})^{-1}{jk}}{\sum{lm} (G^{(i)})^{-1}_{lm}}$$

也就是先求 $G^{(i)}$ 的逆,把每行加起来,再除以所有元素之和做归一化。

这里要注意一个数值问题:当 $K$ 大于局部维度(或者数据有重复)时,$G^{(i)}$ 可能是奇异的。解决手段是对 $G^{(i)}$ 的对角线加一个小正则项:

$$G^{(i)} \gets G^{(i)} + \epsilon \cdot \text{trace}(G^{(i)})/K \cdot I$$

原论文建议 $\epsilon = 10^{-3}$ 这个量级就够。轨迹归一化的好处是让正则项的量级与数据本身的尺度一致,避免不同数据尺度下同一个 $\epsilon$ 效果天差地别。

2.4 第三步:固定权重,求解低维坐标

权重矩阵算出来之后,我们希望找到低维坐标 $Y$,使得重建权重在低维空间中同样能近似成立:

$$\min_{Y} \sum_{i=1}^{N} \left| y_i - \sum_{j \in \mathcal{N}(i)} w_{ij} y_j \right|^2$$

展开这个目标函数:

$$\Phi(Y) = \sum_{i=1}^{N} \left| y_i - \sum_{j=1}^{N} W_{ij} y_j \right|^2 = | Y^T (I - W) |^2_F = \text{tr}\left( Y^T (I-W)^T (I-W) Y \right)$$

定义矩阵 $M = (I-W)^T (I-W)$,目标变成:

$$\min_Y \text{tr}(Y^T M Y) \quad \text{s.t.} \quad Y^T Y = I$$

这个约束对应"嵌入坐标方差为单位阵",目的是消除缩放自由度,防止所有点收敛到原点。加上这个约束后,问题变成一个稀疏特征值问题:最优的 $Y$ 就是 $M$ 的最小的 $d+1$ 个特征值对应的特征向量,去掉最小特征值(为 0)对应的那个特征向量,取接下来 $d$ 个。

为什么去掉最小特征值对应的特征向量?因为 $M$ 的最小特征值为 0,对应的特征向量是全 1 向量(当权重行和归一化时,$(I-W)\mathbf{1} = 0$),代表全局平移,不携带任何结构信息。真正的嵌入信息从第 2 小的特征值开始。

3. 数学细节:重建权重闭式解的推导与特征值问题

3.1 从拉格朗日乘子推导重建权重

这一节是把上一章的结论补上推导过程,既是考试常考点,也能帮助你真正理解为什么权重求解是一个线性问题。

对单个点 $x_i$,设它的邻居集合为 $\mathcal{N}(i)$。为了推导方便,把邻居写成矩阵形式。令 $N_i \in \mathbb{R}^{K \times D}$ 为邻居点组成的矩阵,$w_i \in \mathbb{R}^K$ 是邻居权重。那么重建误差可以写成:

$$\left| x_i - N_i^T w_i \right|^2 = \left| \sum_j w_{ij} (x_i - x_j) \right|^2$$

注意这里用了一个技巧:因为 $\sum_j w_{ij} = 1$,所以 $x_i = \sum_j w_{ij} x_i$,可以减进去。令 $z_j = x_i - x_j$(把邻居相对目标点中心化),则误差项变为:

$$\left| \sum_j w_{ij} z_j \right|^2 = \sum_{j,k} w_{ij} w_{ik} z_j^T z_k = w_i^T G^{(i)} w_i$$

其中 $G^{(i)}_{jk} = z_j^T z_k = (x_i - x_j)^T (x_i - x_k)$。

加上约束 $\mathbf{1}^T w_i = 1$,用拉格朗日乘子法:

$$\mathcal{L} = w_i^T G^{(i)} w_i + \lambda (\mathbf{1}^T w_i - 1)$$

对 $w_i$ 求导并令其为零:

$$2 G^{(i)} w_i + \lambda \mathbf{1} = 0 \Rightarrow w_i = -\frac{\lambda}{2} (G^{(i)})^{-1} \mathbf{1}$$

再利用约束归一化,即可得到上一章的公式:

$$w_i = \frac{(G^{(i)})^{-1} \mathbf{1}}{\mathbf{1}^T (G^{(i)})^{-1} \mathbf{1}}$$

整个推导只需要线性代数的基本知识,没有任何高深的东西。

3.2 特征值问题与平移不变性

回到第二步的矩阵 $M = (I-W)^T (I-W)$。这是一个实对称半正定矩阵,因此特征向量相互正交,特征值非负。对 $M$ 做特征值分解,把特征值从小到大排序,取出第 2 到第 $d+1$ 小的特征值对应的特征向量,拼成 $N \times d$ 的矩阵,就是嵌入结果。

最小特征值为什么是 0?因为 $W$ 的每一行和都是 1,所以 $(I-W)\mathbf{1} = 0$,$\mathbf{1}$ 是零空间中的一个向量。特征向量全 1 对应所有样本在空间里做整体平移,这种自由度不影响样本之间的相对关系,所以需要舍去。

还有一个细节值得注意:我们约束了 $Y^T Y = I$,这会让嵌入结果正交。这意味着 LLE 的输出和 PCA 一样是一组正交坐标,但坐标系的具体方向并不重要,重要的是点与点之间的距离关系。所以对 LLE 的结果做任意旋转,视觉上还是同一片"展开的流形"。

如果你去看一些开源实现,会发现有的代码直接用np.linalg.eigh(M),取特征向量eigvecs[:, 1:d+1]。这是最标准的做法。但要注意eigh返回的特征向量按特征值升序排列,这一点容易踩坑,别取成eigvecs[:, -d:]

3.3 与 PCA、Isomap、t-SNE 的对比

把 LLE 放在降维方法的谱系里看,它的定位会更清楚。

PCA 是线性方法,目标是最大化全局方差,本质上是把数据投影到方差最大的正交方向上。它对全局线性结构有效,但对流形数据无能为力——瑞士卷在 PCA 下就是一坨"摊开的螺旋纸片在平面上的重叠投影"。

Isomap 和 LLE 同属流形学习,但思路不同。Isomap 先构建近邻图,用图上的最短路径近似测地距离,然后做 MDS 保持点对距离。它的全局距离保持属性让它能恢复出流形的整体布局,但在拓扑不稳定(比如近邻图断裂导致"短路")时误差很大,而且需要对所有点对距离做矩阵分解,内存占用是 $O(N^2)$。

t-SNE 是当前可视化领域最流行的工具,它用概率分布对齐的方式建模局部结构,擅长把高维簇结构在二维平面上展开。但 t-SNE 的目标函数是非凸的,每次运行结果可能不同,而且对困惑度(perplexity)参数敏感。相比之下,LLE 是一次特征值分解,结果确定、可复现,更适合作为下游任务的定量输入。

下面是几个核心维度的对比:

方法线性/非线性保持什么计算瓶颈典型适用场景
PCA线性全局方差协方差矩阵分解线性数据、预处理
MDS线性(经典)点对欧氏距离距离矩阵分解保留距离关系
Isomap非线性测地距离最短路径+距离矩阵分解流形结构规整的数据
LLE非线性局部重建权重稀疏特征值分解流形光滑、无大空洞
t-SNE非线性局部概率分布迭代优化可视化

4. 手写 LLE:一份不到 60 行的 NumPy 实现

4.1 核心代码实现

数学推导说完了,直接上代码。下面这份实现基于原论文步骤,除了近邻搜索用了sklearn的接口,其余全部用 NumPy 完成:

import numpy as np from sklearn.neighbors import NearestNeighbors def lle(X, n_components=2, K=12, reg=1e-3): """ 局部线性嵌入 X: (N, D) 高维数据 n_components: 目标维度 K: 近邻个数 reg: 正则化系数 返回: (N, n_components) 低维嵌入 """ N, D = X.shape # Step 1: 找K近邻 nn = NearestNeighbors(n_neighbors=K + 1) nn.fit(X) _, indices = nn.kneighbors(X) indices = indices[:, 1:] # 去掉自己 neighbors = X[indices] # (N, K, D) # Step 2: 求解重建权重 W W = np.zeros((N, N)) for i in range(N): diff = neighbors[i] - X[i] # (K, D), 相当于 z_j G = diff @ diff.T # 局部协方差 (K, K) G += reg * np.trace(G) / K * np.eye(K) # 正则化 w = np.linalg.solve(G, np.ones(K)) # 解线性方程 G w = 1 w = w / w.sum() # 归一化 W[i, indices[i]] = w # Step 3: 构造 M 矩阵并做特征值分解 I = np.eye(N) M = (I - W).T @ (I - W) eigvals, eigvecs = np.linalg.eigh(M) # 跳过最小特征值(平移自由度), 取第2到第d+1个特征向量 Y = eigvecs[:, 1:n_components + 1] return Y

有几个实现细节需要解释:

使用np.linalg.solve而不是np.linalg.inv,因为solve在数值上更稳定、速度也更快。对 $K \times K$ 的小矩阵来说差别不大,但这是个好习惯,数据规模上来后差距就很明显了。

正则化系数要依据数据尺度调节。代码里用np.trace(G) / K来衡量局部协方差的平均量级,再乘上reg,而不是直接加一个固定常数,这样遇到像素值(0-255)和标准化数据(0-1)时,正则化力度更合理。实际调试中如果遇到警告说矩阵奇异,先把 reg 调大试试。

特征向量方向无关紧要eigh输出的特征向量符号是任意的,也就是说不同的运行可能得到镜像翻转的嵌入结果。这不是 bug,因为 LLE 保的是局部结构,反射也是等距变换之一。

4.2 瑞士卷实验:从 3D 到 2D

用经典瑞士卷数据来验证:

from sklearn.datasets import make_swiss_roll X, color = make_swiss_roll(n_samples=1000, noise=0.0, random_state=42) Y = lle(X, n_components=2, K=12) import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 2, figsize=(12, 5)) ax = axes[0].scatter(X[:, 0], X[:, 1], c=color, cmap='Spectral', s=8) axes[0].set_title("Swiss Roll: first two 3D coords") axes[1].scatter(Y[:, 0], Y[:, 1], c=color, cmap='Spectral', s=8) axes[1].set_title("LLE embedding (K=12)") plt.tight_layout() plt.show()

运行后你会看到,LLE 把三维的瑞士卷展开成了一个近似长方形的二维平面,颜色沿着卷的方向平滑渐变。这个结果近似还原了瑞士卷在"展开"前的内在坐标——也就是生成数据时的那张原始平面。作为对比,PCA 的结果会是瑞士卷在二维平面上的投影,颜色混在一起,看不出层次。

之所以说"近似还原",是因为 LLE 本身不保证恢复全局坐标的具体尺度和方向,只能恢复出和原始内在坐标相差一个刚体变换(旋转、平移、缩放)的结果。这个性质在实际问题中已经足够用了。

4.3 如果要用 sklearn 自带封装

理论上你不需要重复造轮子,sklearn.manifold.LocallyLinearEmbedding提供了现成实现,还支持 Modified LLE、Hessian LLE 等变体:

from sklearn.manifold import LocallyLinearEmbedding embedding = LocallyLinearEmbedding(n_components=2, n_neighbors=12) Y = embedding.fit_transform(X)

那为什么还要手写一遍?我的体会是,手写能让你真正理解n_neighborsreg这些参数在内部到底怎么起作用。面试和考试中,让你推导 LLE 权重求解过程、解释为什么跳过最小特征值的题目很常见,没有手写过一遍很难讲得透彻。另外,sklearn 的eigen_solver参数支持'dense''arpack'两种模式,数据量大的时候哪种更快、更稳,只有理解底层逻辑才能判断。

5. 参数选择与实际应用中的坑

5.1 近邻数 K:太小断连,太大失真

K 是 LLE 最重要的超参数,它的影响是两方面的:

K 太小时,邻域范围内信息不足。局部协方差矩阵 $G^{(i)}$ 的秩不够高,求解权重时对噪声极度敏感,一个点的轻微扰动就能改变整个重建结构。更严重的是,邻域图可能不连通——整个数据变成若干个互不相连的子图,这时 LLE 的嵌入结果就是多个互不相关的"碎片",不同子图之间的相对位置没有任何含义。

K 太大时,邻域跨越流形的弯曲区域。局部线性假设被破坏,权重试图用线性组合去拟合一段弯曲面,结果嵌入结果会把远处的点拉近,导致流形结构被"压平"在某些区域,甚至出现全局塌缩成一团的情况。

实操中我一般这样做:先用 K = 2*d(d 是目标维度)作为起点,然后以 2 为步长往上涨,用可视化和重建误差一起判断。有一个辅助指标值得记住:LLE 的重建误差随 K 增大通常是单调下降的,但嵌入质量并非如此,所以不能只看误差,一定要结合可视化结果。数据密度不均匀时,K 的选择会更棘手,这一点下一节细说。

5.2 数据密度不均与噪声:两种棘手情况

LLE 假设每个点邻域内的数据密度是差不多的。如果某些区域点很密、另一些区域点很稀,固定 K 会导致稀疏区域的邻域范围过大,局部线性假设失效;密集区域的邻域范围过小,数值不稳定。改进方案包括:

  • 对密度较低的区域用更大的半径搜索(RadiusNeighbors),但结果对半径参数敏感,而且容易出现孤立点。
  • 先用 OPTICS 或 DBSCAN 分析数据密度分布,针对不同区域设置不同的 K。
  • 直接使用鲁棒性更强的优化变体,比如 Modified LLE 或 Hessian LLE。Modified LLE 用多个局部权重向量代替单一权重向量,对邻域数据点施加更严谨的线性约束,在数据不均匀时表现更好。

噪声是另一个大问题。LLE 对噪声相当敏感,因为在第二步求解权重时,噪声会被"重建"进低维坐标里。原论文建议在计算权重前可以对数据做一个轻微的高斯平滑。如果噪声主要存在于某些特定维度(比如图像背景噪声),先做 PCA 降噪再跑 LLE 通常比直接跑效果更好。

5.3 新样本怎么办:out-of-sample 与增量学习

这是 LLE 在实际工程中最大的痛点:LLE 只能在训练集上计算嵌入,没有显式的映射函数,新样本无法直接获得低维坐标。相比之下 PCA 有投影矩阵,t-SNE 虽然也不能映射新样本,但至少可以把新样本当作"查询点"插入到现有嵌入中。

处理新样本的常见思路有三种:

第一种,把 LLE 当作特征提取步骤,只对训练集做嵌入,然后用嵌入坐标和原始数据训练一个回归模型(比如 KNN 回归)。预测时先找新样本在原始空间的 K 个近邻,用训练好的回归器推断低维坐标。

第二种,在训练集上跑完 LLE 后,用嵌入结果 $Y$ 和原始数据 $X$ 训练一个从高维到低维的映射模型(比如多层感知机或高斯过程回归)。这本质上是"学习 LLE 的逆映射",也被称为参数化 LLE。

第三种,如果数据是流式到达的,可以考虑增量式 LLE 或局部更新的方案:新样本到达时,只更新它邻域覆盖到的点的坐标,其他点保持不变。这种方法在实时系统中能用,但要小心误差累积。

在我做过的实际项目里,如果数据量不大,我通常直接对整个数据集重跑一遍 LLE,反正矩阵分解在几千样本下也就几秒。如果数据量很大或者需要实时响应,我会选第一种方案,训练一个简单的 KNN 回归器,效果比想象中好——因为 LLE 嵌入空间里的坐标本来就是连续变化的,KNN 回归有天然的平滑性。

6. LLE 适合什么场景,不适合什么场景

6.1 图像与人脸数据:流形结构最典型的地方

LLE 最经典的应用案例是人脸数据。不同角度、不同姿态的人脸图像,其内在变化空间就是一个低维流形。在 LLE 论文中,作者在合成人脸数据上做实验,成功恢复了"姿态 + 表情"这两个内在维度:嵌入后的二维平面上,横轴对应水平旋转角度,纵轴对应表情变化,点在平面上形成规则的网格状分布。

这个结果很有启发性,它说明 LLE 能在完全没有标签的情况下,从高维像素数据里恢复出有语义的潜在因子。从这个角度看,LLE 和后来的自编码器、VAE 追求的"解耦表征"有异曲同工之处,只不过 LLE 是非参数方法且只能对训练集做嵌入,而自编码器能泛化到新样本。

图像数据上跑 LLE 时,建议先用 PCA 降到 50-100 维再计算近邻。这不仅是为了速度,更因为高维空间里欧氏距离的区分度会下降(维度灾难),先做 PCA 相当于在保留主要信息的同时去除了无关噪声维度。

6.2 别硬上:稀疏高维数据和分类任务的定位

LLE 也有不少不适合的场景,遇到的时候别硬上。

文本数据或 one-hot 编码后的稀疏高维数据,通常不适合直接用 LLE。稀疏高维空间里的点大部分维度是 0,欧氏距离度量意义有限,而且流形结构往往被大量空维度稀释。文本数据现在的主流做法是用词向量(如 Word2Vec、BERT 嵌入)先做稠密表示,再考虑降维或可视化。

分类任务中,LLE 更适合作为特征提取或可视化步骤,而不是统一的分类器思路。它不考虑类别标签,单纯建模数据的内在几何结构。如果数据不同类别在流形上是相邻的(比如两个类别的边界很模糊),LLE 展开后它们可能还是混在一起,对分类帮助有限。如果你的目标是分类准确率,监督降维方法(如 LDA)通常更直接。

还要注意一点:LLE 对"流形光滑性"有隐含假设。如果数据所在流形有空洞、断裂或者尖锐的折痕,近邻关系会穿过空洞或跨越折痕,导致嵌入结果严重失真。这时候可以先用可视化工具检查数据是否是"块状"的。块状结构适合 t-SNE,光滑流形结构适合 LLE,两者之间没有谁取代谁的关系。

最后分享一个我自己的习惯:面对一套高维数据,我通常先跑一次 PCA 看方差分布,再用 t-SNE 快速看聚类结构,如果发现数据有明显的连续流形变化(比如沿某个轴渐变、旋转、姿态变化),再用 LLE 或其变体去刻画面向下去任务的低维表示。不同方法在各自的适用场景下表现都不差,关键不是选"最好的算法",而是选"最匹配数据结构和任务目标"的算法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 3:45:23

python的图论工业场景模拟第一百三十二篇:动态物料分配与通道失效韧性分析,任务:模拟通道随机失效,追踪最大流衰减输出韧性报告,图建模说明:动态有向图,删边与最大流迭代,核心点:动态失效韧性仿真。

⚠️ 前置说明:本篇是“网络流问题(第 7 章)”的韧性工程篇。核心目标是:在最大流算完之后,模拟传送带/管路/通信链路随机失效,观察最大流怎么掉、掉多少、掉在哪,输出一份“系统抗打击能力”报…

作者头像 李华
网站建设 2026/9/12 3:43:42

Smart Form跨系统传输与俄语多语言落地实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 3:38:44

AI时代失去顶层设计扶持,个人如何构建微支持系统

这两天在一个业内小圈子里,看到有人转发“天辛大师对话尤瓦尔赫拉利”的纪要和评论,标题那句“很遗憾,失去顶层设计扶持的我们”确实扎眼。我看完第一反应是:这不是又一场“大师聊未来”的鸡汤局,而是在说一个我们这代…

作者头像 李华