机器学习非线性降维:局部线性嵌入 LLE

机器学习非线性降维:局部线性嵌入 LLE(超通俗完整版)

当数据是卷曲、折叠、扭曲的非线性流形 (比如瑞士卷、双月形)时,PCA 这类线性方法完全失效,而 LLE(局部线性嵌入) 就是专门用来"展开流形"的经典非线性降维算法。

它的核心非常简单:只保局部,不管全局;局部拉直,整体铺平

这篇文章用大白话 + 原理拆解 + 完整代码 + 面试总结,把 LLE 讲得通俗易懂,本科生、研究生都能轻松掌握。


一、先看懂:LLE 到底在做什么?

1. 一句话理解 LLE

LLE = 保留局部邻居关系 → 把弯曲的流形在低维空间"拉直铺平"

它不关心全局距离,只保证:

  • 每个点在高维里能被邻居线性拼出来
  • 到低维后,同样的权重还能把它拼出来

2. 超通俗例子:瑞士卷蛋糕

  • 高维:卷成一团,直线距离骗人
  • LLE:找到每个点附近的小伙伴
  • 低维:直接把卷铺平,邻居关系完全不变

3. LLE 三大步(永远记住)

  1. 找邻居:每个点找最近的 K 个小伙伴
  2. 算权重:用邻居线性拼成自己,求出权重
  3. 嵌低维:保持权重不变,放到 2D/3D 平面

二、LLE 核心思想(极简版)

很小的局部区域 ,再复杂的曲面也可以近似成平面

LLE 就是利用这一点:

  • 高维算局部权重
  • 低维保持权重不变
  • 自动把流形展开

三、LLE 算法三步彻底讲透

第一步:找邻居(K近邻)

对每个点 xix_ixi,找出距离最近的 K 个点。

  • K 太小:结构碎掉
  • K 太大:变成全局,拉不平流形
  • 常用:5~20

第二步:线性重构(求权重)

目标:用邻居的线性组合,完美重建中心点
min⁡∥xi−∑jwijxj∥2\min \left\| x_i - \sum_j w_{ij}x_j \right\|^2min xi−∑jwijxj 2

约束:所有权重加起来 = 1
∑jwij=1\sum_j w_{ij} = 1∑jwij=1

这一步算出的 wijw_{ij}wij就是局部几何的指纹

第三步:全局嵌入(低维展开)

固定权重不变,让低维点 yiy_iyi 也满足同样的重建关系:
min⁡∑i∥yi−∑jwijyj∥2\min \sum_i \left\| y_i - \sum_j w_{ij}y_j \right\|^2min∑i yi−∑jwijyj 2

最后转化为稀疏矩阵特征分解,取最小非零特征向量,得到低维坐标。


四、LLE 标准算法流程(背诵版)

输入:数据 X、邻居数 K、目标维度 d

  1. 对每个点找 K 近邻
  2. 计算局部重建权重 W
  3. 构造矩阵 M=(I−W)T(I−W)M = (I−W)ᵀ(I−W)M=(I−W)T(I−W)
  4. 对 M 做特征分解
  5. 最小的 d 个非零特征向量 作为低维嵌入
    输出:展开后的低维坐标 Y

五、实战代码:瑞士卷 LLE 降维(可直接运行)

我们用最经典的 Swiss Roll 数据集,完整演示 LLE 降维、可视化、参数调优、对比效果。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from sklearn.datasets import make_swiss_roll
from sklearn.manifold import LocallyLinearEmbedding
from sklearn.preprocessing import StandardScaler

# ====================== 1. 生成 3D 瑞士卷数据 ======================
np.random.seed(42)
X, color = make_swiss_roll(n_samples=3000, noise=0.25)
color = color / np.max(color)

# 绘制原始 3D 数据
fig = plt.figure(figsize=(10,7))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X[:,0], X[:,1], X[:,2], c=color, cmap=cm.plasma, s=20, alpha=0.8)
ax.set_title('原始 3D 瑞士卷数据')
plt.show()

# ====================== 2. 数据标准化 ======================
X_scaled = StandardScaler().fit_transform(X)

# ====================== 3. LLE 降维 ======================
# 标准 LLE
lle = LocallyLinearEmbedding(
    n_components=2,
    n_neighbors=12,
    method='standard',
    random_state=42
)
X_lle = lle.fit_transform(X_scaled)

# 绘制降维结果
plt.figure(figsize=(9,6))
plt.scatter(X_lle[:,0], X_lle[:,1], c=color, cmap=cm.plasma, s=30, alpha=0.8)
plt.title('LLE 降维结果(k=12)')
plt.grid(alpha=0.3)
plt.show()

