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

张开发
2026/4/3 6:01:35 15 分钟阅读
机器学习非线性降维:局部线性嵌入 LLE
机器学习非线性降维局部线性嵌入 LLE超通俗完整版当数据是卷曲、折叠、扭曲的非线性流形比如瑞士卷、双月形时PCA 这类线性方法完全失效而LLE局部线性嵌入就是专门用来“展开流形”的经典非线性降维算法。它的核心非常简单只保局部不管全局局部拉直整体铺平。这篇文章用大白话 原理拆解 完整代码 面试总结把 LLE 讲得通俗易懂本科生、研究生都能轻松掌握。一、先看懂LLE 到底在做什么1. 一句话理解 LLELLE 保留局部邻居关系 → 把弯曲的流形在低维空间“拉直铺平”它不关心全局距离只保证每个点在高维里能被邻居线性拼出来到低维后同样的权重还能把它拼出来2. 超通俗例子瑞士卷蛋糕高维卷成一团直线距离骗人LLE找到每个点附近的小伙伴低维直接把卷铺平邻居关系完全不变3. LLE 三大步永远记住找邻居每个点找最近的 K 个小伙伴算权重用邻居线性拼成自己求出权重嵌低维保持权重不变放到 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​−∑j​wij​xj​​2约束所有权重加起来 1∑jwij1\sum_j w_{ij} 1∑j​wij​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​−∑j​wij​yj​​2最后转化为稀疏矩阵特征分解取最小非零特征向量得到低维坐标。四、LLE 标准算法流程背诵版输入数据 X、邻居数 K、目标维度 d对每个点找 K 近邻计算局部重建权重 W构造矩阵M(I−W)T(I−W)M (I−W)ᵀ(I−W)M(I−W)T(I−W)对 M 做特征分解取最小的 d 个非零特征向量作为低维嵌入输出展开后的低维坐标 Y五、实战代码瑞士卷 LLE 降维可直接运行我们用最经典的Swiss Roll数据集完整演示 LLE 降维、可视化、参数调优、对比效果。importnumpyasnpimportmatplotlib.pyplotaspltfrommatplotlibimportcmfromsklearn.datasetsimportmake_swiss_rollfromsklearn.manifoldimportLocallyLinearEmbeddingfromsklearn.preprocessingimportStandardScaler# 1. 生成 3D 瑞士卷数据 np.random.seed(42)X,colormake_swiss_roll(n_samples3000,noise0.25)colorcolor/np.max(color)# 绘制原始 3D 数据figplt.figure(figsize(10,7))axfig.add_subplot(111,projection3d)ax.scatter(X[:,0],X[:,1],X[:,2],ccolor,cmapcm.plasma,s20,alpha0.8)ax.set_title(原始 3D 瑞士卷数据)plt.show()# 2. 数据标准化 X_scaledStandardScaler().fit_transform(X)# 3. LLE 降维 # 标准 LLElleLocallyLinearEmbedding(n_components2,n_neighbors12,methodstandard,random_state42)X_llelle.fit_transform(X_scaled)# 绘制降维结果plt.figure(figsize(9,6))plt.scatter(X_lle[:,0],X_lle[:,1],ccolor,cmapcm.plasma,s30,alpha0.8)plt.title(LLE 降维结果k12)plt.grid(alpha0.3)plt.show()# 4. 不同 K 值对比 k_list[5,12,20]plt.figure(figsize(18,5))fori,kinenumerate(k_list):lle_tmpLocallyLinearEmbedding(n_components2,n_neighborsk)X_tmplle_tmp.fit_transform(X_scaled)plt.subplot(1,3,i1)plt.scatter(X_tmp[:,0],X_tmp[:,1],ccolor,cmapcm.plasma,s20,alpha0.7)plt.title(fK{k})plt.suptitle(不同邻居数 K 对 LLE 效果的影响)plt.show()# 5. 优化版 Modified LLE lle_modLocallyLinearEmbedding(n_components2,n_neighbors15,methodmodified,reg0.05,random_state42)X_modlle_mod.fit_transform(X_scaled)plt.figure(figsize(9,6))plt.scatter(X_mod[:,0],X_mod[:,1],ccolor,cmapcm.plasma,s30,alpha0.8)plt.title(优化版 Modified LLE 降维结果)plt.grid(alpha0.3)plt.show()运行结果说明K 太小局部断裂K 太大全局扭曲标准 LLE可能出现小畸变Modified LLE加正则化展开更平滑六、LLE 优缺点面试高频✅ 优点完美展开非线性流形瑞士卷、螺旋、环形都能搞定强局部保持邻居关系纹丝不动无迭代、无局部最优一步特征分解出结果几何直观思路简单教学必讲❌ 缺点计算量大KNN 特征分解大数据很慢对噪声/异常值敏感K 值非常关键难调不保全局结构/距离只适用于流形数据不是通用降维七、LLE vs 主流降维算法超级对比算法核心思想保留结构复杂度适用场景PCA方差最大全局线性低线性快速降维LLE局部线性重构局部流形高展开卷曲流形Isomap测地距离MDS全局距离高保距离、中小数据t-SNE概率近邻局部聚类高可视化聚类UMAP拓扑图嵌入全局局部低大数据通用八、什么时候用 LLE什么时候不用✅ 推荐用 LLE数据是明显的低维流形瑞士卷、螺旋、曲面重点要保留局部结构样本量几千以内需要把弯曲数据展开铺平❌ 不推荐用 LLE数据万级以上→ 用 UMAP噪声很多 → 用 t-SNE/UMAP需要保全局距离→ 用 Isomap线性数据 → 用 PCA要高速、可扩展 → 用 UMAP九、LLE 使用必知技巧K 一定要调5~20 之间试数据必须标准化矩阵奇异时加正则化reg推荐用Modified LLE更稳定大数据先用 PCA 预降维十、总结一句话记住 LLELLE 是“局部拉直、全局铺平”的流形降维神器通过保持局部线性重构关系完美展开瑞士卷等非线性数据是机器学习非线性降维的经典代表算法。

更多文章