# ====================== 4. 不同 K 值对比 ======================
k_list = [5, 12, 20]
plt.figure(figsize=(18,5))
for i,k in enumerate(k_list):
    lle_tmp = LocallyLinearEmbedding(n_components=2, n_neighbors=k)
    X_tmp = lle_tmp.fit_transform(X_scaled)
    plt.subplot(1,3,i+1)
    plt.scatter(X_tmp[:,0], X_tmp[:,1], c=color, cmap=cm.plasma, s=20, alpha=0.7)
    plt.title(f'K={k}')
plt.suptitle('不同邻居数 K 对 LLE 效果的影响')
plt.show()

# ====================== 5. 优化版 Modified LLE ======================
lle_mod = LocallyLinearEmbedding(
    n_components=2,
    n_neighbors=15,
    method='modified',
    reg=0.05,
    random_state=42
)
X_mod = lle_mod.fit_transform(X_scaled)

plt.figure(figsize=(9,6))
plt.scatter(X_mod[:,0], X_mod[:,1], c=color, cmap=cm.plasma, s=30, alpha=0.8)
plt.title('优化版 Modified LLE 降维结果')
plt.grid(alpha=0.3)
plt.show()

运行结果说明

  • K 太小:局部断裂
  • K 太大:全局扭曲
  • 标准 LLE:可能出现小畸变
  • Modified LLE:加正则化,展开更平滑

六、LLE 优缺点(面试高频)

✅ 优点

  1. 完美展开非线性流形:瑞士卷、螺旋、环形都能搞定
  2. 强局部保持:邻居关系纹丝不动
  3. 无迭代、无局部最优:一步特征分解出结果
  4. 几何直观:思路简单,教学必讲

❌ 缺点

  1. 计算量大:KNN + 特征分解,大数据很慢
  2. 对噪声/异常值敏感
  3. K 值非常关键,难调
  4. 不保全局结构/距离
  5. 只适用于流形数据,不是通用降维

七、LLE vs 主流降维算法(超级对比)

算法 核心思想 保留结构 复杂度 适用场景
PCA 方差最大 全局线性 线性快速降维
LLE 局部线性重构 局部流形 展开卷曲流形
Isomap 测地距离+MDS 全局距离 保距离、中小数据
t-SNE 概率近邻 局部聚类 可视化聚类
UMAP 拓扑图嵌入 全局+局部 大数据通用

八、什么时候用 LLE?什么时候不用?

✅ 推荐用 LLE

  • 数据是明显的低维流形(瑞士卷、螺旋、曲面)
  • 重点要保留局部结构
  • 样本量几千以内
  • 需要把弯曲数据展开铺平

❌ 不推荐用 LLE

  • 数据万级以上 → 用 UMAP
  • 噪声很多 → 用 t-SNE/UMAP
  • 需要保全局距离 → 用 Isomap
  • 线性数据 → 用 PCA
  • 要高速、可扩展 → 用 UMAP

九、LLE 使用必知技巧

  1. K 一定要调:5~20 之间试
  2. 数据必须标准化
  3. 矩阵奇异时加正则化(reg)
  4. 推荐用 Modified LLE 更稳定
  5. 大数据先用 PCA 预降维

十、总结(一句话记住 LLE)

LLE 是"局部拉直、全局铺平"的流形降维神器,通过保持局部线性重构关系,完美展开瑞士卷等非线性数据,是机器学习非线性降维的经典代表算法。

相关推荐
lUie INGA2 小时前
rust web框架actix和axum比较
前端·人工智能·rust
新缸中之脑2 小时前
HDRI-Generator: 环境贴图生成AI
人工智能·贴图
网安情报局2 小时前
企业押注Agentic SOC:AI重塑安全运营新范式
人工智能·网络安全
夜幕下的ACM之路2 小时前
一、基础知识学习(Transformer + 上下文窗口 + Token 计算 + Embedding 向量)
人工智能·学习·transformer·embedding
东离与糖宝2 小时前
LangChain4j vs Spring AI:最新对比,Java企业级Agent开发
java·人工智能
私人珍藏库2 小时前
[Windows] 绘画工具 Krita v5.3.1
人工智能·windows·媒体·工具·软件·多功能
前端摸鱼匠2 小时前
【AI大模型春招面试题13】残差连接(Residual Connection)与层归一化(Layer Norm)在Transformer中的作用?
人工智能·深度学习·语言模型·面试·transformer·求职招聘
重生之我要成为代码大佬2 小时前
HuggingFace生态实战:从模型应用到高效微调
人工智能·python·大模型·huggingface·模型微调